]> cloud.milkyroute.net Git - dolphin.git/blob - src/search/searchcriterionselector.cpp
* adjust order of search options
[dolphin.git] / src / search / searchcriterionselector.cpp
1 /***************************************************************************
2 * Copyright (C) 2009 by Adam Kidder <thekidder@gmail.com> *
3 * Copyright (C) 2009 by Peter Penz <peter.penz@gmx.at> *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
19 ***************************************************************************/
20
21 #include "searchcriterionselector.h"
22
23 #include "searchcriterionvalue.h"
24
25 #include <QComboBox>
26 #include <QHBoxLayout>
27 #include <QList>
28 #include <QPushButton>
29
30 #include <kicon.h>
31 #include <klocale.h>
32
33 SearchCriterionSelector::SearchCriterionSelector(Type type, QWidget* parent) :
34 QWidget(parent),
35 m_layout(0),
36 m_descriptionsBox(0),
37 m_comparatorBox(0),
38 m_valueWidget(0),
39 m_removeButton(0),
40 m_descriptions()
41 {
42 m_descriptionsBox = new QComboBox(this);
43
44 m_comparatorBox = new QComboBox(this);
45 m_comparatorBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
46
47 createDescriptions();
48 const int index = static_cast<int>(type);
49 m_descriptionsBox->setCurrentIndex(index);
50
51 QWidget* filler = new QWidget(this);
52 filler->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
53
54 m_removeButton = new QPushButton(this);
55 m_removeButton->setIcon(KIcon("list-remove"));
56 m_removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
57 connect(m_removeButton, SIGNAL(clicked()), this, SIGNAL(removeCriterion()));
58
59 m_layout = new QHBoxLayout(this);
60 m_layout->setMargin(0);
61 m_layout->addWidget(m_descriptionsBox);
62 m_layout->addWidget(m_comparatorBox);
63 m_layout->addWidget(filler);
64 m_layout->addWidget(m_removeButton);
65
66 setLayout(m_layout);
67
68 slotDescriptionChanged(index);
69 connect(m_descriptionsBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotDescriptionChanged(int)));
70 }
71
72 SearchCriterionSelector::~SearchCriterionSelector()
73 {
74 }
75
76 void SearchCriterionSelector::createDescriptions()
77 {
78 Q_ASSERT(m_descriptionsBox != 0);
79 Q_ASSERT(m_comparatorBox != 0);
80
81 // TODO: maybe this creation should be forwarded to a factory if
82 // the number of items increases in future
83 QList<SearchCriterionDescription::Comparator> defaultComps;
84 defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than"), ">", "+"));
85 defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than or Equal to"), ">=", "+"));
86 defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than"), "<", "+"));
87 defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than or Equal to"), "<=", "+"));
88
89 // add "Date" description
90 QList<SearchCriterionDescription::Comparator> dateComps;
91 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Anytime"))); // TODO
92 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Today"))); // TODO
93 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This week"))); // TODO
94 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This month"))); // TODO
95 foreach (const SearchCriterionDescription::Comparator& comp, defaultComps) {
96 dateComps.append(comp);
97 }
98
99 DateValue* dateValue = new DateValue(this);
100 dateValue->hide();
101 SearchCriterionDescription date(i18nc("@label", "Date"),
102 "sourceModified",
103 dateComps,
104 dateValue);
105
106 // add "Size" description
107 QList<SearchCriterionDescription::Comparator> sizeComps = defaultComps;
108 sizeComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (file size)", "Any")));
109
110 SizeValue* sizeValue = new SizeValue(this);
111 sizeValue->hide();
112 SearchCriterionDescription size(i18nc("@label", "Size"),
113 "contentSize",
114 sizeComps,
115 sizeValue);
116
117 // add "Tag" description
118 QList<SearchCriterionDescription::Comparator> tagComps;
119 tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label All (tags)", "All")));
120 tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Equal to"), "=="));
121
122 TagValue* tagValue = new TagValue(this);
123 tagValue->hide();
124 SearchCriterionDescription tag(i18nc("@label", "Tag"),
125 "tag",
126 tagComps,
127 tagValue);
128
129 Q_ASSERT(static_cast<int>(SearchCriterionSelector::Date) == 0);
130 Q_ASSERT(static_cast<int>(SearchCriterionSelector::Size) == 1);
131 Q_ASSERT(static_cast<int>(SearchCriterionSelector::Tag) == 2);
132 m_descriptions.append(date);
133 m_descriptions.append(size);
134 m_descriptions.append(tag);
135
136 // add all descriptions to the combo box
137 const int count = m_descriptions.count();
138 for (int i = 0; i < count; ++i) {
139 m_descriptionsBox->addItem(m_descriptions[i].name(), i);
140 }
141 }
142
143 void SearchCriterionSelector::slotDescriptionChanged(int index)
144 {
145 if (m_valueWidget != 0) {
146 m_valueWidget->hide();
147 m_layout->removeWidget(m_valueWidget);
148 m_valueWidget = 0;
149 // the value widget is obtained by the Search Criterion
150 // Selector instance and may not get deleted
151 }
152
153 // add comparator items
154 disconnect(m_comparatorBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotComparatorChanged(int)));
155 m_comparatorBox->clear();
156
157 const SearchCriterionDescription& description = m_descriptions[index];
158 foreach (const SearchCriterionDescription::Comparator& comp, description.comparators()) {
159 m_comparatorBox->addItem(comp.name);
160 }
161
162 // add value widget
163 m_valueWidget = description.valueWidget();
164 m_layout->insertWidget(2, m_valueWidget);
165
166 m_comparatorBox->setCurrentIndex(0);
167 slotComparatorChanged(0);
168 connect(m_comparatorBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotComparatorChanged(int)));
169 }
170
171 void SearchCriterionSelector::slotComparatorChanged(int index)
172 {
173 Q_ASSERT(index >= 0);
174
175 // only show the value widget if an operation is defined by the comparator
176 const int descIndex = m_descriptionsBox->currentIndex();
177 const SearchCriterionDescription& descr = m_descriptions[descIndex];
178 const SearchCriterionDescription::Comparator& comp = descr.comparators()[index];
179 m_valueWidget->setVisible(!comp.operation.isEmpty());
180
181 // create query string
182 const QString queryString = comp.prefix + descr.identifier() + comp.operation + m_valueWidget->value();
183 emit criterionChanged(queryString);
184 }
185
186 #include "searchcriterionselector.moc"