#include "graph.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "seaset.h" #include "utils.h" static char *xZoomPix[] = { "16 16 2 1", " c None", "X c #000000", " ", " ", " X X ", " XX XX ", " XX XX ", " XX XX ", " XX XX ", " XX XX ", " XX XX ", " XX XX ", " XX XX ", " XX XX ", " XX XX ", " X X ", " ", " " }; static char *leftPix[] = { "16 16 2 1", " c None", "X c #000000", " ", " ", " X ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " X ", " ", " " }; static char *rightPix[] = { "16 16 2 1", " c None", "X c #000000", " ", " ", " X ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " XX ", " X ", " ", " " }; static char *undoPix[] = { "16 16 2 1", " c None", "X c #000000", " ", " XXXXXXXXX ", " XX ", " XX ", " X ", " X ", " X ", " X X ", " XX XX ", " XX XX ", " XXXXXXXXXXXX ", " XX ", " XX ", " X ", " ", " " }; Graph::Graph(const char* arg, QWidget *parent, long range) : QWidget(parent, 0) { QPixmap pmOut((const char **)xZoomPix); QPixmap pmLeft((const char **)leftPix); QPixmap pmRight((const char **)rightPix); QPixmap pmUndo((const char **)undoPix); QString str; //QHBox *buttonBar; QPushButton* buttonOk; QPushButton* buttonAll; QPushButton* buttonUndo; QPushButton* buttonLeft; QPushButton* buttonOut; QPushButton* buttonRight; QPushButton* buttonSettings; QPushButton* buttonXY; QSplitter *graphSplit; QVBoxLayout* graphLayout; QHBoxLayout* buttonLayout; int w,h; const char * vars; setName("Graph"); graphLayout = new QVBoxLayout(this, 0, 0, "graphLayout"); graphSplit = new QSplitter(Qt::Vertical, this, "splitter"); graphLayout->add(graphSplit); buttonLayout = new QHBoxLayout(0, 6, 2, "buttonBar"); graphLayout->addLayout(buttonLayout); buttonLayout->addWidget(new QLabel("Range", this)); lineEditRange = new QComboBox(true, this); //SetLength(lineEditRange, 5, 6); buttonLayout->addWidget(lineEditRange); QToolTip::add(lineEditRange, "enter a number and m,h or d"); buttonOk = new QPushButton(this); buttonOk->setDefault(true); buttonOk->setText("OK"); ShrinkButton(buttonOk); buttonLayout->addWidget(buttonOk); buttonSettings = new QPushButton(this); buttonSettings->setText("Settings"); ShrinkButton(buttonSettings); buttonLayout->addWidget(buttonSettings); QToolTip::add(buttonSettings, "edit shown curves"); buttonAll = new QPushButton(this); buttonAll->setText("Show All"); ShrinkButton(buttonAll); buttonLayout->addWidget(buttonAll); QToolTip::add(buttonAll, "show all curves"); buttonXY = new QPushButton(this); buttonXY->setText("export"); ShrinkButton(buttonXY); buttonLayout->addWidget(buttonXY); QToolTip::add(buttonXY, "export data"); liveBox = new QCheckBox(this); liveBox->setText("live mode"); buttonLayout->addWidget(liveBox); liveBox->setChecked(false); buttonLayout->addStretch(1); buttonUndo = new QPushButton(this); buttonUndo->setPixmap(pmUndo); w = QMAX(22, buttonUndo->sizeHint().width() - 6); h = QMAX(22, buttonUndo->sizeHint().height() - 6); if (w > h) { // Mac like h += 6; w -= 6; } buttonUndo->setFixedSize(w, h); buttonLayout->addWidget(buttonUndo); buttonUndo->setEnabled(false); QToolTip::add(buttonUndo, "undo zoom or shift action"); buttonLeft = new QPushButton(this); buttonLeft->setPixmap(pmLeft); buttonLeft->setFixedSize(w, h); buttonLayout->addWidget(buttonLeft); QToolTip::add(buttonLeft, "scroll left"); buttonRight = new QPushButton(this); buttonRight->setPixmap(pmRight); buttonRight->setFixedSize(w, h); buttonLayout->addWidget(buttonRight); QToolTip::add(buttonRight, "scroll right"); buttonOut = new QPushButton(this); buttonOut->setPixmap(pmOut); buttonOut->setFixedSize(w, h); buttonLayout->addWidget(buttonOut); QToolTip::add(buttonOut, "zoom out horizontally"); str="Sea "; str.append(arg); topLevelWidget()->setCaption(str); clearWState(WState_Polished); unit='m'; str="30m"; set = new SeaSet(graphSplit, range, "seaset"); const char *items[]={ "1m","2m","5m","10m","15m","30m" ,"1h","2h","4h","8h","16h" ,"1d","2d","4d","8d",0}; lineEditRange->insertStrList(items); lineEditRange->setSizeLimit(15); lineEditRange->setMaxCount(15); lineEditRange->setEditText(str); lineEditRange->lineEdit()->selectAll(); connect(lineEditRange, SIGNAL(activated(int)), this, SLOT(activateRange())); connect(buttonOk, SIGNAL(clicked()), this, SLOT(activateRange())); connect(buttonAll, SIGNAL(clicked()), set, SLOT(showAll())); connect(buttonSettings, SIGNAL(clicked()), this, SIGNAL(gotoSettings())); connect(buttonXY, SIGNAL(clicked()), this, SIGNAL(openExport())); connect(buttonUndo, SIGNAL(clicked()), set, SLOT(undoZoom())); connect(buttonLeft, SIGNAL(clicked()), set, SLOT(shiftLeft())); connect(buttonOut, SIGNAL(clicked()), set, SLOT(zoomOutX())); connect(buttonRight, SIGNAL(clicked()), set, SLOT(shiftRight())); connect(liveBox, SIGNAL(toggled(bool)), set, SLOT(setLive(bool))); connect(set, SIGNAL(undoEnabled(bool)), buttonUndo, SLOT(setEnabled(bool))); connect(lineEditRange->lineEdit(), SIGNAL(textChanged(const QString &)), this, SLOT(autoReturn(const QString &))); set->setHost(arg); if (printit()) { printf("reading curve list,\n"); } if (range < 365*24*3600) { vars = "now"; } else { vars = NULL; } set->autoCurves(vars); if (printit()) { printf("opening window.\n"); } //lineEditRange->selectAll(); QTimer *timer = new QTimer(this, "repeat"); connect(timer, SIGNAL(timeout()), this, SLOT(liveUpdate())); timer->start(2500); } void Graph::liveUpdate() { if (isShown() && width() > 3) { set->liveUpdate(); } } void Graph::showIt(bool yes) { if (yes) { set->liveUpdate(); show(); } else { hide(); } } void Graph::activateRange() { long fact; QString t; double rng; unsigned int j; //setFocus(); t = lineEditRange->currentText(); for (j = 0; j < t.length(); j++) { if (t[j] > '9') { unit = t.latin1()[j]; t.truncate(j); break; } } switch (unit) { case 'D': unit='d'; case 'd': fact = 24*3600; break; case 'H': unit='h'; case 'h': fact = 3600; break; case 'M': unit='m'; case 'm': fact = 60; break; case 'S': unit='s'; case 's': fact = 1; break; default: fact = 60; unit = 'm'; } rng = t.toDouble() * fact; //printf("%s %lf %ld\n", t.latin1(), rng, fact); if (rng > SEA_MAX_RANGE) { unit = 'd'; t.sprintf("%d%c", (SEA_MAX_RANGE + 36000) / 24 / 3600, unit); lineEditRange->setEditText(t); rng = SEA_MAX_RANGE; } else if (rng < 59.5) { rng = 60; if (unit == 's') { lineEditRange->setEditText("60s"); } else { unit = 'm'; lineEditRange->setEditText("1m"); } } else { t.append(unit); lineEditRange->setEditText(t); } set->rescaleRange(long(rng)); lineEditRange->lineEdit()->selectAll(); } void Graph::autoReturn(const QString &text) { if (0 == text.find(QRegExp("\\d{1,4}[DdHhMmSs]"))) { activateRange(); } else if (0 == text.find(QRegExp("[Qq]"))) { exit(0); } }