#include "tab.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include enum {GRAPH, SETTINGS, DEVICE, COMMAND}; void Tab::checkSplit(SplitNo splitNo) { assert(widgetno == splitNo); widgetno++; } //Tab::Tab(const char* instr, QWidget *parent, long range, const char *warning) // : QDialog(parent, "tab", false, Qt::WType_TopLevel | Qt::WStyle_Minimize) Tab::Tab(const char* instr, QWidget *parent, long range, const char *warning) : QMainWindow(parent, "tab", Qt::WType_TopLevel | Qt::WStyle_Minimize) { //QBoxLayout *vbox; QApplication::style().polish(this); actFocus = -1; //vbox = new QVBoxLayout(this, 0, 0, "vbx"); split = new QSplitter(Qt::Horizontal, this); setCentralWidget(split); //vbox->addWidget(split); widgetno = 0; leftWidgetNo = graph_split; rightWidgetNo = right_split; graph = new Graph(instr, split, range); if (graph->set == NULL) { graph = NULL; return; } checkSplit(graph_split); graph->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding, 1, 1)); connect(graph, SIGNAL(gotoSettings()), this, SLOT(gotoSettings())); settings = new Settings(split); settings->set = graph->set; connect(settings, SIGNAL(leaveSettings()), this, SLOT(leaveSettings())); settings->hide(); checkSplit(settings_split); rightSplit = new QSplitter(Qt::Vertical, split, "rightSplit"); rightSplit->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding, 1, 1)); checkSplit(right_split); if (warning[0]) { foreignwarn = new QVBox(rightSplit); warnlabel = new QLabel(warning, foreignwarn); showparbutton = new QPushButton("show parameters", foreignwarn); QSize siz = foreignwarn->minimumSizeHint(); foreignwarn->setFixedHeight(siz.height()); warnlabel->setEraseColor(QColor(255,127,0)); } device = new Device(rightSplit); if (warning[0]) { device->hide(); connect(showparbutton, SIGNAL(clicked()), this, SLOT(showPars())); } command = new Command(rightSplit, "Command", graph->set->uc); connect(command->cmd, SIGNAL(returnPressed()), device, SLOT(update())); connect(command, SIGNAL(activate()), device, SLOT(activate())); device->init(command, graph->set); QTimer *timer = new QTimer(this, "repeat"); connect(timer, SIGNAL(timeout()), this, SLOT(handler())); timer->start(100); setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); exportXY = new Export(graph->set, split, instr); exportXY->hide(); exportXY->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding, 1, 1)); connect(exportXY, SIGNAL(finish()), this, SLOT(finishExport())); connect(graph, SIGNAL(openExport()), this, SLOT(openExport())); connect(graph->set, SIGNAL(updateCurveList()), exportXY, SLOT(updateCurveList())); checkSplit(export_split); report = new Report(split, graph->set->ec); report->hide(); checkSplit(report_split); connect(report, SIGNAL(leave()), this, SLOT(leaveReport())); connect(report, SIGNAL(openMe()), this, SLOT(openReport())); message = new QLabel(split); message->hide(); for (int i = 0; i < 2 * 3; i++) { oldSizes[i] = 0; } } bool Tab::shown(QWidget *w) { return w->isShown() && w->width() > 3 && w->height() > 3; } void Tab::showPars() { QValueList splitsizes; int h; showparbutton->hide(); QSize siz = warnlabel->minimumSizeHint(); foreignwarn->setFixedHeight(siz.height()); device->show(); splitsizes = rightSplit->sizes(); h = (splitsizes[1] + splitsizes[2]) / 2; splitsizes[1] = h; splitsizes[2] = h; rightSplit->setSizes(splitsizes); device->update(); } bool Tab::splitChange(SplitNo splitNo) { int lw = 0, rw = 0; int i; int tot; float s; sizes = split->sizes(); lw = sizes[leftWidgetNo]; rw = sizes[rightWidgetNo]; i = leftWidgetNo + 2 * (rightWidgetNo - right_split); if (splitNo < right_split) { if (splitNo == leftWidgetNo) return FALSE; leftWidgetNo = splitNo; } else { if (splitNo == rightWidgetNo) return FALSE; rightWidgetNo = splitNo; } tot = lw + rw; if (rw > 1 && lw > 1) { oldSizes[i] = lw / float(tot); } s = oldSizes[leftWidgetNo + 2 * (rightWidgetNo - right_split)]; if (s != 0) { lw = s * tot + 0.5; rw = tot - lw; } for (i = 0; i < n_split; i++) { sizes[i] = 0; } sizes[leftWidgetNo] = lw; sizes[rightWidgetNo] = rw; return TRUE; } void Tab::gotoSettings() { if (splitChange(settings_split)) { graph->showIt(false); settings->showIt(true); split->setSizes(sizes); } } void Tab::leaveSettings() { if (splitChange(graph_split)) { settings->showIt(false); graph->showIt(true); } split->setSizes(sizes); } void Tab::openExport() { if (splitChange(export_split)) { rightSplit->hide(); exportXY->showMe(); split->setSizes(sizes); } } void Tab::finishExport() { if (splitChange(right_split)) { exportXY->hide(); rightSplit->show(); split->setSizes(sizes); } } void Tab::openReport() { if (splitChange(report_split)) { rightSplit->hide(); report->show(); split->setSizes(sizes); } } void Tab::leaveReport() { if (splitChange(right_split)) { report->hide(); rightSplit->show(); split->setSizes(sizes); } } void Tab::sleep(const char *text) { graph->hide(); rightSplit->hide(); message->setText(text); message->show(); } void Tab::wake() { graph->show(); rightSplit->show(); exportXY->hide(); report->hide(); message->hide(); graph->set->sc->disconnect(); graph->set->uc->disconnect(); graph->set->gc->disconnect(); graph->set->ec->disconnect(); graph->set->sc->reconnect(); /* uc is connected automatically with sc */ graph->set->gc->reconnect(); graph->set->ec->reconnect(); } void Tab::initSize(int w, int h) { QSize qs = QSize(w, h).expandedTo(split->minimumSizeHint()); resize(qs); sizes = split->sizes(); sizes[0] = w/2; sizes[2] = w/2; split->setSizes(sizes); } void Tab::handler() { command->handler(); if (shown(command) && command->cmd->hasFocus()) { actFocus = COMMAND; } if (shown(graph) && graph->lineEditRange->hasFocus()) { actFocus = GRAPH; } if (!shown(settings) && !shown(device)) { if (actFocus == COMMAND) { command->cmd->setFocus(); } else { if (!graph->lineEditRange->hasFocus()) { graph->lineEditRange->setFocus(); graph->lineEditRange->lineEdit()->selectAll(); } } } } void Tab::resizeEvent(QResizeEvent *e) { //QDialog::resizeEvent(e); QMainWindow::resizeEvent(e); }