From 4ef42a9bae0bd8c17391d1fbb5aa21d78fbe92ce Mon Sep 17 00:00:00 2001 From: deva Date: Mon, 1 Dec 2008 15:30:17 +0000 Subject: Added two new widgets: metawidget and altcombobox. Modified multilist to use 'innerwidget' attribute instead of format string. --- client/client.pro | 8 +- client/resumewidget.h | 3 +- client/widgetbuilder.cc | 26 ++++++- client/widgets.h | 2 + client/widgets/altcombobox.cc | 177 ++++++++++++++++++++++++++++++++++++++++++ client/widgets/altcombobox.h | 62 +++++++++++++++ client/widgets/metawidget.cc | 117 ++++++++++++++++++++++++++++ client/widgets/metawidget.h | 57 ++++++++++++++ client/widgets/multilist.cc | 64 ++++++--------- client/widgets/multilist.h | 2 +- 10 files changed, 471 insertions(+), 47 deletions(-) create mode 100644 client/widgets/altcombobox.cc create mode 100644 client/widgets/altcombobox.h create mode 100644 client/widgets/metawidget.cc create mode 100644 client/widgets/metawidget.h diff --git a/client/client.pro b/client/client.pro index 9cc726b..61b63fb 100644 --- a/client/client.pro +++ b/client/client.pro @@ -47,7 +47,9 @@ HEADERS += \ widgets/radiobutton.h \ widgets/radiobuttons.h \ widgets/checkbox.h \ - widgets/window.h + widgets/window.h \ + widgets/altcombobox.h \ + widgets/metawidget.h SOURCES += \ pracro.cc \ @@ -74,4 +76,6 @@ SOURCES += \ widgets/radiobutton.cc \ widgets/radiobuttons.cc \ widgets/checkbox.cc \ - widgets/window.cc + widgets/window.cc \ + widgets/altcombobox.cc \ + widgets/metawidget.cc diff --git a/client/resumewidget.h b/client/resumewidget.h index 79fd7f5..4b0eba9 100644 --- a/client/resumewidget.h +++ b/client/resumewidget.h @@ -32,12 +32,13 @@ class ResumeWidget : public QWidget { public: - ResumeWidget(); + ResumeWidget(bool compact); void setText(QString text); private: QLabel *resume; + bool compact; }; #endif/*__PRACRO_RESUMEWIDGET_H__*/ diff --git a/client/widgetbuilder.cc b/client/widgetbuilder.cc index e688f60..3d47d41 100644 --- a/client/widgetbuilder.cc +++ b/client/widgetbuilder.cc @@ -107,8 +107,26 @@ QVector< Widget* > widgetBuilder(QDomNode xml_node, QWidget *parent, MacroWindow widgets.push_back(multilist); widget = multilist; - if(parent != NULL && widget != NULL) parent->layout()->addWidget(widget); - if(widget != NULL) widget->show(); + if(parent && widget && parent->layout()) parent->layout()->addWidget(widget); + if(widget) widget->show(); + + return widgets; // Don't iterate children + } else if(xml_elem.tagName() == "altcombobox") { + AltComboBox *altcombobox = new AltComboBox(xml_elem, macrowindow); + widgets.push_back(altcombobox); + widget = altcombobox; + + if(parent && widget && parent->layout()) parent->layout()->addWidget(widget); + if(widget) widget->show(); + + return widgets; // Don't iterate children + } else if(xml_elem.tagName() == "metawidget") { + MetaWidget *metawidget = new MetaWidget(xml_elem, macrowindow); + widgets.push_back(metawidget); + widget = metawidget; + + if(parent && widget && parent->layout()) parent->layout()->addWidget(widget); + if(widget) widget->show(); return widgets; // Don't iterate children } @@ -120,8 +138,8 @@ QVector< Widget* > widgetBuilder(QDomNode xml_node, QWidget *parent, MacroWindow widgets += widgetBuilder(child, widget, macrowindow); } - if(parent != NULL && widget != NULL) parent->layout()->addWidget(widget); - if(widget != NULL) widget->show(); + if(parent && widget && parent->layout()) parent->layout()->addWidget(widget); + if(widget) widget->show(); return widgets; } diff --git a/client/widgets.h b/client/widgets.h index 34434c1..dda0213 100644 --- a/client/widgets.h +++ b/client/widgets.h @@ -42,5 +42,7 @@ #include "widgets/radiobutton.h" #include "widgets/checkbox.h" #include "widgets/window.h" +#include "widgets/altcombobox.h" +#include "widgets/metawidget.h" #endif/*__PRACRO_WIDGETS_H__*/ diff --git a/client/widgets/altcombobox.cc b/client/widgets/altcombobox.cc new file mode 100644 index 0000000..1dc874f --- /dev/null +++ b/client/widgets/altcombobox.cc @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * altcombobox.cc + * + * Tue Nov 25 08:18:10 CET 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 "altcombobox.h" + +#include +#include + +#include "common.h" +#include "widgetbuilder.h" + +#include + +AltComboBox::AltComboBox(QDomNode &node, MacroWindow *macrowindow) + : QFrame(), Widget(node, macrowindow) +{ + innerwidget = NULL; + + setCommonAttributes(this, node); + setCommonLayout(this, node); + + combobox = new ComboBox(node, macrowindow); + layout()->addWidget(combobox); + combobox->show(); + + altframe = new QFrame(); + layout()->addWidget(altframe); + + QVector< Widget* > widgets; + + QString iwname; + + QDomNodeList items = node.childNodes(); + for(int i = 0; i < items.count(); i++) { + QDomElement item = items.at(i).toElement(); + + if(item.tagName() == "altitem") { + + if(item.hasAttribute("value")) { + altvalue = item.attribute("value"); + } else { + printf("ERROR: altitem tag is missing the value attribute, in altcombobox!\n"); + } + + if(item.hasAttribute("innerwidget")) { + iwname = item.attribute("innerwidget"); + } else { + printf("ERROR: altitem tag is missing the innerwidget attribute, in altcombobox!\n"); + } + + if(item.hasAttribute("layout")) { + if(item.attribute("layout") == "hbox") { + QHBoxLayout *layout = new QHBoxLayout(); + altframe->setLayout(layout); + } else if(item.attribute("layout") == "vbox") { + QVBoxLayout *layout = new QVBoxLayout(); + altframe->setLayout(layout); + } + } else { + QHBoxLayout *layout = new QHBoxLayout(); + altframe->setLayout(layout); + } + + QDomNodeList children = item.childNodes(); + for(int i = 0; i < children.count(); i++) { + QDomNode child = children.at(i); + widgets += widgetBuilder(child, altframe, macrowindow); + } + } + + } + macrowindow->addAuxWidgets(widgets); + /* + QVector< Widget* >::iterator ws = widgets.begin(); + while(ws != widgets.end()) { + if((*ws)->getName() == iwname) innerwidget = *ws; + ws++; + } + */ + + innerwidget = macrowindow->getWidget(iwname); + + if(innerwidget == NULL) { + printf("ERROR: Inner Widget %s not found (in multilist)!\n", + iwname.toStdString().c_str()); + } + + connect(combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(onValueChange(int))); + + layout()->setContentsMargins(0,0,0,0); + altframe->layout()->setContentsMargins(0,0,0,0); +} + +bool AltComboBox::isValid() +{ + if(!combobox->isValid()) return false; + + if(innerwidget && combobox->getValue() == altvalue) { + return innerwidget->isValid(); + } + + return true; +} + +QString AltComboBox::getValue() +{ + if(combobox->getValue() == altvalue) { + if(innerwidget) return innerwidget->getValue(); + else return ""; + } else { + return combobox->getValue(); + } +} + +void AltComboBox::setValue(QString value) +{ + combobox->setValue(value); + + if(combobox->isValid() == false) { // Combobox contain idx == -1 (invalid) if value didn't exist. + combobox->setValue(altvalue); + + printf("Value %s not in combo.\n", value.toStdString().c_str()); + + if(innerwidget) { + printf("\tSetting value on inner widget (%s) to \"%s\".\n", innerwidget->getName().toStdString().c_str(), value.toStdString().c_str()); + printf("\told value (%s).\n", innerwidget->getValue().toStdString().c_str()); + innerwidget->setValue(value); + } else { + printf("Could not set value in AltComboBox, no innerwidget!\n"); + } + altframe->setEnabled(true); + } else { + altframe->setEnabled(false); + } +} + +void AltComboBox::onValueChange(int index) +{ + if(combobox->itemData(index).toString() == altvalue) { + altframe->setEnabled(true); + } else { + altframe->setEnabled(false); + } +} + +void AltComboBox::enable() +{ + setEnabled(true); +} + +void AltComboBox::disable() +{ + setEnabled(false); +} diff --git a/client/widgets/altcombobox.h b/client/widgets/altcombobox.h new file mode 100644 index 0000000..c75b964 --- /dev/null +++ b/client/widgets/altcombobox.h @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * altcombobox.h + * + * Tue Nov 25 08:18:10 CET 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_ALTCOMBOBOX_H__ +#define __PRACRO_ALTCOMBOBOX_H__ + +#include "widget.h" + +#include "combobox.h" + +#include +#include +#include + +class AltComboBox : public QFrame, public Widget +{ +Q_OBJECT +public: + AltComboBox(QDomNode &node, MacroWindow *macrowindow); + + bool isValid(); + + QString getValue(); + void setValue(QString value); + + void enable(); + void disable(); + +public slots: + void onValueChange(int index); + +private: + ComboBox *combobox; + Widget *innerwidget; + QString altvalue; + QWidget *altframe; +}; + +#endif/*__PRACRO_ALTCOMBOBOX_H__*/ diff --git a/client/widgets/metawidget.cc b/client/widgets/metawidget.cc new file mode 100644 index 0000000..5f53153 --- /dev/null +++ b/client/widgets/metawidget.cc @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * metawidget.cc + * + * Wed Nov 26 08:51:52 CET 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 "metawidget.h" + +#include +#include + +#include "widgetbuilder.h" +#include "formatparser.h" + +#include "common.h" + +MetaWidget::MetaWidget(QDomNode &node, MacroWindow *macrowindow) + : QFrame(), Widget(node, macrowindow) +{ + setCommonAttributes(this, node); + + QDomElement elem = node.toElement(); + if(elem.hasAttribute("layout")) { + if(elem.attribute("layout") == "hbox") { + QHBoxLayout *layout = new QHBoxLayout(); + setLayout(layout); + } else if (elem.attribute("layout") == "vbox") { + QVBoxLayout *layout = new QVBoxLayout(); + setLayout(layout); + } + } else { + QHBoxLayout *layout = new QHBoxLayout(); + setLayout(layout); + } + + layout()->setContentsMargins(0,0,0,0); + + QDomNodeList children = node.childNodes(); + + for (int i=0; iaddAuxWidgets(widgets); + + /* // This is done later + 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++; + } + } + + if(elem.hasAttribute("width")) { + setMinimumWidth(elem.attribute("width").toInt()); + } + + if(elem.hasAttribute("height")) { + setMinimumHeight(elem.attribute("height").toInt()); + } + + layout()->setContentsMargins(0,0,0,0); +} + +void MetaWidget::changed() +{ +} + +QString MetaWidget::getValue() +{ + return format_parser(format, widgets); +} + +void MetaWidget::setValue(QString /*values*/) +{ + // Nothing reasonable we can do here. +} + +void MetaWidget::enable() +{ + setEnabled(true); +} + +void MetaWidget::disable() +{ + setEnabled(false); +} diff --git a/client/widgets/metawidget.h b/client/widgets/metawidget.h new file mode 100644 index 0000000..5d0bbc9 --- /dev/null +++ b/client/widgets/metawidget.h @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * metawidget.h + * + * Wed Nov 26 08:51:52 CET 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_METAWIDGET_H__ +#define __PRACRO_METAWIDGET_H__ + +#include "widget.h" +#include +#include + +#include +#include + +class MetaWidget : public QFrame, public Widget +{ +Q_OBJECT +public: + MetaWidget(QDomNode &node, MacroWindow *macrowindow); + +public slots: + void changed(); + QString getValue(); + void setValue(QString value); + + void enable(); + void disable(); + +private: + QListWidget *list; + QVector< Widget* > widgets; + QString format; +}; + +#endif/*__PRACRO_METAWIDGET_H__*/ diff --git a/client/widgets/multilist.cc b/client/widgets/multilist.cc index a33c054..d83423c 100644 --- a/client/widgets/multilist.cc +++ b/client/widgets/multilist.cc @@ -32,7 +32,6 @@ #include #include "widgetbuilder.h" -#include "formatparser.h" #include "common.h" @@ -61,17 +60,34 @@ MultiList::MultiList(QDomNode &node, MacroWindow *macrowindow) QHBoxLayout *layout = new QHBoxLayout(); inputbox->setLayout(layout); } - + inputbox->layout()->setContentsMargins(0,0,0,0); QDomNodeList children = node.childNodes(); - + + QVector< Widget* > widgets; for (int i=0; iaddAuxWidgets(widgets); - + + innerwidget = NULL; + if(elem.hasAttribute("innerwidget")) { + QString iwname = elem.attribute("innerwidget"); + QVector< Widget* >::iterator ws = widgets.begin(); + while(ws != widgets.end()) { + if((*ws)->getName() == iwname) innerwidget = *ws; + ws++; + } + if(innerwidget == NULL) { + printf("ERROR: Inner Widget %s not found (in multilist)!\n", + iwname.toStdString().c_str()); + } + } else { + printf("ERROR: Missing 'innerwidget' attribute on multilist!\n"); + } + QPushButton *add = new QPushButton(this); connect(add, SIGNAL(clicked()), this, SLOT(add())); add->setText("Tilføj"); @@ -94,41 +110,6 @@ MultiList::MultiList(QDomNode &node, MacroWindow *macrowindow) } */ - 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++; - } - } - - /* - QVector< Widget* >::iterator i = widgets.begin(); - while (i != widgets.end()) { - for (int j = 0; j < children.count(); j++) { - QDomNode child = children.at(j); - QDomElement elem = child.toElement(); - if(elem.attribute("name") == (*i)->getName()) { - printf("Set\n"); - (*i)->setValue(elem.attribute("value")); - } - } - i++; - } - */ - - if(elem.hasAttribute("width")) { - setMinimumWidth(elem.attribute("width").toInt()); - } - - if(elem.hasAttribute("height")) { - setMinimumHeight(elem.attribute("height").toInt()); - } - layout->setContentsMargins(0,0,0,0); } @@ -173,12 +154,17 @@ void MultiList::remove() void MultiList::add() { + /* QVector< Widget * >::iterator i = widgets.begin(); while(i != widgets.end()) { if(!(*i)->isValid()) return; i++; } list->addItem(format_parser(format, widgets)); + */ + + if(innerwidget && innerwidget->isValid()) list->addItem(innerwidget->getValue()); + } void MultiList::enable() diff --git a/client/widgets/multilist.h b/client/widgets/multilist.h index 276c1b1..0a9e798 100644 --- a/client/widgets/multilist.h +++ b/client/widgets/multilist.h @@ -53,7 +53,7 @@ public slots: private: QListWidget *list; - QVector< Widget* > widgets; + Widget *innerwidget; QString format; }; -- cgit v1.2.3