From e0e3d5fa10f80a88fa3b194b2a09cf89c8fced18 Mon Sep 17 00:00:00 2001 From: deva Date: Mon, 17 Aug 2009 14:59:42 +0000 Subject: A new journal watcher and pracro progressbar. --- client/client.pro | 2 + client/client.qrc | 2 + client/icons/done.png | Bin 0 -> 724 bytes client/icons/undone.png | Bin 0 -> 685 bytes client/mainwindow.cc | 2 + client/netcom.cc | 10 +-- client/netcom.h | 2 +- client/pracro.cc | 66 +++++++++++----- client/pracro.ini | 1 + client/viewer.cc | 198 ++++++++++++++++++++++++++++++++++++++++++++++++ client/viewer.h | 80 +++++++++++++++++++ 11 files changed, 339 insertions(+), 24 deletions(-) create mode 100644 client/icons/done.png create mode 100644 client/icons/undone.png create mode 100644 client/viewer.cc create mode 100644 client/viewer.h (limited to 'client') diff --git a/client/client.pro b/client/client.pro index ec91339..162bf22 100644 --- a/client/client.pro +++ b/client/client.pro @@ -41,6 +41,7 @@ HEADERS += \ messagebox.h \ netcom.h \ resumewidget.h \ + viewer.h \ widgetbuilder.h \ widgets.h \ widgets/common.h \ @@ -75,6 +76,7 @@ SOURCES += \ messagebox.cc \ netcom.cc \ resumewidget.cc \ + viewer.cc \ widgetbuilder.cc \ widgets/common.cc \ widgets/widget.cc \ diff --git a/client/client.qrc b/client/client.qrc index efcd91f..ffbbda0 100644 --- a/client/client.qrc +++ b/client/client.qrc @@ -7,5 +7,7 @@ icons/arrows.png icons/compressed.png icons/padlock.png + icons/done.png + icons/undone.png diff --git a/client/icons/done.png b/client/icons/done.png new file mode 100644 index 0000000..89412f8 Binary files /dev/null and b/client/icons/done.png differ diff --git a/client/icons/undone.png b/client/icons/undone.png new file mode 100644 index 0000000..5f6792d Binary files /dev/null and b/client/icons/undone.png differ diff --git a/client/mainwindow.cc b/client/mainwindow.cc index beef88c..51bb772 100644 --- a/client/mainwindow.cc +++ b/client/mainwindow.cc @@ -77,6 +77,8 @@ void MainWindow::closeEvent(QCloseEvent *) settings.setValue("size", size()); settings.setValue("pos", pos()); settings.endGroup(); + + QApplication::quit(); } void MainWindow::init() diff --git a/client/netcom.cc b/client/netcom.cc index 0da19f8..3b3abb7 100644 --- a/client/netcom.cc +++ b/client/netcom.cc @@ -46,13 +46,13 @@ NetCom::~NetCom() socket.disconnectFromHost(); } -QDomDocument NetCom::send(QString templ, QString macro) +QDomDocument NetCom::send(QString templ, QString macro, bool lockgui) { printf("Socket state: %d\n", socket.state()); if(socket.state() != 3) printf("Socket state not connected: %s\n", socket.errorString().toStdString().c_str()); - if(qApp->activeWindow()) qApp->activeWindow()->setEnabled(false); - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + if(lockgui && qApp->activeWindow()) qApp->activeWindow()->setEnabled(false); + if(lockgui) QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QDomDocument doc; @@ -85,8 +85,8 @@ QDomDocument NetCom::send(QString templ, QString macro) printf("\nRecieved request:\n%s", res_doc.toString().toStdString().c_str()); - QApplication::restoreOverrideCursor(); - if(qApp->activeWindow()) qApp->activeWindow()->setEnabled(true); + if(lockgui) QApplication::restoreOverrideCursor(); + if(lockgui && qApp->activeWindow()) qApp->activeWindow()->setEnabled(true); return res_doc; } diff --git a/client/netcom.h b/client/netcom.h index 8cccaa9..35db221 100644 --- a/client/netcom.h +++ b/client/netcom.h @@ -41,7 +41,7 @@ public: NetCom(QString host, quint16 port, QString user, QString cpr); ~NetCom(); - QDomDocument send(QString templ, QString macro = ""); + QDomDocument send(QString templ, QString macro = "", bool lockgui = true); void send(QVector< Widget* > widgets, QString templ, QString macro, QString version); public slots: diff --git a/client/pracro.cc b/client/pracro.cc index 6d9c574..eacdeb1 100644 --- a/client/pracro.cc +++ b/client/pracro.cc @@ -35,6 +35,7 @@ #include "netcom.h" #include "mainwindow.h" +#include "viewer.h" #define CPR_DEFAULT "" #define MACRO_DEFAULT "" @@ -54,10 +55,6 @@ static void print_usage() printf("Executes the requested Pracro MACRO using supplied CPR and USER.\n"); printf("\n"); printf(" -h, --help Displays this help text.\n"); - /* - printf(" -m, --macro MACRO Requests macro MACRO from the Pracro \n" - " Server, defaults to \""MACRO_DEFAULT"\".\n"); - */ printf(" -t, --template TEMPLATE Requests template TEMPLATE from the Pracro \n" " Server, defaults to \""TEMPLATE_DEFAULT"\".\n"); printf(" -C, --cpr CPR Defines the cpr for use with the macro,\n" @@ -65,8 +62,10 @@ static void print_usage() printf(" -c, --config FILE The configfile to use. Default is \""CONFIG_DEFAULT"\"\n"); printf(" -u, -U, --user USER Defines the requesting user(not the patient),\n" " defaults to \""USER_DEFAULT"\"\n"); - // printf(" -t, --test macro Run client in testmode, i.e. run without contactig any\n" - // " servers. The macro must be a local xml file.\n"); + printf(" -v, --version Print version information and exit.\n"); + printf(" -V, --viewer TEMPLATES Show the viewer with TEMPLATES.\n"); + printf(" -O, --viewer-only TEMPLATES\n"); + printf(" Show the viewer only (no pracro editor window) with TEMPLATES.\n"); } static void print_version() @@ -90,6 +89,9 @@ int main(int argc, char *argv[]) QString macro = MACRO_DEFAULT; QString templ = TEMPLATE_DEFAULT; + bool show_viewer = false; + bool show_editor = true; + QString templs; QStringList args = app.arguments(); QStringList::iterator arg = args.begin(); @@ -99,22 +101,18 @@ int main(int argc, char *argv[]) if(*arg == "--help" || *arg == "-h") { print_usage(); + return 0; } else if(*arg == "--version" || *arg == "-v") { print_version(); + return 0; } else if(*arg == "--user" || *arg == "-U" || *arg == "-u") { user = getParam(args,arg); } - /* - else if(*arg == "--macro" || - *arg == "-m") { - macro = getParam(args, arg); - } - */ else if(*arg == "--template" || *arg == "-t") { templ = getParam(args, arg); @@ -127,6 +125,17 @@ int main(int argc, char *argv[]) *arg == "-c") { config = getParam(args, arg); } + else if(*arg == "--viewer" || + *arg == "-V") { + templs = getParam(args, arg); + show_viewer = true; + } + else if(*arg == "--viewer-only" || + *arg == "-O") { + templs = getParam(args, arg); + show_viewer = true; + show_editor = false; + } else { print_version(); print_usage(); @@ -141,16 +150,37 @@ int main(int argc, char *argv[]) settings.beginGroup("server"); host = settings.value("host").toString(); port = settings.value("port").toInt(); + QString journalpath = settings.value("journalpath").toString(); settings.endGroup(); QTranslator translator; - translator.load("pracro_dk"); - app.installTranslator(&translator); + if(translator.load("pracro_dk")) { + app.installTranslator(&translator); + } + + if(show_editor && show_viewer) { + MainWindow mainwindow(cpr, templ, host, port, user); + mainwindow.show(); + + Viewer viewer(cpr, templs, host, port, user, journalpath); + viewer.show(); - MainWindow mainwindow(cpr, templ, host, port, user); - mainwindow.show(); + return app.exec(); + } + + if(show_editor) { + MainWindow mainwindow(cpr, templ, host, port, user); + mainwindow.show(); + + return app.exec(); + } + + if(show_viewer) { + Viewer viewer(cpr, templs, host, port, user, journalpath); + viewer.show(); - int ret = app.exec(); + return app.exec(); + } - return ret; + return 1; } diff --git a/client/pracro.ini b/client/pracro.ini index 25fd0bf..55c97f7 100644 --- a/client/pracro.ini +++ b/client/pracro.ini @@ -2,3 +2,4 @@ #host=pracserv.j.auh.dk host=localhost port=12345 +journalpath="/home/samba/praxis/J1" 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 +#include +#include +#include + +#include +#include + +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); + } +} diff --git a/client/viewer.h b/client/viewer.h new file mode 100644 index 0000000..7877b8e --- /dev/null +++ b/client/viewer.h @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * viewer.h + * + * 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. + */ +#ifndef __PRACRO_VIEWER_H__ +#define __PRACRO_VIEWER_H__ + +#include +#include +#include +#include +#include +#include +#include + +#include "netcom.h" + +class Status : public QWidget { +public: + Status(); + void setStatus(QString macro, QString caption, bool done); + void setCaption(QString caption); + +private: + QLabel *caption; + QMap icons; + QHBoxLayout *hl; +}; + +class Viewer : public QWidget { +Q_OBJECT +public: + Viewer(QString cpr, QString templ, QString host, quint16 port, + QString user, QString journalpath); + ~Viewer(); + + void init(); + +protected: + void closeEvent(QCloseEvent *); + +public slots: + void update(); + +private: + QTimer updatetimer; + + QString cpr; + QString journalpath; + QStringList templs; + NetCom *netcom; + + QTextEdit *journal; + QMap statuses; +}; + +#endif/*__PRACRO_VIEWER_H__*/ -- cgit v1.2.3