diff options
author | deva <deva> | 2009-08-17 14:59:42 +0000 |
---|---|---|
committer | deva <deva> | 2009-08-17 14:59:42 +0000 |
commit | e0e3d5fa10f80a88fa3b194b2a09cf89c8fced18 (patch) | |
tree | 3736401c6ad1a501b3f001388f948601e428bec5 /client/viewer.cc | |
parent | 001bc224ca71eb51658ee37206b02090a4e2413c (diff) |
A new journal watcher and pracro progressbar.
Diffstat (limited to 'client/viewer.cc')
-rw-r--r-- | client/viewer.cc | 198 |
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); + } +} |