annotate widgets/SearchWidget.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 60e84bb658bc
children
rev   line source
lbajardsilogic@7 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@7 2
lbajardsilogic@7 3 /* Sound Access
lbajardsilogic@7 4 EASAIER client application.
lbajardsilogic@7 5 Silogic 2007. Laure Bajard.
lbajardsilogic@7 6
lbajardsilogic@7 7 This program is free software; you can redistribute it and/or
lbajardsilogic@7 8 modify it under the terms of the GNU General Public License as
lbajardsilogic@7 9 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@7 10 License, or (at your option) any later version. See the file
lbajardsilogic@7 11 COPYING included with this distribution for more information.
lbajardsilogic@7 12 */
lbajardsilogic@7 13
lbajardsilogic@7 14 #include "SearchWidget.h"
lbajardsilogic@7 15
benoitrigolleau@162 16
lbajardsilogic@7 17 #include <QGroupBox>
lbajardsilogic@7 18 #include <QLabel>
lbajardsilogic@7 19 #include <QLineEdit>
lbajardsilogic@7 20 #include <QComboBox>
lbajardsilogic@7 21 #include <QSpinBox>
lbajardsilogic@7 22 #include <QPushButton>
lbajardsilogic@7 23 #include <QScrollArea>
lbajardsilogic@93 24 #include <QKeyEvent>
lbajardsilogic@7 25
lbajardsilogic@7 26 #include <iostream>
lbajardsilogic@7 27
lbajardsilogic@7 28 #include "sv/main/MainWindow.h"
lbajardsilogic@228 29 #include "BrowseLineEdit.h"
lbajardsilogic@7 30
lbajardsilogic@7 31 SearchWidget::SearchWidget() : QWidget(),
lbajardsilogic@7 32 m_curThemeWidget(0),
lbajardsilogic@7 33 m_curBoxLayout(0),
lbajardsilogic@7 34 m_curBoxRow(0)
lbajardsilogic@7 35 {
lbajardsilogic@7 36 QVBoxLayout *mainLayout = new QVBoxLayout;
lbajardsilogic@7 37 mainLayout->setSpacing(15);
lbajardsilogic@7 38
lbajardsilogic@7 39 m_buttonLayout = new QHBoxLayout;
lbajardsilogic@7 40
lbajardsilogic@7 41 m_themesLayout = new QStackedLayout;
lbajardsilogic@7 42
lbajardsilogic@7 43 QWidget *stackedWidget = new QWidget;
lbajardsilogic@7 44 stackedWidget->setLayout(m_themesLayout);
lbajardsilogic@7 45
lbajardsilogic@7 46 QScrollArea * scrollArea = new QScrollArea;
lbajardsilogic@7 47 scrollArea->setWidget(stackedWidget);
lbajardsilogic@7 48 scrollArea->setWidgetResizable(true);
lbajardsilogic@7 49
lbajardsilogic@7 50 QHBoxLayout *searchButtonLayout = new QHBoxLayout;
lbajardsilogic@7 51 m_searchButton = new QPushButton(tr("Search"));
lbajardsilogic@93 52 QPalette palette;
lbajardsilogic@93 53 palette.setColor(QPalette::Button,palette.color(QPalette::Highlight));
lbajardsilogic@93 54 m_searchButton->setPalette(palette);
lbajardsilogic@94 55 m_searchButton->setDefault(true);
lbajardsilogic@7 56 searchButtonLayout->addStretch(1);
lbajardsilogic@7 57 searchButtonLayout->addWidget(m_searchButton);
lbajardsilogic@7 58
lbajardsilogic@7 59 mainLayout->addLayout(m_buttonLayout);
lbajardsilogic@7 60 mainLayout->addWidget(scrollArea);
lbajardsilogic@7 61 mainLayout->addLayout(searchButtonLayout);
lbajardsilogic@7 62
lbajardsilogic@7 63 setLayout(mainLayout);
lbajardsilogic@7 64
lbajardsilogic@7 65 connect(m_searchButton, SIGNAL(clicked()), MainWindow::instance(), SLOT(queryDatabase()));
lbajardsilogic@7 66 }
lbajardsilogic@7 67
lbajardsilogic@7 68 SearchWidget::~SearchWidget()
lbajardsilogic@7 69 {
lbajardsilogic@7 70 reset();
lbajardsilogic@7 71 }
lbajardsilogic@7 72
lbajardsilogic@7 73 void SearchWidget::reset()
lbajardsilogic@7 74 {
lbajardsilogic@7 75 QLayoutItem *child;
lbajardsilogic@7 76
lbajardsilogic@7 77 while ((child = m_buttonLayout->takeAt(0)) != 0) {
lbajardsilogic@7 78 delete child->widget();
lbajardsilogic@7 79 }
lbajardsilogic@7 80
lbajardsilogic@7 81 while ((child = m_themesLayout->takeAt(0)) != 0) {
lbajardsilogic@7 82 delete child->widget();
lbajardsilogic@7 83 }
lbajardsilogic@7 84
lbajardsilogic@7 85 m_themes.clear();
lbajardsilogic@7 86 }
lbajardsilogic@7 87
lbajardsilogic@7 88 void SearchWidget::displayQuerymodel(QueryModel* queryModel)
lbajardsilogic@7 89 {
lbajardsilogic@7 90 QueryThemeModel* curTheme;
lbajardsilogic@7 91
lbajardsilogic@7 92 std::map<QString , QueryThemeModel* > themes = queryModel->getThemes();
lbajardsilogic@7 93
lbajardsilogic@7 94 std::map<QString , QueryThemeModel* >::iterator iter;
lbajardsilogic@7 95
lbajardsilogic@7 96 m_buttonLayout->addStretch(1);
lbajardsilogic@7 97
lbajardsilogic@7 98 for (iter = themes.begin(); iter != themes.end(); iter++)
lbajardsilogic@7 99 {
lbajardsilogic@7 100 //add a new widget to StackedLayout for each theme
lbajardsilogic@7 101 curTheme = iter->second;
lbajardsilogic@7 102 addTheme(curTheme->getName(), curTheme->getLabel());
lbajardsilogic@7 103
lbajardsilogic@7 104 PropertyContainer::PropertyList properList = curTheme->getProperties();
lbajardsilogic@7 105 PropertyContainer::PropertyList::iterator propertyIter;
lbajardsilogic@7 106
lbajardsilogic@7 107 QString groupName = "";
lbajardsilogic@7 108
lbajardsilogic@7 109 for (propertyIter = properList.begin(); propertyIter < properList.end(); propertyIter++)
lbajardsilogic@7 110 {
lbajardsilogic@7 111 //add new fields for each of the theme property (that can be grouped)
lbajardsilogic@7 112 QString name = *propertyIter;
lbajardsilogic@7 113
lbajardsilogic@7 114 if (groupName != curTheme->getPropertyGroup(name))
lbajardsilogic@7 115 {//newfieldgroup
lbajardsilogic@7 116 endFieldGroup();
lbajardsilogic@7 117 groupName = curTheme->getPropertyGroup(name);
lbajardsilogic@7 118 addFieldGroup(groupName, curTheme->getPropertyGroupLabel(name));
lbajardsilogic@7 119 }
lbajardsilogic@7 120 addField(name, curTheme);
lbajardsilogic@7 121 }
lbajardsilogic@7 122 endFieldGroup();
lbajardsilogic@7 123 }
lbajardsilogic@7 124
lbajardsilogic@7 125 m_buttonLayout->addStretch(1);
lbajardsilogic@7 126
lbajardsilogic@7 127 QString themeName = getActiveTheme();
lbajardsilogic@7 128 m_searchButton->setObjectName(themeName);
lbajardsilogic@70 129 highlightThemeButton(themeName);
lbajardsilogic@7 130 }
lbajardsilogic@7 131
lbajardsilogic@7 132 void SearchWidget::addTheme(const QString &name, const QString &label)
lbajardsilogic@7 133 {
lbajardsilogic@7 134 QPushButton * themeButton = new QPushButton(label);
lbajardsilogic@7 135 themeButton->setObjectName(name);
benoitrigolleau@78 136
benoitrigolleau@78 137 themeButton->setIcon(QIcon(":icons/"+label.toLower()+"Icon.png"));
lbajardsilogic@7 138 m_buttonLayout->addWidget(themeButton);
lbajardsilogic@7 139
lbajardsilogic@7 140 m_curThemeWidget = new AdvancedToolBox();
lbajardsilogic@7 141 m_curThemeWidget->setObjectName(name);
lbajardsilogic@7 142
lbajardsilogic@7 143 m_themes[QString(name)] = m_themesLayout->addWidget(m_curThemeWidget);
lbajardsilogic@7 144
lbajardsilogic@7 145 connect(themeButton, SIGNAL(clicked()), this, SLOT(activeTheme()));
lbajardsilogic@7 146 }
lbajardsilogic@7 147
lbajardsilogic@7 148 void SearchWidget::addFieldGroup(const QString &name, const QString &label)
lbajardsilogic@7 149 {
lbajardsilogic@7 150 QWidget *groupBox = new QWidget();
lbajardsilogic@7 151 groupBox->setObjectName(name);
lbajardsilogic@7 152
lbajardsilogic@7 153 m_curBoxLayout = new QGridLayout();
lbajardsilogic@7 154 m_curBoxLayout->setObjectName(name);
lbajardsilogic@7 155
lbajardsilogic@7 156 groupBox->setLayout(m_curBoxLayout);
lbajardsilogic@7 157 m_curThemeWidget->addItem(label,groupBox);
lbajardsilogic@7 158
lbajardsilogic@7 159 m_curBoxRow = 0;
lbajardsilogic@7 160 }
lbajardsilogic@7 161
lbajardsilogic@7 162 void SearchWidget::endFieldGroup()
lbajardsilogic@7 163 {
lbajardsilogic@7 164 m_curBoxLayout = 0;
lbajardsilogic@7 165 m_curBoxRow = 0;
lbajardsilogic@7 166 }
lbajardsilogic@7 167
lbajardsilogic@7 168 void SearchWidget::addField(const QString &name, QueryThemeModel* curTheme)
lbajardsilogic@7 169 {
lbajardsilogic@7 170 QWidget* field = 0;
lbajardsilogic@7 171
lbajardsilogic@7 172 QLabel * metadata = new QLabel(curTheme->getPropertyLabel(name));
lbajardsilogic@7 173 metadata->setObjectName(name);
lbajardsilogic@7 174
lbajardsilogic@7 175 m_curBoxLayout->addWidget(metadata, m_curBoxRow, 0);
lbajardsilogic@7 176
lbajardsilogic@7 177 PropertyContainer::PropertyType type = curTheme->getPropertyType(name);
lbajardsilogic@7 178
lbajardsilogic@228 179 QString unit = curTheme->getPropertyUnit(name);
lbajardsilogic@228 180
lbajardsilogic@7 181 switch (type) //draw a different widget according to the datatype
lbajardsilogic@7 182 {
lbajardsilogic@7 183 case PropertyContainer::StringProperty:
lbajardsilogic@7 184 {
lbajardsilogic@7 185 QLineEdit * lineEdit = new QLineEdit();
lbajardsilogic@7 186
lbajardsilogic@7 187 connect(lineEdit, SIGNAL(textChanged(const QString &)), curTheme, SLOT(setProperty(QString)));
lbajardsilogic@7 188
lbajardsilogic@7 189 field = lineEdit;
lbajardsilogic@7 190
lbajardsilogic@7 191 break;
lbajardsilogic@7 192 }
lbajardsilogic@7 193 case PropertyContainer::ValueProperty:
lbajardsilogic@7 194 {
lbajardsilogic@7 195 QComboBox* box = new QComboBox();
benoitrigolleau@162 196 box->setStyleSheet("background-color:white;");
benoitrigolleau@162 197
benoitrigolleau@159 198
lbajardsilogic@7 199 box->addItems(curTheme->getPropertyRange(name));
lbajardsilogic@242 200
lbajardsilogic@7 201 connect(box, SIGNAL(currentIndexChanged(int)), curTheme, SLOT(setProperty(int)));
lbajardsilogic@7 202
lbajardsilogic@7 203 field = box;
lbajardsilogic@7 204
lbajardsilogic@7 205 break;
lbajardsilogic@7 206 }
lbajardsilogic@7 207 case PropertyContainer::RangeProperty:
lbajardsilogic@7 208 {
lbajardsilogic@7 209 QSpinBox* box = new QSpinBox();
lbajardsilogic@7 210
lbajardsilogic@7 211 int min;
lbajardsilogic@7 212 int max;
lbajardsilogic@7 213
lbajardsilogic@7 214 int value = curTheme->getPropertyRangeAndValue(name, &min, &max);
lbajardsilogic@7 215
lbajardsilogic@7 216 if (min != 0)
lbajardsilogic@7 217 box->setMinimum(min);
lbajardsilogic@7 218
lbajardsilogic@7 219 if (max != 0)
lbajardsilogic@7 220 box->setMaximum(max);
lbajardsilogic@7 221
lbajardsilogic@7 222 box->setValue(value);
lbajardsilogic@7 223
lbajardsilogic@7 224 connect(box, SIGNAL(valueChanged(int)), curTheme, SLOT(setProperty(int)));
lbajardsilogic@7 225
lbajardsilogic@7 226 field = box;
lbajardsilogic@7 227
lbajardsilogic@7 228 break;
lbajardsilogic@7 229 }
lbajardsilogic@228 230 case PropertyContainer::FileProperty:
lbajardsilogic@228 231 {
lbajardsilogic@228 232 BrowseLineEdit * browseLineEdit = new BrowseLineEdit();
lbajardsilogic@228 233
lbajardsilogic@228 234 connect(browseLineEdit, SIGNAL(textChanged(const QString &)), curTheme, SLOT(setProperty(QString)));
lbajardsilogic@228 235
lbajardsilogic@228 236 m_curBoxLayout->addWidget(browseLineEdit, m_curBoxRow, 2);
lbajardsilogic@228 237
lbajardsilogic@228 238 field = browseLineEdit;
lbajardsilogic@228 239
lbajardsilogic@228 240 break;
lbajardsilogic@228 241 }
lbajardsilogic@7 242
lbajardsilogic@7 243 default: break;
lbajardsilogic@7 244
lbajardsilogic@7 245 }
lbajardsilogic@7 246
lbajardsilogic@7 247 if (field)
lbajardsilogic@7 248 {
lbajardsilogic@7 249 field->setObjectName(name);
lbajardsilogic@7 250 m_curBoxLayout->addWidget(field, m_curBoxRow, 1);
lbajardsilogic@7 251 }
lbajardsilogic@228 252
lbajardsilogic@7 253 if (unit != "")
lbajardsilogic@7 254 {
lbajardsilogic@7 255 m_curBoxLayout->addWidget(new QLabel(unit), m_curBoxRow, 2);
lbajardsilogic@7 256 }
lbajardsilogic@7 257
lbajardsilogic@7 258 m_curBoxRow++;
lbajardsilogic@7 259
lbajardsilogic@7 260 QString comment = curTheme->getPropertyComment(name);
lbajardsilogic@7 261
lbajardsilogic@7 262 if (comment != "")
lbajardsilogic@7 263 {
lbajardsilogic@7 264 m_curBoxLayout->addWidget(new QLabel(comment), m_curBoxRow, 1);
lbajardsilogic@7 265 m_curBoxRow++;
lbajardsilogic@7 266 }
lbajardsilogic@7 267 }
lbajardsilogic@7 268
lbajardsilogic@7 269 void SearchWidget::activeTheme()
lbajardsilogic@7 270 {
lbajardsilogic@7 271 QString name = sender()->objectName();
lbajardsilogic@7 272
lbajardsilogic@70 273 m_searchButton->setObjectName(name);
lbajardsilogic@70 274
lbajardsilogic@70 275 highlightThemeButton(name);
lbajardsilogic@7 276
lbajardsilogic@7 277 std::map<QString, int>::iterator iter = m_themes.find(name);
lbajardsilogic@7 278
lbajardsilogic@7 279 if (iter != m_themes.end())
lbajardsilogic@70 280 {
lbajardsilogic@7 281 m_themesLayout->setCurrentIndex(iter->second);
lbajardsilogic@70 282 }
lbajardsilogic@70 283 }
lbajardsilogic@70 284
lbajardsilogic@70 285 void SearchWidget::highlightThemeButton(QString &name)
lbajardsilogic@70 286 {
lbajardsilogic@70 287 QLayoutItem *child;
lbajardsilogic@70 288
lbajardsilogic@70 289 for (int i = 0; i<m_buttonLayout->count(); i++ )
lbajardsilogic@70 290 {
lbajardsilogic@70 291 child = m_buttonLayout->itemAt(i);
lbajardsilogic@70 292 QPushButton* button = (QPushButton*) child->widget();
lbajardsilogic@70 293 if (button)
lbajardsilogic@70 294 {
lbajardsilogic@70 295 if (name == button->objectName())
lbajardsilogic@70 296 {
lbajardsilogic@70 297 QPalette palette;
lbajardsilogic@70 298 palette.setColor(QPalette::Button,palette.color(QPalette::Highlight));
lbajardsilogic@70 299 button->setPalette(palette);
lbajardsilogic@70 300 }
lbajardsilogic@70 301 else
lbajardsilogic@70 302 {
lbajardsilogic@70 303 QPalette palette;
lbajardsilogic@70 304 button->setPalette(palette);
lbajardsilogic@70 305 }
lbajardsilogic@70 306 }
lbajardsilogic@70 307 }
lbajardsilogic@7 308 }
lbajardsilogic@7 309
lbajardsilogic@7 310 QString SearchWidget::getActiveTheme()
lbajardsilogic@7 311 {
lbajardsilogic@7 312 int index = m_themesLayout->currentIndex();
lbajardsilogic@7 313
lbajardsilogic@7 314 std::map<QString, int>::iterator iter;
lbajardsilogic@7 315
lbajardsilogic@7 316 for (iter = m_themes.begin(); iter != m_themes.end(); iter++)
lbajardsilogic@7 317 {
lbajardsilogic@7 318 if (iter->second == index)
lbajardsilogic@7 319 return iter->first;
lbajardsilogic@7 320 }
lbajardsilogic@7 321
lbajardsilogic@7 322 return "";
lbajardsilogic@7 323 }
lbajardsilogic@93 324
lbajardsilogic@93 325 void SearchWidget::keyPressEvent( QKeyEvent * e )
lbajardsilogic@93 326 {
lbajardsilogic@93 327 int key = e->key();
lbajardsilogic@93 328 if ((key == Qt::Key_Enter) || (key == Qt::Key_Return))
lbajardsilogic@93 329 {
lbajardsilogic@93 330 m_searchButton->click();
lbajardsilogic@93 331 }
lbajardsilogic@93 332 }