183 lines
4.2 KiB
C++
183 lines
4.2 KiB
C++
#include "report.h"
|
|
#include <stddef.h>
|
|
#include <qlayout.h>
|
|
#include <qdatetime.h>
|
|
#include <qcolor.h>
|
|
|
|
Report::Report(QWidget *parent, SicsConnection *conn) : QWidget(parent, "report")
|
|
{
|
|
QVBoxLayout *vbox = new QVBoxLayout(this, 0, 0, "report_vbox");
|
|
QHBoxLayout *hdr = new QHBoxLayout(0, 3, 3, "report_hdr");
|
|
|
|
this->conn = conn;
|
|
|
|
editButton = new QPushButton("edit", this);
|
|
hdr->addWidget(editButton);
|
|
|
|
varEdit = new QLineEdit("tt.main", this);
|
|
hdr->addWidget(varEdit);
|
|
|
|
leaveButton = new QPushButton("close", this);
|
|
hdr->addWidget(leaveButton);
|
|
|
|
vbox->addLayout(hdr);
|
|
|
|
textedit = new MyTextEdit(this, "report_edit");
|
|
textedit->setReadOnly(TRUE);
|
|
textedit->setSelectionAttributes(1, QColor(255,255,128), FALSE);
|
|
|
|
vbox->addWidget(textedit, 1);
|
|
|
|
timer = new QTimer(this, "reportTimer");
|
|
|
|
connect(leaveButton, SIGNAL(clicked()), this, SIGNAL(leave()));
|
|
connect(editButton, SIGNAL(clicked()), this, SLOT(editReport()));
|
|
connect(timer, SIGNAL(timeout()), this, SLOT(updatePos()));
|
|
|
|
}
|
|
|
|
void Report::gotoTime(time_t from, time_t at, time_t to, bool silent) {
|
|
char cmd[128];
|
|
int iret;
|
|
QString line;
|
|
time_t lastRead, t, dt;
|
|
bool ok;
|
|
QString message;
|
|
QDateTime datim;
|
|
int l;
|
|
int p;
|
|
|
|
if (isHidden()) {
|
|
if (silent) return;
|
|
openMe();
|
|
}
|
|
if (variable != varEdit->text() || from != this->from || to != this->to) {
|
|
|
|
this->to = to;
|
|
this->from = from;
|
|
times.clear();
|
|
|
|
variable = varEdit->text();
|
|
snprintf(cmd, sizeof cmd, "graph %ld %ld text np %ld %s",
|
|
from, to, to - from, variable.latin1());
|
|
|
|
textedit->clear();
|
|
conn->command(cmd);
|
|
|
|
iret = conn->getLine(line);
|
|
if (iret <= 0) {
|
|
message = ("can not get response 1");
|
|
goto err;
|
|
}
|
|
|
|
/* get returned absolute time */
|
|
lastRead = line.toLong();
|
|
|
|
iret = conn->getLine(line);
|
|
if (iret <= 0) {
|
|
message = "can not get response 2";
|
|
goto err;
|
|
}
|
|
|
|
if (!line.startsWith("*" + variable)) {
|
|
message = "response '" + line + "' must start with '*" + variable + "'";
|
|
goto err;
|
|
}
|
|
|
|
t = 0;
|
|
for (;;) {
|
|
iret = conn->getLine(line);
|
|
if (iret <= 0) {
|
|
message = "can not get line";
|
|
goto err;
|
|
}
|
|
//printf("> %s\n", line.latin1());
|
|
if (line.startsWith("*")) {
|
|
break;
|
|
}
|
|
dt = line.section(' ', 0, 0).toLong(&ok);
|
|
if (!ok) {
|
|
message = "bad timestep";
|
|
goto err;
|
|
}
|
|
t += dt;
|
|
times.append(t);
|
|
datim.setTime_t(t);
|
|
textedit->appendHtml("<font color=#00FF00>" + datim.toString("hh:mm:ss ") + "</font>");
|
|
textedit->appendText(
|
|
line.section(' ', 1).replace("\\n","\n").replace("\\t","\t").replace("\\\\","\\")
|
|
+"\n"
|
|
);
|
|
}
|
|
textedit->append("\n");
|
|
pos = -1;
|
|
}
|
|
l = times.count();
|
|
|
|
p = l - 1;
|
|
for (int ipos = 0; ipos < l; ipos++) {
|
|
if (times[ipos] >= at) {
|
|
p = ipos - 1;
|
|
break;
|
|
}
|
|
}
|
|
if (p < 0) p = 0;
|
|
if (pos < 0) {
|
|
pos = l;
|
|
}
|
|
setCursorPos(p);
|
|
timer->start(200);
|
|
return;
|
|
err:
|
|
textedit->append("error: "+message);
|
|
}
|
|
|
|
void Report::setCursorPos(int newpos) {
|
|
int index;
|
|
|
|
textedit->setCursorPosition(newpos, 0);
|
|
if (newpos > pos) {
|
|
textedit->moveCursor(QTextEdit::MoveDown, false);
|
|
textedit->moveCursor(QTextEdit::MoveDown, false);
|
|
} else {
|
|
textedit->moveCursor(QTextEdit::MoveUp, false);
|
|
textedit->moveCursor(QTextEdit::MoveUp, false);
|
|
}
|
|
textedit->getCursorPosition(&posc, &index);
|
|
pos = newpos;
|
|
textedit->setSelection(pos, 0, pos+1, 0, 1);
|
|
textedit->setCursorPosition(posc, 0);
|
|
textedit->ensureCursorVisible();
|
|
}
|
|
|
|
void Report::updatePos() {
|
|
int para, index;
|
|
|
|
textedit->getCursorPosition(¶, &index);
|
|
if (para == pos) return;
|
|
if (para == posc && index == 0) {
|
|
// cursor repositioning pending
|
|
posc = pos;
|
|
textedit->setCursorPosition(posc, 0);
|
|
textedit->ensureCursorVisible();
|
|
} else {
|
|
setCursorPos(para);
|
|
}
|
|
if (pos < (int)times.count()) {
|
|
setMarker(times[pos]);
|
|
}
|
|
}
|
|
|
|
void Report::editReport() {
|
|
QString text;
|
|
|
|
if (textedit->isReadOnly()) {
|
|
textedit->setReadOnly(FALSE);
|
|
timer->stop();
|
|
setMarker(0);
|
|
} else {
|
|
printf("%s\n", textedit->text().latin1());
|
|
textedit->setText(textedit->text());
|
|
}
|
|
}
|