/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * multilist.cc * * Mon Jun 16 15:31:24 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 "multilist.h" #include #include #include #include #include "widgetbuilder.h" #include "common.h" MultiList::MultiList(QDomNode &node, MacroWindow *macrowindow) : QFrame(), Widget(node, macrowindow) { setCommonAttributes(this, node); QGridLayout *layout = new QGridLayout(); setLayout(layout); list = new QListWidget(this); layout->addWidget(list, 0, 0, 1, 2, Qt::AlignTop); list->installEventFilter(this); QPushButton *add = new QPushButton(this); connect(add, SIGNAL(clicked()), this, SLOT(add())); add->setText("Tilføj nedenstående til listen"); add->setIcon(QIcon(QPixmap(":icons/add.png"))); layout->addWidget(add, 1, 0, 1, 1, Qt::AlignTop); QPushButton *rem = new QPushButton(this); connect(rem, SIGNAL(clicked()), this, SLOT(remove())); rem->setText("Fjern det markerede element fra listen"); rem->setIcon(QIcon(QPixmap(":icons/del.png"))); layout->addWidget(rem, 1, 1, 1, 1, Qt::AlignTop); QLabel *arrows = new QLabel(); arrows->setPixmap(QPixmap(":icons/arrows.png")); layout->addWidget(arrows, 2, 0, 1, 2, Qt::AlignHCenter); QWidget *inputbox = new QWidget(this); inputbox->setContentsMargins(0,0,0,0); layout->addWidget(inputbox, 3, 0, 1, 2, Qt::AlignTop); QDomElement elem = node.toElement(); if(elem.hasAttribute("layout")) { if(elem.attribute("layout") == "hbox") { QHBoxLayout *layout = new QHBoxLayout(); inputbox->setLayout(layout); } else if (elem.attribute("layout") == "vbox") { QVBoxLayout *layout = new QVBoxLayout(); inputbox->setLayout(layout); } } else { 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"); } layout->setContentsMargins(0,0,0,0); } void MultiList::changed() { } QString MultiList::getValue() { QString values; QList items = list->findItems("*", Qt::MatchWildcard); QList::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 source) { if(isUserSource(source)) emit wasChanged(); QString value; list->clear(); int idx = 0; do { value = values.section('\n', idx, idx); if(value != "") list->addItem(value); idx++; } while(value != ""); setInitialValue(values); } void MultiList::remove() { QListWidgetItem *item = list->currentItem(); if(item && item->isSelected()) { delete item; emit wasChanged(); } } void MultiList::add() { if(innerwidget && innerwidget->isValid()) { list->addItem(innerwidget->getValue()); emit wasChanged(); innerwidget->reset(); } } void MultiList::enable() { setEnabled(true); } void MultiList::disable() { setEnabled(false); } bool MultiList::isDisabled() { return isEnabled() == false; } void MultiList::connectFrom(const char *signal, const QObject *receiver, const char *method) { connect(this, signal, receiver, method); } void MultiList::connectTo(const QObject *sender, const char *signal, const char *method) { connect(sender, signal, this, method); } bool MultiList::setKeyboardFocus() { if(innerwidget) return innerwidget->setKeyboardFocus(); return false; } bool MultiList::eventFilter(QObject *obj, QEvent *event) { if(event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); if(keyEvent->key() == Qt::Key_Delete) remove(); } return QObject::eventFilter(obj, event); } void MultiList::setVisibility(bool visible) { setVisible(visible); }