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 } |