summaryrefslogtreecommitdiff
path: root/client/viewer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'client/viewer.cc')
-rw-r--r--client/viewer.cc198
1 files changed, 198 insertions, 0 deletions
diff --git a/client/viewer.cc b/client/viewer.cc
new file mode 100644
index 0000000..22ff2a1
--- /dev/null
+++ b/client/viewer.cc
@@ -0,0 +1,198 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * viewer.cc
+ *
+ * Mon Aug 17 08:53:29 CEST 2009
+ * Copyright 2009 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Pracro.
+ *
+ * Pracro is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Pracro is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Pracro; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "viewer.h"
+
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QFile>
+#include <QScrollBar>
+
+#include <QSettings>
+#include <QTextCodec>
+
+Status::Status()
+{
+ QVBoxLayout *vl = new QVBoxLayout();
+ setLayout(vl);
+ this->caption = new QLabel();
+ vl->addWidget(this->caption);
+
+ QHBoxLayout *ohl = new QHBoxLayout();
+ ohl->setContentsMargins(0,0,0,0);
+ vl->addLayout(ohl);
+
+ hl = new QHBoxLayout();
+ hl->setContentsMargins(0,0,0,0);
+ ohl->addLayout(hl);
+
+ ohl->addStretch();
+}
+
+void Status::setCaption(QString caption)
+{
+ this->caption->setText(caption + ":");
+}
+
+void Status::setStatus(QString macro, QString caption, bool done)
+{
+ if(icons.find(macro) == icons.end()) {
+ QLabel *icon = new QLabel();
+ icon->setContentsMargins(0,0,0,0);
+ icon->setMargin(0);
+ icon->setIndent(0);
+ icon->setWhatsThis(caption);
+ icon->setToolTip(caption);
+ icons[macro] = icon;
+ hl->addWidget(icon);
+ }
+
+ icons[macro]->setPixmap(QPixmap(done?":/icons/done.png":":icons/undone.png"));
+}
+
+Viewer::Viewer(QString cpr, QString templs, QString host, quint16 port,
+ QString user, QString journalpath)
+ : QWidget(NULL)
+{
+ this->templs = templs.split(QRegExp("\\W+"), QString::SkipEmptyParts);
+
+ connect(&updatetimer, SIGNAL(timeout()), this, SLOT(update()));
+ netcom = new NetCom(host, port, user, cpr);
+ host = host; port = port; user = user;
+ this->cpr = cpr;
+ this->journalpath = journalpath;
+ updatetimer.start(10000); // Trigger every 10 seconds
+
+ QVBoxLayout *l = new QVBoxLayout();
+ setLayout(l);
+
+ QStringList::iterator ti = this->templs.begin();
+ while(ti != this->templs.end()) {
+ Status *s = new Status();
+ l->addWidget(s);
+ statuses[*ti] = s;
+ ti++;
+ }
+
+ journal = new QTextEdit();
+ journal->setReadOnly(true);
+ journal->setFontFamily("Courier New");
+ l->addWidget(journal);
+
+ init();
+ update();
+}
+
+Viewer::~Viewer()
+{
+ delete netcom;
+ delete journal;
+}
+
+void Viewer::closeEvent(QCloseEvent *)
+{
+ QSettings settings("Aasimon.org", "Pracro");
+
+ settings.beginGroup("ViewerWindow");
+ settings.setValue("size", size());
+ settings.setValue("pos", pos());
+ settings.endGroup();
+}
+
+void Viewer::init()
+{
+ QSettings settings("Aasimon.org", "Pracro");
+
+ settings.beginGroup("ViewerWindow");
+ resize(settings.value("size", QSize(700, 800)).toSize());
+ move(settings.value("pos", QPoint(0, 0)).toPoint());
+ settings.endGroup();
+}
+
+
+void Viewer::update()
+{
+ QStringList::iterator ti = templs.begin();
+ while(ti != templs.end()) {
+ QDomDocument xml_doc = netcom->send(*ti, "", false);
+
+ QDomNodeList templates = xml_doc.documentElement().childNodes();
+ QDomNode templatenode = templates.at(0); // There can be only one! (Swush, flomp)
+ QDomElement templateelement = templatenode.toElement();
+
+ statuses[*ti]->setCaption(templateelement.attribute("title"));
+
+ QDomNodeList macronodes = templatenode.childNodes();
+ for(int j = 0; j < macronodes.count(); j++) {
+ QDomNode macronode = macronodes.at(j);
+ QDomElement macroelement = macronode.toElement();
+
+ if(macroelement.tagName() != "macro") continue;
+
+ if(macroelement.attribute("static") == "true") continue;
+
+ QString macroname = macroelement.attribute("name");
+ QString caption = macroelement.attribute("caption");
+ QString completed = macroelement.attribute("completed");
+
+ statuses[*ti]->setStatus(macroname, caption, completed == "true");
+ }
+
+ ti++;
+ }
+
+ // re-read journal file:
+ QString crypt;
+ for(int i = cpr.length() - 1; i >= 0; i--) {
+ if(i == 2 || i == 3) continue;
+ crypt += QString::number(9 - cpr.mid(i, 1).toInt());
+ }
+
+ QString filename = journalpath + "/" + cpr.mid(2,2) + "/" + crypt + "/JOURNAL.TXT";
+ filename = "/home/senator/JOURNAL.TXT";
+
+ QTextCodec *cp850 = QTextCodec::codecForName("cp850");
+ if(!cp850) {
+ printf("Could not find decoder for cp850!\n");
+ }
+
+ QFile jfile(filename);
+ jfile.open(QIODevice::ReadOnly);
+ QByteArray jcp850 = jfile.readAll();
+ QString j = cp850->toUnicode(jcp850);
+
+ QString jstrip;
+ for(int i = 0; i < j.length(); i++) {
+ if(j[i] != '·') jstrip += j[i]; // Remove end of line symbols.
+ }
+
+ if(journal->toPlainText() != jstrip) {
+ int pos = journal->verticalScrollBar()->value();
+ journal->setPlainText(jstrip);
+ journal->verticalScrollBar()->setValue(pos);
+ }
+}