diff options
-rw-r--r-- | client/client.pro | 62 | ||||
-rw-r--r-- | client/macro.cc | 132 | ||||
-rw-r--r-- | client/macro.h | 68 | ||||
-rw-r--r-- | client/macrodrawer.cc | 16 | ||||
-rw-r--r-- | client/macrodrawer.h | 8 | ||||
-rw-r--r-- | client/macrowindow.cc | 21 | ||||
-rw-r--r-- | client/macrowindow.h | 9 | ||||
-rw-r--r-- | client/mainwindow.cc | 109 | ||||
-rw-r--r-- | client/mainwindow.h | 8 |
9 files changed, 319 insertions, 114 deletions
diff --git a/client/client.pro b/client/client.pro index 38279b8..772bbd3 100644 --- a/client/client.pro +++ b/client/client.pro @@ -1,5 +1,7 @@ # -*- Makefile -*- +CONFIG += debug + TEMPLATE = app TARGET = pracro DEPENDPATH += . widgets @@ -8,16 +10,20 @@ RESOURCES += client.qrc QT += core gui network xml sql # For debugging -QMAKE_CXXFLAGS += -g -Wall -Werror +debug { + QMAKE_CXXFLAGS += -g -Wall -Werror +} -DEFINES+=VERSION=\\\"1.0.1\\\" +DEFINES+=VERSION=\\\"1.0.2\\\" win32 { LIBPATH += lua/lib INCLUDEPATH += lua/include LIBS += -llua51 DEFINES += HOST_WIN32 - CONFIG += console release + debug { + CONFIG += console + } } unix { @@ -26,21 +32,22 @@ unix { HEADERS += \ collapser.h \ - formatparser.h \ - lua.h \ - macrowindow.h \ + formatparser.h \ + lua.h \ + macro.h \ + macrowindow.h \ mainwindow.h \ macrodrawer.h \ messagebox.h \ netcom.h \ resumewidget.h \ - widgetbuilder.h \ - widgets.h \ + widgetbuilder.h \ + widgets.h \ widgets/common.h \ widgets/widget.h \ widgets/label.h \ widgets/lineedit.h \ - widgets/multilist.h \ + widgets/multilist.h \ widgets/textedit.h \ widgets/button.h \ widgets/datetime.h \ @@ -53,39 +60,40 @@ HEADERS += \ widgets/radiobuttons.h \ widgets/checkbox.h \ widgets/window.h \ - widgets/altcombobox.h \ + widgets/altcombobox.h \ widgets/metawidget.h SOURCES += \ - pracro.cc \ + pracro.cc \ collapser.cc \ - formatparser.cc \ - lua.cc \ - macrowindow.cc \ + formatparser.cc \ + lua.cc \ + macro.cc \ + macrowindow.cc \ mainwindow.cc \ macrodrawer.cc \ messagebox.cc \ netcom.cc \ resumewidget.cc \ - widgetbuilder.cc \ + widgetbuilder.cc \ widgets/common.cc \ - widgets/widget.cc \ - widgets/label.cc \ - widgets/lineedit.cc \ - widgets/multilist.cc \ - widgets/textedit.cc \ - widgets/button.cc \ - widgets/combobox.cc \ + widgets/widget.cc \ + widgets/label.cc \ + widgets/lineedit.cc \ + widgets/multilist.cc \ + widgets/textedit.cc \ + widgets/button.cc \ + widgets/combobox.cc \ widgets/datetime.cc \ widgets/dbwidget.cc \ widgets/listbox.cc \ - widgets/frame.cc \ + widgets/frame.cc \ widgets/groupbox.cc \ widgets/radiobutton.cc \ - widgets/radiobuttons.cc \ - widgets/checkbox.cc \ - widgets/window.cc \ - widgets/altcombobox.cc \ + widgets/radiobuttons.cc \ + widgets/checkbox.cc \ + widgets/window.cc \ + widgets/altcombobox.cc \ widgets/metawidget.cc TRANSLATIONS=pracro_dk.ts
\ No newline at end of file diff --git a/client/macro.cc b/client/macro.cc new file mode 100644 index 0000000..dbe34f5 --- /dev/null +++ b/client/macro.cc @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * macro.cc + * + * Tue Jun 30 11:49:46 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 "macro.h" + +#include <QDomElement> +#include <QHBoxLayout> + +#include "macrodrawer.h" + +Macro::Macro(QDomNode &n) +{ + window = NULL; + + node = n.cloneNode(true); + + QDomElement xml_elem = node.toElement(); + + if(xml_elem.tagName() != "macro") return; + if(xml_elem.hasAttribute("header")) return; + + name = xml_elem.attribute("name"); + + iscompleted = xml_elem.attribute("completed", "false") == "true"; +} + +void Macro::init(QBoxLayout *layout, Macros ¯os, bool initialising, NetCom &netcom, QString course) +{ + QDomElement xml_elem = node.toElement(); + + if(xml_elem.tagName() != "macro") return; + + isstatic = xml_elem.attribute("static", "false") == "true"; + iscompact = xml_elem.attribute("compact", "false") == "true"; + + if(xml_elem.hasAttribute("requires")) { + // Read and parse requirement list. + requires = xml_elem.attribute("requires").split(","); + } + + if(xml_elem.hasAttribute("header")) { + // Macro is a special headline macro. + // Simply create a headline, and ignore the rest. + + // Only add header on initial contruction. + if(initialising == true) { + QLabel *header = new QLabel(); + header->setText(xml_elem.attribute("header")); + QFont headerfont = header->font(); + headerfont.setBold(true); + headerfont.setPointSize(headerfont.pointSize() + 2); + header->setFont(headerfont); + layout->addWidget(header); + } + + return; + } + + // if(macros.find(name) == macros.end()) { + if(window == NULL) { + window = new MacroWindow(netcom, node, course, !isstatic, iscompact); + + MacroDrawer *g = new MacroDrawer(this, xml_elem.attribute("caption", name)); + g->connect(g, SIGNAL(toggle()), window, SLOT(toggleMacro())); + g->connect(window, SIGNAL(activationChanged(bool)), g, SLOT(activationChange(bool))); + window->setActive(false); + + layout->addWidget(g); + + QHBoxLayout *l = new QHBoxLayout(); + l->setContentsMargins(10,0,10,0); + g->setLayout(l); + l->addWidget(window); + { + QFont f = window->font(); + f.setBold(false); + f.setItalic(false); + window->setFont(f); + } + + } else { + + window->update(node); + if(xml_elem.attribute("static", "false") == "false") { + window->setCollapsed(true); + } + } + + QStringList::iterator rs = requires.begin(); + bool active = true; + while(rs != requires.end()) { + printf("Testing if %s is completed...", rs->toStdString().c_str()); + + Macros::iterator ms = macros.begin(); + while(ms != macros.end()) { + if(ms->name == *rs) { + printf("Found it %d", ms->iscompleted); + active = active && ms->iscompleted; + } + ms++; + } + + printf("\n"); + rs++; + } + window->setActive(active); + +} diff --git a/client/macro.h b/client/macro.h new file mode 100644 index 0000000..f79583c --- /dev/null +++ b/client/macro.h @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * macro.h + * + * Tue Jun 30 11:49:46 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_MACRO_H__ +#define __PRACRO_MACRO_H__ + +#include <QString> +#include <QStringList> +#include <QMap> +#include <QDomNode> +#include <QBoxLayout> + +#include "macrowindow.h" + +class Macro; +typedef QMap<QString, Macro> Macros; + +class Macro { +public: + Macro() {} + Macro(QDomNode &node); + + void init(QBoxLayout *layout, Macros ¯os, bool initialising, NetCom &netcom, QString course); + + QString name; + QString caption; + + // Dependency system + QStringList requires; + // bool isrequired; + bool iscompleted; + + QString resume; + + bool isstatic; + bool iscompact; + + MacroWindow *window; + +private: + QDomNode node; +}; + +#endif/*__PRACRO_MACRO_H__*/ diff --git a/client/macrodrawer.cc b/client/macrodrawer.cc index 85cab3f..f3fcab1 100644 --- a/client/macrodrawer.cc +++ b/client/macrodrawer.cc @@ -28,11 +28,9 @@ #include <QPushButton> -MacroDrawer::MacroDrawer(MacroWindow *p, QString title) +MacroDrawer::MacroDrawer(Macro *macro, QString title) { - mw = p; - - if(!mw->isstatic) setTitle(" " + title); + if(!macro->isstatic) setTitle(" " + title); setFlat(true); { @@ -41,7 +39,7 @@ MacroDrawer::MacroDrawer(MacroWindow *p, QString title) setFont(f); } - if(!mw->isstatic) { + if(!macro->isstatic) { QPushButton *b = new QPushButton("±", this); b->setFixedSize(16,16); b->move(0,0); @@ -61,7 +59,7 @@ bool MacroDrawer::eventFilter(QObject *obj, QEvent *event) { if(event->type() == QEvent::MouseButtonRelease) { QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); - if(mouseEvent->y() < 16 && isEnabled()) toggle(); + if(mouseEvent->y() < 16 && isEnabled()) emit toggle(); } return QObject::eventFilter(obj, event); } @@ -70,3 +68,9 @@ void MacroDrawer::toggleMe() { emit toggle(); } + +void MacroDrawer::activationChange(bool active) +{ + //printf("Active %d\n", (int)active); + setEnabled(active); +} diff --git a/client/macrodrawer.h b/client/macrodrawer.h index a6a5d6d..0ad09f5 100644 --- a/client/macrodrawer.h +++ b/client/macrodrawer.h @@ -29,24 +29,22 @@ #include <QGroupBox> #include <QString> -#include "macrowindow.h" +#include "macro.h" class MacroDrawer : public QGroupBox { Q_OBJECT public: - MacroDrawer(MacroWindow *p, QString title); + MacroDrawer(Macro *macro, QString title); protected: bool eventFilter(QObject *obj, QEvent *event); public slots: void toggleMe(); + void activationChange(bool active); signals: void toggle(); - -private: - MacroWindow *mw; }; #endif/*__PRACRO_MACRODRAWER_H__*/ diff --git a/client/macrowindow.cc b/client/macrowindow.cc index e3e3bac..db6ad53 100644 --- a/client/macrowindow.cc +++ b/client/macrowindow.cc @@ -44,14 +44,13 @@ extern QString user; extern QString host; extern quint16 port; -MacroWindow::MacroWindow(NetCom *netcom, QDomNode &xml_doc, QString course, +MacroWindow::MacroWindow(NetCom &n, QDomNode &xml_doc, QString course, bool collapsed, bool compact) - : Collapser() + : Collapser(), netcom(n) { waschanged = false; this->course = course; - this->netcom = netcom; setCollapsedWidget(new ResumeWidget(compact)); @@ -60,6 +59,7 @@ MacroWindow::MacroWindow(NetCom *netcom, QDomNode &xml_doc, QString course, update(xml_doc); setCollapsed(collapsed); + active = true; } MacroWindow::~MacroWindow() @@ -149,7 +149,7 @@ bool MacroWindow::doCommit() // If all entries passed validation, continue commit if(faulty == 0) { - netcom->send(widgets, course, macro, version); + netcom.send(widgets, course, macro, version); emit updateOnCommit(); setCollapsed(true); return true; @@ -305,7 +305,7 @@ void MacroWindow::expandWrapper() luaprograms.clear(); waschanged = false; - QDomDocument xml_doc = netcom->send(course, macro); + QDomDocument xml_doc = netcom.send(course, macro); // // TODO: This is where the dependency checking should occur. @@ -380,6 +380,7 @@ void MacroWindow::collapseWrapper() void MacroWindow::toggleMacro() { + if(!active) return; if(isCollapsed()) { expandWrapper(); } else { @@ -393,3 +394,13 @@ void MacroWindow::macroChanged() emit macroHasChanged(); waschanged = true; } + +void MacroWindow::setActive(bool active) +{ + if(this->active == active) return; + + this->active = active; + if(active == false) setEnabled(false); + else setEnabled(true); + emit activationChanged(active); +} diff --git a/client/macrowindow.h b/client/macrowindow.h index c34c978..fad467b 100644 --- a/client/macrowindow.h +++ b/client/macrowindow.h @@ -47,7 +47,7 @@ class MacroWindow : public Collapser { Q_OBJECT public: - MacroWindow(NetCom *netcom, QDomNode &xml_doc, QString course, + MacroWindow(NetCom &netcom, QDomNode &xml_doc, QString course, bool collapsed = true, bool compact = false); ~MacroWindow(); @@ -67,8 +67,9 @@ public: void update(QDomNode &xml_doc); + void setActive(bool active); + QString macrotitle; - bool isstatic; public slots: void commit(); @@ -87,6 +88,7 @@ public slots: signals: void updateOnCommit(); void macroHasChanged(); + void activationChanged(bool); private: void initMacro(QDomNode &node); @@ -103,9 +105,10 @@ private: bool isclosed; void close(); - NetCom *netcom; + NetCom &netcom; bool waschanged; + bool active; }; #endif/*__PRACRO_MACROWINDOW_H__*/ diff --git a/client/mainwindow.cc b/client/mainwindow.cc index fd55ba0..c59a877 100644 --- a/client/mainwindow.cc +++ b/client/mainwindow.cc @@ -60,7 +60,6 @@ MainWindow::MainWindow(QString cpr, QString course, QString host, quint16 port, w->setLayout(new QVBoxLayout()); this->course = course; - // status->showMessage("Makroen blev succesfuldt indlęst."); setStatusBar(status); init(); @@ -94,13 +93,8 @@ void MainWindow::init() initialising = false; } -void MainWindow::update() +void MainWindow::updateCourseHeaders(QDomNode coursenode) { - QDomDocument xml_doc = netcom.send(course); - - QDomNodeList courses = xml_doc.documentElement().childNodes(); - QDomNode coursenode = courses.at(0); // There can be only one! (Swush, flomp) - QDomElement course_elem = coursenode.toElement(); QString course_title = course_elem.attribute("title"); QString course_name = course_elem.attribute("name"); @@ -117,82 +111,63 @@ void MainWindow::update() } statusBar()->showMessage(course_title + " (" + course_name + ")"); +} + + +void MainWindow::update() +{ + QDomDocument xml_doc = netcom.send(course); + + QDomNodeList courses = xml_doc.documentElement().childNodes(); + QDomNode coursenode = courses.at(0); // There can be only one! (Swush, flomp) + + updateCourseHeaders(coursenode); QDomNodeList macronodes = coursenode.childNodes(); for(int j = 0; j < macronodes.count(); j++) { QDomNode macronode = macronodes.at(j); + QDomElement macroelement = macronode.toElement(); - QDomElement xml_elem = macronode.toElement(); - - if(xml_elem.tagName() == "macro") { - - if(xml_elem.hasAttribute("header")) { - // Macro is a special headline macro. - // Simply create a headline, and ignore the rest. + QString macroname = macroelement.attribute("name"); - // Only add header on initial contruction. - if(initialising == true) { - QLabel *header = new QLabel(); - header->setText(xml_elem.attribute("header")); - QFont headerfont = header->font(); - headerfont.setBold(true); - headerfont.setPointSize(headerfont.pointSize() + 2); - header->setFont(headerfont); - w->layout()->addWidget(header); - } + bool found = false; - continue; - } + Macros::iterator i = macros.begin(); + while(i != macros.end()) { + if(i->name == macroname) found |= true; + i++; + } - QString macroname; - if(xml_elem.hasAttribute("name")) macroname = xml_elem.attribute("name"); - - if(macros.find(macroname) == macros.end()) { - bool isstatic = false; - bool iscompact = false; - if(xml_elem.attribute("static", "false") == "true") isstatic = true; - if(xml_elem.attribute("compact", "false") == "true") iscompact = true; - macros[macroname] = new MacroWindow(&netcom, macronode, course, !isstatic, iscompact); - macros[macroname]->isstatic = isstatic; - - MacroDrawer *g = new MacroDrawer(macros[macroname], xml_elem.attribute("caption", macroname)); - connect(g, SIGNAL(toggle()), macros[macroname], SLOT(toggleMacro())); - - ((QBoxLayout*)w->layout())->addWidget(g); - - QHBoxLayout *l = new QHBoxLayout(); - l->setContentsMargins(10,0,10,0); - g->setLayout(l); - l->addWidget(macros[macroname]); - connect(macros[macroname], SIGNAL(updateOnCommit()), this, SLOT(update())); - { - QFont f = macros[macroname]->font(); - f.setBold(false); - f.setItalic(false); - macros[macroname]->setFont(f); - } - - } else { - - macros[macroname]->update(macronode); - if(xml_elem.attribute("static", "false") == "false") { - macros[macroname]->setCollapsed(true); - } + if(found == false || macroelement.hasAttribute("header")) { + QString num; + num.sprintf("%4d", j); + Macro macro(macronode); + macros[num + macro.name] = macro; + } + } - } + { + Macros::iterator i = macros.begin(); + while(i != macros.end()) { + Macro ¯o = i.value(); + macro.init((QBoxLayout*)w->layout(), macros, initialising, netcom, course); + if(macro.window != NULL) connect(macro.window, SIGNAL(updateOnCommit()), this, SLOT(update())); + i++; } } // Make sure that all macros will collapse when a new one is expanded. - QMap< QString, MacroWindow* >::iterator i = macros.begin(); + Macros::iterator i = macros.begin(); while(i != macros.end()) { - MacroWindow *m1 = i.value(); - - QMap< QString, MacroWindow* >::iterator j = macros.begin(); + Macro &_m1 = i.value(); + MacroWindow *m1 = _m1.window; + + Macros::iterator j = macros.begin(); while(j != macros.end()) { - MacroWindow *m2 = j.value(); + Macro &_m2 = j.value(); + MacroWindow *m2 = _m2.window; - if(m1 != m2 && m2->isstatic == false) { + if(m1 && m2 && m1 != m2 && _m2.isstatic == false) { // Remove old connection (if any), to avoid multiple connections. disconnect(m1, SIGNAL(expanding()), m2, SLOT(collapseWrapper())); diff --git a/client/mainwindow.h b/client/mainwindow.h index 00300f4..d60db9d 100644 --- a/client/mainwindow.h +++ b/client/mainwindow.h @@ -29,10 +29,13 @@ #include <QMainWindow> #include <QMap> +#include <QVector> #include <QPushButton> #include "netcom.h" #include "macrowindow.h" +#include "macro.h" + class MainWindow : public QMainWindow { Q_OBJECT public: @@ -45,10 +48,13 @@ public slots: void update(); private: + void updateCourseHeaders(QDomNode coursenode); + QString course; NetCom netcom; - QMap< QString, MacroWindow* > macros; + // QMap< QString, MacroWindow* > macros; + Macros macros; QWidget *w; QLabel *header; |