lbajardsilogic@7: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@7: lbajardsilogic@7: /* Sound Access lbajardsilogic@7: EASAIER client application. lbajardsilogic@7: Silogic 2007. Laure Bajard. lbajardsilogic@7: lbajardsilogic@7: This program is free software; you can redistribute it and/or lbajardsilogic@7: modify it under the terms of the GNU General Public License as lbajardsilogic@7: published by the Free Software Foundation; either version 2 of the lbajardsilogic@7: License, or (at your option) any later version. See the file lbajardsilogic@7: COPYING included with this distribution for more information. lbajardsilogic@7: */ lbajardsilogic@7: lbajardsilogic@7: #include "SearchWidget.h" lbajardsilogic@7: benoitrigolleau@162: lbajardsilogic@7: #include lbajardsilogic@7: #include lbajardsilogic@7: #include lbajardsilogic@7: #include lbajardsilogic@7: #include lbajardsilogic@7: #include lbajardsilogic@7: #include lbajardsilogic@93: #include lbajardsilogic@7: lbajardsilogic@7: #include lbajardsilogic@7: lbajardsilogic@7: #include "sv/main/MainWindow.h" lbajardsilogic@228: #include "BrowseLineEdit.h" lbajardsilogic@7: lbajardsilogic@7: SearchWidget::SearchWidget() : QWidget(), lbajardsilogic@7: m_curThemeWidget(0), lbajardsilogic@7: m_curBoxLayout(0), lbajardsilogic@7: m_curBoxRow(0) lbajardsilogic@7: { lbajardsilogic@7: QVBoxLayout *mainLayout = new QVBoxLayout; lbajardsilogic@7: mainLayout->setSpacing(15); lbajardsilogic@7: lbajardsilogic@7: m_buttonLayout = new QHBoxLayout; lbajardsilogic@7: lbajardsilogic@7: m_themesLayout = new QStackedLayout; lbajardsilogic@7: lbajardsilogic@7: QWidget *stackedWidget = new QWidget; lbajardsilogic@7: stackedWidget->setLayout(m_themesLayout); lbajardsilogic@7: lbajardsilogic@7: QScrollArea * scrollArea = new QScrollArea; lbajardsilogic@7: scrollArea->setWidget(stackedWidget); lbajardsilogic@7: scrollArea->setWidgetResizable(true); lbajardsilogic@7: lbajardsilogic@7: QHBoxLayout *searchButtonLayout = new QHBoxLayout; lbajardsilogic@7: m_searchButton = new QPushButton(tr("Search")); lbajardsilogic@93: QPalette palette; lbajardsilogic@93: palette.setColor(QPalette::Button,palette.color(QPalette::Highlight)); lbajardsilogic@93: m_searchButton->setPalette(palette); lbajardsilogic@94: m_searchButton->setDefault(true); lbajardsilogic@7: searchButtonLayout->addStretch(1); lbajardsilogic@7: searchButtonLayout->addWidget(m_searchButton); lbajardsilogic@7: lbajardsilogic@7: mainLayout->addLayout(m_buttonLayout); lbajardsilogic@7: mainLayout->addWidget(scrollArea); lbajardsilogic@7: mainLayout->addLayout(searchButtonLayout); lbajardsilogic@7: lbajardsilogic@7: setLayout(mainLayout); lbajardsilogic@7: lbajardsilogic@7: connect(m_searchButton, SIGNAL(clicked()), MainWindow::instance(), SLOT(queryDatabase())); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: SearchWidget::~SearchWidget() lbajardsilogic@7: { lbajardsilogic@7: reset(); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: void SearchWidget::reset() lbajardsilogic@7: { lbajardsilogic@7: QLayoutItem *child; lbajardsilogic@7: lbajardsilogic@7: while ((child = m_buttonLayout->takeAt(0)) != 0) { lbajardsilogic@7: delete child->widget(); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: while ((child = m_themesLayout->takeAt(0)) != 0) { lbajardsilogic@7: delete child->widget(); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: m_themes.clear(); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: void SearchWidget::displayQuerymodel(QueryModel* queryModel) lbajardsilogic@7: { lbajardsilogic@7: QueryThemeModel* curTheme; lbajardsilogic@7: lbajardsilogic@7: std::map themes = queryModel->getThemes(); lbajardsilogic@7: lbajardsilogic@7: std::map::iterator iter; lbajardsilogic@7: lbajardsilogic@7: m_buttonLayout->addStretch(1); lbajardsilogic@7: lbajardsilogic@7: for (iter = themes.begin(); iter != themes.end(); iter++) lbajardsilogic@7: { lbajardsilogic@7: //add a new widget to StackedLayout for each theme lbajardsilogic@7: curTheme = iter->second; lbajardsilogic@7: addTheme(curTheme->getName(), curTheme->getLabel()); lbajardsilogic@7: lbajardsilogic@7: PropertyContainer::PropertyList properList = curTheme->getProperties(); lbajardsilogic@7: PropertyContainer::PropertyList::iterator propertyIter; lbajardsilogic@7: lbajardsilogic@7: QString groupName = ""; lbajardsilogic@7: lbajardsilogic@7: for (propertyIter = properList.begin(); propertyIter < properList.end(); propertyIter++) lbajardsilogic@7: { lbajardsilogic@7: //add new fields for each of the theme property (that can be grouped) lbajardsilogic@7: QString name = *propertyIter; lbajardsilogic@7: lbajardsilogic@7: if (groupName != curTheme->getPropertyGroup(name)) lbajardsilogic@7: {//newfieldgroup lbajardsilogic@7: endFieldGroup(); lbajardsilogic@7: groupName = curTheme->getPropertyGroup(name); lbajardsilogic@7: addFieldGroup(groupName, curTheme->getPropertyGroupLabel(name)); lbajardsilogic@7: } lbajardsilogic@7: addField(name, curTheme); lbajardsilogic@7: } lbajardsilogic@7: endFieldGroup(); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: m_buttonLayout->addStretch(1); lbajardsilogic@7: lbajardsilogic@7: QString themeName = getActiveTheme(); lbajardsilogic@7: m_searchButton->setObjectName(themeName); lbajardsilogic@70: highlightThemeButton(themeName); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: void SearchWidget::addTheme(const QString &name, const QString &label) lbajardsilogic@7: { lbajardsilogic@7: QPushButton * themeButton = new QPushButton(label); lbajardsilogic@7: themeButton->setObjectName(name); benoitrigolleau@78: benoitrigolleau@78: themeButton->setIcon(QIcon(":icons/"+label.toLower()+"Icon.png")); lbajardsilogic@7: m_buttonLayout->addWidget(themeButton); lbajardsilogic@7: lbajardsilogic@7: m_curThemeWidget = new AdvancedToolBox(); lbajardsilogic@7: m_curThemeWidget->setObjectName(name); lbajardsilogic@7: lbajardsilogic@7: m_themes[QString(name)] = m_themesLayout->addWidget(m_curThemeWidget); lbajardsilogic@7: lbajardsilogic@7: connect(themeButton, SIGNAL(clicked()), this, SLOT(activeTheme())); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: void SearchWidget::addFieldGroup(const QString &name, const QString &label) lbajardsilogic@7: { lbajardsilogic@7: QWidget *groupBox = new QWidget(); lbajardsilogic@7: groupBox->setObjectName(name); lbajardsilogic@7: lbajardsilogic@7: m_curBoxLayout = new QGridLayout(); lbajardsilogic@7: m_curBoxLayout->setObjectName(name); lbajardsilogic@7: lbajardsilogic@7: groupBox->setLayout(m_curBoxLayout); lbajardsilogic@7: m_curThemeWidget->addItem(label,groupBox); lbajardsilogic@7: lbajardsilogic@7: m_curBoxRow = 0; lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: void SearchWidget::endFieldGroup() lbajardsilogic@7: { lbajardsilogic@7: m_curBoxLayout = 0; lbajardsilogic@7: m_curBoxRow = 0; lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: void SearchWidget::addField(const QString &name, QueryThemeModel* curTheme) lbajardsilogic@7: { lbajardsilogic@7: QWidget* field = 0; lbajardsilogic@7: lbajardsilogic@7: QLabel * metadata = new QLabel(curTheme->getPropertyLabel(name)); lbajardsilogic@7: metadata->setObjectName(name); lbajardsilogic@7: lbajardsilogic@7: m_curBoxLayout->addWidget(metadata, m_curBoxRow, 0); lbajardsilogic@7: lbajardsilogic@7: PropertyContainer::PropertyType type = curTheme->getPropertyType(name); lbajardsilogic@7: lbajardsilogic@228: QString unit = curTheme->getPropertyUnit(name); lbajardsilogic@228: lbajardsilogic@7: switch (type) //draw a different widget according to the datatype lbajardsilogic@7: { lbajardsilogic@7: case PropertyContainer::StringProperty: lbajardsilogic@7: { lbajardsilogic@7: QLineEdit * lineEdit = new QLineEdit(); lbajardsilogic@7: lbajardsilogic@7: connect(lineEdit, SIGNAL(textChanged(const QString &)), curTheme, SLOT(setProperty(QString))); lbajardsilogic@7: lbajardsilogic@7: field = lineEdit; lbajardsilogic@7: lbajardsilogic@7: break; lbajardsilogic@7: } lbajardsilogic@7: case PropertyContainer::ValueProperty: lbajardsilogic@7: { lbajardsilogic@7: QComboBox* box = new QComboBox(); benoitrigolleau@162: box->setStyleSheet("background-color:white;"); benoitrigolleau@162: benoitrigolleau@159: lbajardsilogic@7: box->addItems(curTheme->getPropertyRange(name)); lbajardsilogic@242: lbajardsilogic@7: connect(box, SIGNAL(currentIndexChanged(int)), curTheme, SLOT(setProperty(int))); lbajardsilogic@7: lbajardsilogic@7: field = box; lbajardsilogic@7: lbajardsilogic@7: break; lbajardsilogic@7: } lbajardsilogic@7: case PropertyContainer::RangeProperty: lbajardsilogic@7: { lbajardsilogic@7: QSpinBox* box = new QSpinBox(); lbajardsilogic@7: lbajardsilogic@7: int min; lbajardsilogic@7: int max; lbajardsilogic@7: lbajardsilogic@7: int value = curTheme->getPropertyRangeAndValue(name, &min, &max); lbajardsilogic@7: lbajardsilogic@7: if (min != 0) lbajardsilogic@7: box->setMinimum(min); lbajardsilogic@7: lbajardsilogic@7: if (max != 0) lbajardsilogic@7: box->setMaximum(max); lbajardsilogic@7: lbajardsilogic@7: box->setValue(value); lbajardsilogic@7: lbajardsilogic@7: connect(box, SIGNAL(valueChanged(int)), curTheme, SLOT(setProperty(int))); lbajardsilogic@7: lbajardsilogic@7: field = box; lbajardsilogic@7: lbajardsilogic@7: break; lbajardsilogic@7: } lbajardsilogic@228: case PropertyContainer::FileProperty: lbajardsilogic@228: { lbajardsilogic@228: BrowseLineEdit * browseLineEdit = new BrowseLineEdit(); lbajardsilogic@228: lbajardsilogic@228: connect(browseLineEdit, SIGNAL(textChanged(const QString &)), curTheme, SLOT(setProperty(QString))); lbajardsilogic@228: lbajardsilogic@228: m_curBoxLayout->addWidget(browseLineEdit, m_curBoxRow, 2); lbajardsilogic@228: lbajardsilogic@228: field = browseLineEdit; lbajardsilogic@228: lbajardsilogic@228: break; lbajardsilogic@228: } lbajardsilogic@7: lbajardsilogic@7: default: break; lbajardsilogic@7: lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: if (field) lbajardsilogic@7: { lbajardsilogic@7: field->setObjectName(name); lbajardsilogic@7: m_curBoxLayout->addWidget(field, m_curBoxRow, 1); lbajardsilogic@7: } lbajardsilogic@228: lbajardsilogic@7: if (unit != "") lbajardsilogic@7: { lbajardsilogic@7: m_curBoxLayout->addWidget(new QLabel(unit), m_curBoxRow, 2); lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: m_curBoxRow++; lbajardsilogic@7: lbajardsilogic@7: QString comment = curTheme->getPropertyComment(name); lbajardsilogic@7: lbajardsilogic@7: if (comment != "") lbajardsilogic@7: { lbajardsilogic@7: m_curBoxLayout->addWidget(new QLabel(comment), m_curBoxRow, 1); lbajardsilogic@7: m_curBoxRow++; lbajardsilogic@7: } lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: void SearchWidget::activeTheme() lbajardsilogic@7: { lbajardsilogic@7: QString name = sender()->objectName(); lbajardsilogic@7: lbajardsilogic@70: m_searchButton->setObjectName(name); lbajardsilogic@70: lbajardsilogic@70: highlightThemeButton(name); lbajardsilogic@7: lbajardsilogic@7: std::map::iterator iter = m_themes.find(name); lbajardsilogic@7: lbajardsilogic@7: if (iter != m_themes.end()) lbajardsilogic@70: { lbajardsilogic@7: m_themesLayout->setCurrentIndex(iter->second); lbajardsilogic@70: } lbajardsilogic@70: } lbajardsilogic@70: lbajardsilogic@70: void SearchWidget::highlightThemeButton(QString &name) lbajardsilogic@70: { lbajardsilogic@70: QLayoutItem *child; lbajardsilogic@70: lbajardsilogic@70: for (int i = 0; icount(); i++ ) lbajardsilogic@70: { lbajardsilogic@70: child = m_buttonLayout->itemAt(i); lbajardsilogic@70: QPushButton* button = (QPushButton*) child->widget(); lbajardsilogic@70: if (button) lbajardsilogic@70: { lbajardsilogic@70: if (name == button->objectName()) lbajardsilogic@70: { lbajardsilogic@70: QPalette palette; lbajardsilogic@70: palette.setColor(QPalette::Button,palette.color(QPalette::Highlight)); lbajardsilogic@70: button->setPalette(palette); lbajardsilogic@70: } lbajardsilogic@70: else lbajardsilogic@70: { lbajardsilogic@70: QPalette palette; lbajardsilogic@70: button->setPalette(palette); lbajardsilogic@70: } lbajardsilogic@70: } lbajardsilogic@70: } lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: QString SearchWidget::getActiveTheme() lbajardsilogic@7: { lbajardsilogic@7: int index = m_themesLayout->currentIndex(); lbajardsilogic@7: lbajardsilogic@7: std::map::iterator iter; lbajardsilogic@7: lbajardsilogic@7: for (iter = m_themes.begin(); iter != m_themes.end(); iter++) lbajardsilogic@7: { lbajardsilogic@7: if (iter->second == index) lbajardsilogic@7: return iter->first; lbajardsilogic@7: } lbajardsilogic@7: lbajardsilogic@7: return ""; lbajardsilogic@7: } lbajardsilogic@93: lbajardsilogic@93: void SearchWidget::keyPressEvent( QKeyEvent * e ) lbajardsilogic@93: { lbajardsilogic@93: int key = e->key(); lbajardsilogic@93: if ((key == Qt::Key_Enter) || (key == Qt::Key_Return)) lbajardsilogic@93: { lbajardsilogic@93: m_searchButton->click(); lbajardsilogic@93: } lbajardsilogic@93: }