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/widgets/altcombobox.cc | 177 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 client/widgets/altcombobox.cc (limited to 'client/widgets/altcombobox.cc') 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); +} -- cgit v1.2.3