summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2008-06-18 11:03:34 +0000
committerdeva <deva>2008-06-18 11:03:34 +0000
commit8c3994b02e3a0cf81ead56c8dcfefb67be078328 (patch)
tree7bf98b5b9438e0f64725bfc12a34b98c20583116
parentb681594b7e4f9a5375b555b152d661581c600a96 (diff)
Restructured widget building, completed inital version of MultiList with format string parsing, db commiting and rereading.
-rw-r--r--client/client.pro4
-rw-r--r--client/formatparser.cc100
-rw-r--r--client/formatparser.h36
-rw-r--r--client/macrowindow.cc98
-rw-r--r--client/macrowindow.h3
-rw-r--r--client/widgetbuilder.cc114
-rw-r--r--client/widgetbuilder.h38
-rw-r--r--client/widgets/multilist.cc112
-rw-r--r--client/widgets/multilist.h8
-rw-r--r--client/widgets/widget.cc1
10 files changed, 383 insertions, 131 deletions
diff --git a/client/client.pro b/client/client.pro
index 37a8da1..49b718a 100644
--- a/client/client.pro
+++ b/client/client.pro
@@ -23,10 +23,12 @@ unix {
}
HEADERS += \
+ formatparser.h \
lua.h \
macro.h \
macrowindow.h \
sendrecieve.h \
+ widgetbuilder.h \
widgets.h \
widgets/widget.h \
widgets/label.h \
@@ -45,10 +47,12 @@ HEADERS += \
SOURCES += \
pracro.cc \
+ formatparser.cc \
lua.cc \
macro.cc \
macrowindow.cc \
sendrecieve.cc \
+ widgetbuilder.cc \
widgets/widget.cc \
widgets/label.cc \
widgets/lineedit.cc \
diff --git a/client/formatparser.cc b/client/formatparser.cc
new file mode 100644
index 0000000..260a2bf
--- /dev/null
+++ b/client/formatparser.cc
@@ -0,0 +1,100 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * resumeparser.cc
+ *
+ * Mon Oct 1 11:17:35 CEST 2007
+ * Copyright 2007 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 "formatparser.h"
+
+#include <string.h>
+
+QString format_parser(QString format, QVector< Widget *> widgets)
+{
+ QString resume;
+ QString var;
+
+ QChar *p = format.data();
+ QChar *theend = p + format.size();
+ while(p < theend) {
+ switch((*p).toLatin1()) {
+ case '$':
+ p++;
+ switch((*p).toLatin1()) {
+ case '$':
+ resume.append(*p);
+ break;
+
+ case '{':
+ p++;
+ var = "";
+ // Parser
+ while(p < theend && *p != '}') {
+ var.append(*p);
+ p++;
+ }
+ {
+ QVector< Widget* >::iterator i = widgets.begin();
+ while (i != widgets.end()) {
+ Widget* w = *i;
+ if(w->getName() == var) resume += w->getValue();
+ i++;
+ }
+ }
+ break;
+
+ default:
+ resume.append(*p);
+ break;
+ }
+ p++;
+ break;
+
+ case '\\':
+ p++;
+ switch((*p).toLatin1()) {
+ case 't':
+ resume.append('\t');
+ break;
+ case 'n':
+ resume.append('\n');
+ break;
+ case 'r':
+ resume.append('\r');
+ break;
+ case '\\':
+ default:
+ resume.append(*p);
+ break;
+ }
+ p++;
+ break;
+
+ default:
+ resume.append(QChar(*p));
+ p++;
+ break;
+ }
+ }
+
+ return resume;
+}
diff --git a/client/formatparser.h b/client/formatparser.h
new file mode 100644
index 0000000..8612a0e
--- /dev/null
+++ b/client/formatparser.h
@@ -0,0 +1,36 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * formatparser.h
+ *
+ * Mon Oct 1 11:17:35 CEST 2007
+ * Copyright 2007 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_FORMATPARSER_H__
+#define __PRACRO_FORMATPARSER_H__
+
+#include <QString>
+#include <QVector>
+#include "widgets/widget.h"
+
+QString format_parser(QString format, QVector< Widget *> widgets);
+
+#endif/*__PRACRO_FORMATPARSER_H__*/
diff --git a/client/macrowindow.cc b/client/macrowindow.cc
index b799d31..6f52916 100644
--- a/client/macrowindow.cc
+++ b/client/macrowindow.cc
@@ -26,8 +26,8 @@
*/
#include "macrowindow.h"
#include "sendrecieve.h"
-#include "widgets.h"
#include "macro.h"
+#include "widgets/widget.h"
#include <QVBoxLayout>
#include <QMessageBox>
#include <QDomDocument>
@@ -35,6 +35,8 @@
#include <QDomNode>
#include <QByteArray>
+#include "widgets/window.h"
+#include "widgetbuilder.h"
#include "lua.h"
extern QString cpr;
@@ -46,11 +48,13 @@ MacroWindow::MacroWindow(QDomNode &xml_doc)
: QObject()
{
isclosed = false;
+ mainwidget = NULL;
this->lua = new LUA(this);
- // Execute the recursive function with documentElement
- recurser(xml_doc, NULL);
+ initMacro(xml_doc);
+
+ if(mainwidget) mainwidget->show();
}
MacroWindow::~MacroWindow()
@@ -58,10 +62,9 @@ MacroWindow::~MacroWindow()
delete lua;
}
-void MacroWindow::recurser(QDomNode xml_node, QWidget *parent)
+void MacroWindow::initMacro(QDomNode &node)
{
- QWidget *widget = NULL;
- QDomElement xml_elem = xml_node.toElement();
+ QDomElement xml_elem = node.toElement();
if(xml_elem.tagName() == "macro") {
// Assign the macro name and version to QStrings for use when comitting
@@ -78,97 +81,24 @@ void MacroWindow::recurser(QDomNode xml_node, QWidget *parent)
} else if(xml_elem.tagName() == "window") {
Window *window = new Window(xml_elem, this);
- widget = window;
mainwidget = window;
- } else if(xml_elem.tagName() == "frame") {
- if(xml_elem.hasAttribute("caption")) {
- GroupBox *frame = new GroupBox(xml_elem, this);
- widget = frame;
- } else {
- Frame *frame = new Frame(xml_elem, this);
- widget = frame;
- }
+ QDomNodeList children = node.childNodes();
- } else if(xml_elem.tagName() == "label") {
- Label *label = new Label(xml_elem, this);
- widget = label;
-
- } else if(xml_elem.tagName() == "lineedit") {
- LineEdit *lineedit = new LineEdit(xml_elem, this);
- widgets.push_back(lineedit);
- widget = lineedit;
-
- } else if(xml_elem.tagName() == "button") {
- PushButton *pushbutton = new PushButton(xml_elem, this);
- //connect(pushbutton, SIGNAL(act_continue()), main, SLOT(get_macro()));
- connect(pushbutton, SIGNAL(act_commit()), this, SLOT(commit()));
- connect(pushbutton, SIGNAL(act_reset()), this, SLOT(reset()));
- connect(pushbutton, SIGNAL(act_cancel()), this, SLOT(cancel()));
- connect(pushbutton, SIGNAL(act_continue(QString)), this, SLOT(cont(QString)));
- widget = pushbutton;
-
- } else if(xml_elem.tagName() == "textedit") {
- TextEdit *textedit = new TextEdit(xml_elem, this);
- widgets.push_back(textedit);
- widget = textedit;
-
- } else if(xml_elem.tagName() == "checkbox") {
- CheckBox *checkbox = new CheckBox(xml_elem, this);
- widgets.push_back(checkbox);
- widget = checkbox;
-
- } else if(xml_elem.tagName() == "radiobuttons") {
- RadioButtons *radiobuttons = new RadioButtons(xml_elem, this);
- widgets.push_back(radiobuttons);
- widget = radiobuttons;
- //return; // Don't iterate children
-
- } else if(xml_elem.tagName() == "combobox") {
- ComboBox *combobox = new ComboBox(xml_elem, this);
- widgets.push_back(combobox);
- widget = combobox;
- //return; // Don't iterate children
-
- } else if(xml_elem.tagName() == "listbox") {
- ListBox *listbox = new ListBox(xml_elem, this);
- widgets.push_back(listbox);
- widget = listbox;
- //return; // Don't iterate children
- } else if(xml_elem.tagName() == "multilist") {
-
- MultiList *multilist = new MultiList(xml_elem, this);
- widgets.push_back(multilist);
- if(parent) parent->layout()->addWidget(multilist);
-
- QDomNodeList children = xml_node.childNodes();
for (int i=0; i<children.count();i++) {
QDomNode child = children.at(i);
- if(child.nodeName() == "input") {
- QDomNodeList children = child.childNodes();
-
- for (int i=0; i<children.count();i++) {
- QDomNode child = children.at(i);
- recurser(child, multilist->inputcontainer);
- }
- break;
- }
+ widgets += widgetBuilder(child, mainwidget, this);
}
-
- multilist->inputcontainer->show();
- multilist->show();
- return; // Don't iterate children
+ return;
}
- QDomNodeList children = xml_node.childNodes();
+ QDomNodeList children = node.childNodes();
for (int i=0; i<children.count();i++) {
QDomNode child = children.at(i);
- recurser(child, widget);
+ initMacro(child);
}
- if(parent != NULL && widget != NULL) parent->layout()->addWidget(widget);
- if(widget != NULL) widget->show();
}
bool MacroWindow::doCommit()
diff --git a/client/macrowindow.h b/client/macrowindow.h
index 138c438..82853d8 100644
--- a/client/macrowindow.h
+++ b/client/macrowindow.h
@@ -60,8 +60,9 @@ public slots:
void cont(QString name);
private:
+ void initMacro(QDomNode &node);
+
bool doCommit();
- void recurser(QDomNode xml_node, QWidget *parent);
QVector< Widget* > widgets;
QString macro;
QString version;
diff --git a/client/widgetbuilder.cc b/client/widgetbuilder.cc
new file mode 100644
index 0000000..8d23c0b
--- /dev/null
+++ b/client/widgetbuilder.cc
@@ -0,0 +1,114 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * widgetbuilder.cc
+ *
+ * Wed Jun 18 08:03:04 CEST 2008
+ * Copyright 2008 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 "widgetbuilder.h"
+#include <QLayout>
+#include "widgets.h"
+
+QVector< Widget* > widgetBuilder(QDomNode xml_node, QWidget *parent, MacroWindow *macrowindow)
+{
+ QVector< Widget* > widgets;
+
+ QDomElement xml_elem = xml_node.toElement();
+
+ QWidget *widget = NULL;
+ if(xml_elem.tagName() == "frame") {
+ if(xml_elem.hasAttribute("caption")) {
+ GroupBox *frame = new GroupBox(xml_elem, macrowindow);
+ widget = frame;
+ } else {
+ Frame *frame = new Frame(xml_elem, macrowindow);
+ widget = frame;
+ }
+
+ } else if(xml_elem.tagName() == "label") {
+ Label *label = new Label(xml_elem, macrowindow);
+ widget = label;
+
+ } else if(xml_elem.tagName() == "lineedit") {
+ LineEdit *lineedit = new LineEdit(xml_elem, macrowindow);
+ widgets.push_back(lineedit);
+ widget = lineedit;
+
+ } else if(xml_elem.tagName() == "button") {
+ PushButton *pushbutton = new PushButton(xml_elem, macrowindow);
+ //macrowindow->connect(pushbutton, SIGNAL(act_continue()), main, SLOT(get_macro()));
+ macrowindow->connect(pushbutton, SIGNAL(act_commit()), macrowindow, SLOT(commit()));
+ macrowindow->connect(pushbutton, SIGNAL(act_reset()), macrowindow, SLOT(reset()));
+ macrowindow->connect(pushbutton, SIGNAL(act_cancel()), macrowindow, SLOT(cancel()));
+ macrowindow->connect(pushbutton, SIGNAL(act_continue(QString)), macrowindow, SLOT(cont(QString)));
+ widget = pushbutton;
+
+ } else if(xml_elem.tagName() == "textedit") {
+ TextEdit *textedit = new TextEdit(xml_elem, macrowindow);
+ widgets.push_back(textedit);
+ widget = textedit;
+
+ } else if(xml_elem.tagName() == "checkbox") {
+ CheckBox *checkbox = new CheckBox(xml_elem, macrowindow);
+ widgets.push_back(checkbox);
+ widget = checkbox;
+
+ } else if(xml_elem.tagName() == "radiobuttons") {
+ RadioButtons *radiobuttons = new RadioButtons(xml_elem, macrowindow);
+ widgets.push_back(radiobuttons);
+ widget = radiobuttons;
+ //return; // Don't iterate children
+
+ } else if(xml_elem.tagName() == "combobox") {
+ ComboBox *combobox = new ComboBox(xml_elem, macrowindow);
+ widgets.push_back(combobox);
+ widget = combobox;
+ //return; // Don't iterate children
+
+ } else if(xml_elem.tagName() == "listbox") {
+ ListBox *listbox = new ListBox(xml_elem, macrowindow);
+ widgets.push_back(listbox);
+ widget = listbox;
+ //return; // Don't iterate children
+ } else if(xml_elem.tagName() == "multilist") {
+ MultiList *multilist = new MultiList(xml_elem, macrowindow);
+ widgets.push_back(multilist);
+ widget = multilist;
+
+ if(parent != NULL && widget != NULL) parent->layout()->addWidget(widget);
+ if(widget != NULL) widget->show();
+
+ return widgets; // Don't iterate children
+ }
+
+ QDomNodeList children = xml_node.childNodes();
+
+ for (int i=0; i<children.count();i++) {
+ QDomNode child = children.at(i);
+ widgets += widgetBuilder(child, widget, macrowindow);
+ }
+
+ if(parent != NULL && widget != NULL) parent->layout()->addWidget(widget);
+ if(widget != NULL) widget->show();
+
+ return widgets;
+}
diff --git a/client/widgetbuilder.h b/client/widgetbuilder.h
new file mode 100644
index 0000000..f3b7369
--- /dev/null
+++ b/client/widgetbuilder.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * widgetbuilder.h
+ *
+ * Wed Jun 18 08:03:04 CEST 2008
+ * Copyright 2008 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_WIDGETBUILDER_H__
+#define __PRACRO_WIDGETBUILDER_H__
+
+#include <QVector>
+#include <QDomNode>
+#include <QWidget>
+#include "widgets/widget.h"
+#include "macrowindow.h"
+
+QVector< Widget* > widgetBuilder(QDomNode xml_node, QWidget *parent, MacroWindow *macrowindow);
+
+#endif/*__PRACRO_WIDGETBUILDER_H__*/
diff --git a/client/widgets/multilist.cc b/client/widgets/multilist.cc
index 73a9747..99772dd 100644
--- a/client/widgets/multilist.cc
+++ b/client/widgets/multilist.cc
@@ -31,79 +31,78 @@
#include <QGridLayout>
#include <QPushButton>
+#include "widgetbuilder.h"
+#include "formatparser.h"
+
MultiList::MultiList(QDomNode &node, MacroWindow *macrowindow)
: QFrame(), Widget(node, macrowindow)
{
- /*
- QDomElement elem = node.toElement();
-
- if(elem.hasAttribute("width")) {
- //resize(elem.attribute("width").toInt(), height());
- setMinimumWidth(elem.attribute("width").toInt());
- }
-
- if(elem.hasAttribute("height")) {
- //resize(width(), elem.attribute("height").toInt());
- setMinimumHeight(elem.attribute("height").toInt());
- }
- */
-
QGridLayout *layout = new QGridLayout();
setLayout(layout);
QWidget *inputbox = new QWidget(this);
inputbox->setContentsMargins(0,0,0,0);
- inputbox->setLayout(new QHBoxLayout());
- inputbox->layout()->setContentsMargins(0,0,0,0);
layout->addWidget(inputbox, 0, 0, Qt::AlignTop);
QPushButton *add = new QPushButton(this);
- add->setText("Add");
+ connect(add, SIGNAL(clicked()), this, SLOT(add()));
+ add->setText("+");
layout->addWidget(add, 0, 1, Qt::AlignTop);
- // QFrame *listbox = new QFrame(this);
- // listbox->setLayout(new QHBoxLayout());
- // layout()->addWidget(listbox);
-
list = new QListWidget(this);
layout->addWidget(list, 1, 0, Qt::AlignTop);
QPushButton *rem = new QPushButton(this);
- rem->setText("Remove");
+ connect(rem, SIGNAL(clicked()), this, SLOT(remove()));
+ rem->setText("-");
layout->addWidget(rem, 1, 1, Qt::AlignTop);
- inputcontainer = inputbox;
-
- /*
+ QDomElement elem = node.toElement();
if(elem.hasAttribute("layout")) {
if(elem.attribute("layout") == "hbox") {
QHBoxLayout *layout = new QHBoxLayout();
- setLayout(layout);
+ inputbox->setLayout(layout);
} else if (elem.attribute("layout") == "vbox") {
QVBoxLayout *layout = new QVBoxLayout();
- setLayout(layout);
+ inputbox->setLayout(layout);
}
+ } else {
+ QHBoxLayout *layout = new QHBoxLayout();
+ inputbox->setLayout(layout);
}
-
+
+ inputbox->layout()->setContentsMargins(0,0,0,0);
+
QDomNodeList children = node.childNodes();
-
+
for (int i=0; i<children.count();i++) {
QDomNode child = children.at(i);
- QDomElement radio_elem = child.toElement();
- bool radio_bool = false;
- if(elem.hasAttribute("value")) {
- if(elem.attribute("value") == radio_elem.attribute("value")) {
- radio_bool = true;
- }
+ widgets += widgetBuilder(child, inputbox, macrowindow);
+ }
+
+ if(elem.hasAttribute("value")) {
+ setValue(elem.attribute("value"));
+ }
+
+ if(elem.hasAttribute("format")) {
+ format = elem.attribute("format");
+ } else {
+ QVector< Widget* >::iterator i = widgets.begin();
+ while (i != widgets.end()) {
+ Widget* w = *i;
+ if(format != "") format += ", ";
+ format += "${" + w->getName() + "}";
+ i++;
}
- RadioButton *radiobutton = new RadioButton(child, radio_bool);
+ }
- // Create radiobutton from child, insert in this
- layout()->addWidget(radiobutton);
- radiobutton_list.push_back(radiobutton);
+ if(elem.hasAttribute("width")) {
+ setMinimumWidth(elem.attribute("width").toInt());
}
- */
+ if(elem.hasAttribute("height")) {
+ setMinimumHeight(elem.attribute("height").toInt());
+ }
}
void MultiList::changed()
@@ -112,10 +111,37 @@ void MultiList::changed()
QString MultiList::getValue()
{
- return "";
+ QString values;
+
+ QList<QListWidgetItem *> items = list->findItems("*", Qt::MatchWildcard);
+ QList<QListWidgetItem *>::iterator i = items.begin();
+ while(i != items.end()) {
+ QListWidgetItem *item = *i;
+ if(values != "") values += "\n";
+ values += item->text();
+ i++;
+ }
+
+ return values;
+}
+
+void MultiList::setValue(QString values)
+{
+ QString value;
+ int idx = 0;
+ do {
+ value = values.section('\n', idx, idx);
+ if(value != "") list->addItem(value);
+ idx++;
+ } while(value != "");
+}
+
+void MultiList::remove()
+{
+ list->takeItem(list->currentRow());
}
-void MultiList::setValue(QString value)
+void MultiList::add()
{
- value = value;
+ list->addItem(format_parser(format, widgets));
}
diff --git a/client/widgets/multilist.h b/client/widgets/multilist.h
index 6057677..cee6ccb 100644
--- a/client/widgets/multilist.h
+++ b/client/widgets/multilist.h
@@ -32,6 +32,7 @@
#include <QDomNode>
#include <QListWidget>
+#include <QVector>
class MultiList : public QFrame, public Widget
{
@@ -39,15 +40,18 @@ Q_OBJECT
public:
MultiList(QDomNode &node, MacroWindow *macrowindow);
- QWidget *inputcontainer;
-
public slots:
void changed();
QString getValue();
void setValue(QString value);
+ void remove();
+ void add();
+
private:
QListWidget *list;
+ QVector< Widget* > widgets;
+ QString format;
};
#endif/*__PRACRO_MULTILIST_H__*/
diff --git a/client/widgets/widget.cc b/client/widgets/widget.cc
index 25d37f6..dafe4b7 100644
--- a/client/widgets/widget.cc
+++ b/client/widgets/widget.cc
@@ -52,7 +52,6 @@ Widget::Widget(QDomNode &node, MacroWindow *macrowindow)
} else {
hasregexpvalidator = false;
}
-
}
QString Widget::getName()