From ded5e8cd771c9affef086b77e25c93b4868f3f29 Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 10 Mar 2011 08:45:16 +0000 Subject: Callback based client implementation is now finished. Testing is up. --- client/mainwindow.cc | 307 +++++++++++++++++++++++++-------------------------- 1 file changed, 153 insertions(+), 154 deletions(-) (limited to 'client/mainwindow.cc') diff --git a/client/mainwindow.cc b/client/mainwindow.cc index 6ee17c8..30be707 100644 --- a/client/mainwindow.cc +++ b/client/mainwindow.cc @@ -36,18 +36,23 @@ #include #include #include -#include #include #include #include #include -#include + +#include "messagebox.h" #include "macrodrawer.h" #include "macrowindow.h" +#include "macro.h" +#include "header.h" + #include "debug.h" +extern QWidget *viewer; + class Dbg : public QLabel { public: Dbg() { @@ -60,20 +65,40 @@ public: } }; -MainWindow::MainWindow(QString cpr, QString templ, QString host, +MainWindow *gmainwindow = NULL; + +MainWindow::MainWindow(QString patientid, QString templ, QString host, quint16 port, QString user) : QMainWindow(0, Qt::WindowContextHelpButtonHint), netcom(this, host, port) { + gmainwindow = this; + + closing = false; + + scrollarea = new QScrollArea(); + setCentralWidget(scrollarea); + w = new QWidget(); + scrollarea->setWidget(w); + scrollarea->setWidgetResizable(true); + + w->setLayout(new QVBoxLayout()); + + connect(&netcom, SIGNAL(gotReply(QDomDocument&)), + this, SLOT(handle(QDomDocument&))); + + connect(&netcom, SIGNAL(networkError(QString, QString)), + this, SLOT(showError(QString, QString))); + isStored = false; header = NULL; - this->cpr = cpr; + this->patientid = patientid; this->user = user; this->templ = templ; - setWindowTitle("Pracro - " + cpr); + setWindowTitle("Pracro - " + patientid); setWindowIcon(QIcon(":/icons/icon.png")); QStatusBar *status = statusBar(); @@ -95,95 +120,99 @@ MainWindow::MainWindow(QString cpr, QString templ, QString host, connect(close_discard, SIGNAL(triggered()), this, SLOT(closeDiscard())); */ toolbar->addSeparator(); - /* - QAction *show_sessions = toolbar->addAction(tr("Show sessions")); - show_sessions->setIcon(QPixmap(":icons/icon_current_sessions.png")); - */ + connect(close_commit, SIGNAL(triggered()), this, SLOT(closeCommit())); connect(close_no_commit, SIGNAL(triggered()), this, SLOT(closeNoCommit())); - // connect(show_sessions, SIGNAL(triggered()), this, SLOT(showSessions())); - - scrollarea = new QScrollArea(); - setCentralWidget(scrollarea); - w = new QWidget(); - scrollarea->setWidget(w); - scrollarea->setWidgetResizable(true); - - w->setLayout(new QVBoxLayout()); setStatusBar(status); init(); - /* - if(sessions.isEmpty()) { - show_sessions->setEnabled(false); - } - */ } MainWindow::~MainWindow() { } +bool MainWindow::hasOpen(void *me) +{ + Entities::iterator i = entities.begin(); + while(i != entities.end()) { + if(me != i.value() && i.value()->isOpen()) return true; + i++; + } + return false; +} + + void MainWindow::closeCommit() { + if(hasOpen(NULL)) { + MessageBox::warning(this, tr("Close first."), + tr("Close open macros first.")); + return; + } netcom.commit(); - // sessions.remove(cpr); isStored = true; - close(); + closing = true; } void MainWindow::closeNoCommit() { -/* - QMessageBox::information(this, - tr("Closing without commit"), - tr("This session will be stored on this computer " - "only. To reopen it at a later time, simply " - "open the same patient again.")); -*/ - // sessions.add(cpr, user, netcom.sessionid); - isStored = true; + if(hasOpen(NULL)) { + MessageBox::warning(this, tr("Close first."), + tr("Close open macros first.")); + return; + } netcom.nocommit(); - close(); + isStored = true; + closing = true; } void MainWindow::closeDiscard() { - if(QMessageBox::question(this, - tr("Discard"), - tr("This session will NOT be " - "stored in the journal.
" - "Are you sure you want to continue?"), - QMessageBox::Yes | QMessageBox::No) - == QMessageBox::Yes) { + if(hasOpen(NULL)) { + MessageBox::warning(this, tr("Close first."), + tr("Close open macros first.")); + return; + } + + MessageBox::StandardButton res = + MessageBox::question(this, + tr("Discard"), + tr("This session will NOT be " + "stored in the journal.
" + "Are you sure you want to continue?"), + MessageBox::Yes | MessageBox::No); + + if(res == MessageBox::Yes) { netcom.discard(); - // sessions.remove(cpr); isStored = true; - close(); + closing = true; } } -/* -void MainWindow::showSessions() -{ - sessions.show(); -} -*/ -extern QWidget *viewer; -//#include + void MainWindow::closeEvent(QCloseEvent *event) { - if(isStored || QMessageBox::question(this, + if(hasOpen(NULL)) { + MessageBox::warning(this, "Close first.", "Close open macros first."); + event->ignore(); + return; + } + + if(isStored || MessageBox::question(this, tr("Discard"), tr("This session will " "NOT be stored in " "the journal.
" "Are you sure you want to continue?"), - QMessageBox::Yes | QMessageBox::No) - == QMessageBox::Yes) { + MessageBox::Yes | MessageBox::No) + == MessageBox::Yes) { if(!isStored) { netcom.discard(); - // sessions.remove(cpr); + isStored = true; + closing = true; + event->ignore(); + return; } QSettings settings("Aasimon.org", "Pracro"); @@ -191,7 +220,6 @@ void MainWindow::closeEvent(QCloseEvent *event) settings.beginGroup("MainWindow"); settings.setValue("size", size()); settings.setValue("pos", pos()); - // settings.setValue(QString("sessions"), sessions.toVariant()); settings.endGroup(); event->accept(); @@ -209,36 +237,26 @@ void MainWindow::init() settings.beginGroup("MainWindow"); resize(settings.value("size", QSize(700, 800)).toSize()); move(settings.value("pos", QPoint(0, 0)).toPoint()); - // sessions.fromVariant(settings.value("sessions")); settings.endGroup(); - netcom.patientid = cpr; + netcom.patientid = patientid; netcom.templ = templ; netcom.user = user; - /* - if(sessions.contains(cpr)) { - netcom.sessionid = sessions.getSessionID(cpr); - if(sessions.getUser(cpr) != user) { - // What to do? We are running an old session with a new user! - } - } - */ - netcom.initConnection(); - initialising = true; - update(); - initialising = false; + netcom.initConnection(); } -void MainWindow::updateTemplateHeaders(QDomNode templatenode) +void MainWindow::updateTemplateHeaders(QDomNode &node) { - QDomElement template_elem = templatenode.toElement(); - QString template_title = template_elem.attribute("title"); - QString template_name = template_elem.attribute("name"); + QDomElement elem = node.toElement(); + + if(elem.tagName() != "template") return; + + QString title = elem.attribute("title"); + QString name = elem.attribute("name"); if(!header) { header = new QLabel(); - header->setText(template_title); QFont headerfont = header->font(); headerfont.setBold(true); headerfont.setPointSize(headerfont.pointSize() + 4); @@ -247,103 +265,84 @@ void MainWindow::updateTemplateHeaders(QDomNode templatenode) w->layout()->addWidget(header); } - statusBar()->showMessage(template_title + " (" + template_name + + header->setText(title); + + statusBar()->showMessage(title + " (" + name + ") - SessionID: " + netcom.sessionid); } -void MainWindow::update() +void MainWindow::showError(QString title, QString text) { - QDomDocument xml_doc = netcom.send(templ); - - QDomNodeList templates = xml_doc.documentElement().childNodes(); - // There can be only one! (Swush, flomp) - QDomNode templatenode = templates.at(0); - - if(templatenode.toElement().tagName() == "error") { - QMessageBox::critical(this, "Error", - templatenode.toElement().text()); - return; - } + MessageBox::critical(this, title, text); +} +void MainWindow::updateMacros(QDomNodeList &nodes) +{ + for(int j = 0; j < nodes.count(); j++) { + QDomNode node = nodes.at(j); + QDomElement elem = node.toElement(); - updateTemplateHeaders(templatenode); + if(elem.tagName() == "macro" || elem.tagName() == "header") { + QString name = elem.attribute("name"); + + if(entities.find(j) == entities.end()) { + Entity *e = NULL; + if(elem.tagName() == "macro") { + e = new Macro(entities, netcom, templ, scrollarea); + } + if(elem.tagName() == "header") { + e = new Header(); + } + entities[j] = e; + entities[j]->update(node); + w->layout()->addWidget(e->widget()); + } else { + entities[j]->update(node); + } + continue; + } - QDomNodeList macronodes = templatenode.childNodes(); - for(int j = 0; j < macronodes.count(); j++) { + showError("XML Error", "Expected macro/header tag. Got '" + + elem.tagName() + "' tag."); + continue; - QDomNode macronode = macronodes.at(j); - QDomElement macroelement = macronode.toElement(); + } +} - // printf("%s\n", macroelement.tagName().toStdString().c_str()); +void MainWindow::handle(QDomDocument &doc) +{ + if(closing) close(); - QString macroname = macroelement.attribute("name"); + DEBUG(mainwindow, "Handle %s\n", + doc.toString().toStdString().c_str()); - bool found = false; - Macros::iterator i = macros.begin(); - while(i != macros.end()) { - if(i->name == macroname) found |= true; - i++; - } + QDomNodeList nodes = doc.documentElement().childNodes(); + for(int j = 0; j < nodes.count(); j++) { + QDomNode node = nodes.at(j); + QDomElement element = node.toElement(); - // if(found == false || macroelement.hasAttribute("header")) { - if(found == false || macroelement.tagName() == "header") { - QString num; - num.sprintf("%04d", j); - Macro macro(macronode, scrollarea); - macros[num + macro.name] = macro; + if(element.tagName() == "error") { + showError("Pracro Server Error", element.text()); + continue; } - if(found) { - - Macros::iterator i = macros.begin(); - while(i != macros.end()) { - if(i->name == macroname && macroname != "") { - i->update(macronode); - } - i++; - } - + if(element.tagName() != "template") { + showError("XML error", "Outer tag not a template."); + continue; } - } - { - Macros::iterator i = macros.begin(); - while(i != macros.end()) { - Macro ¯o = i.value(); - macro.init((QBoxLayout*)w->layout(), macros, initialising, netcom, templ); - if(macro.window != NULL) { - // Remove old connection (if any), to avoid multiple connections. - disconnect(macro.window, SIGNAL(updateOnCommit()), - this, SLOT(update())); - - connect(macro.window, SIGNAL(updateOnCommit()), this, SLOT(update())); - } - i++; + if(element.attribute("name") != templ) { + showError("XML error", + "Got template name that didn't match current session."); + continue; } - } - // Make sure that all macros will collapse when a new one is expanded. - Macros::iterator i = macros.begin(); - while(i != macros.end()) { - Macro &_m1 = i.value(); - MacroWindow *m1 = _m1.window; - - Macros::iterator j = macros.begin(); - while(j != macros.end()) { - Macro &_m2 = j.value(); - MacroWindow *m2 = _m2.window; - - if(m1 && m2 && m1 != m2 && _m2.isstatic == false) { - // Remove old connection (if any), to avoid multiple connections. - disconnect(m1, SIGNAL(animating(QWidget*)), - m2, SLOT(collapseWrapper())); - - connect(m1, SIGNAL(animating(QWidget*)), m2, SLOT(collapseWrapper())); - } + // Set headers. titles, etc... + updateTemplateHeaders(node); - j++; - } + // Update macros, header and resumes. + QDomNodeList macronodes = node.childNodes(); + updateMacros(macronodes); - i++; } } -- cgit v1.2.3