]> cloud.milkyroute.net Git - dolphin.git/blob - src/search/searchcriterionselector.cpp
Fix trunk compilation using proper soprano Vocabulary, since moved from nie.h nepomuk.
[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 #define DISABLE_NEPOMUK_LEGACY
24 #include <nepomuk/comparisonterm.h>
25 #include <nepomuk/literalterm.h>
26 #include <nepomuk/query.h>
27
28 #include "searchcriterionvalue.h"
29
30 #include <Soprano/LiteralValue>
31 #include <Soprano/Vocabulary/NAO>
32
33 #include <QComboBox>
34 #include <QHBoxLayout>
35 #include <QList>
36 #include <QPushButton>
37
38 #include <kicon.h>
39 #include <klocale.h>
40
41 SearchCriterionSelector::SearchCriterionSelector(Type type, QWidget* parent) :
42 QWidget(parent),
43 m_layout(0),
44 m_descriptionsBox(0),
45 m_comparatorBox(0),
46 m_valueWidget(0),
47 m_removeButton(0),
48 m_descriptions()
49 {
50 m_descriptionsBox = new QComboBox(this);
51
52 m_comparatorBox = new QComboBox(this);
53 m_comparatorBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
54
55 createDescriptions();
56 const int index = static_cast<int>(type);
57 m_descriptionsBox->setCurrentIndex(index);
58
59 QWidget* filler = new QWidget(this);
60 filler->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
61
62 m_removeButton = new QPushButton(this);
63 m_removeButton->setIcon(KIcon("list-remove"));
64 m_removeButton->setToolTip(i18nc("@info", "Remove search option"));
65 m_removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
66 connect(m_removeButton, SIGNAL(clicked()), this, SIGNAL(removeCriterion()));
67
68 m_layout = new QHBoxLayout(this);
69 m_layout->setMargin(0);
70 m_layout->addWidget(m_removeButton);
71 m_layout->addWidget(m_descriptionsBox);
72 m_layout->addWidget(m_comparatorBox);
73 m_layout->addWidget(filler);
74
75 setLayout(m_layout);
76
77 slotDescriptionChanged(index);
78 connect(m_descriptionsBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotDescriptionChanged(int)));
79 }
80
81 SearchCriterionSelector::~SearchCriterionSelector()
82 {
83 }
84
85 Nepomuk::Query::Term SearchCriterionSelector::queryTerm() const
86 {
87 if (m_valueWidget == 0) {
88 return Nepomuk::Query::Term();
89 }
90
91 const int descIndex = m_descriptionsBox->currentIndex();
92 const SearchCriterionDescription& descr = m_descriptions[descIndex];
93
94 const int compIndex = m_comparatorBox->currentIndex();
95 const SearchCriterionDescription::Comparator& comp = descr.comparators()[compIndex];
96 if (comp.operation.isEmpty()) {
97 return Nepomuk::Query::Term();
98 }
99
100 Nepomuk::Query::LiteralTerm literalTerm(Soprano::LiteralValue("dummy"));
101 Nepomuk::Query::ComparisonTerm term(Soprano::Vocabulary::NAO::lastModified(),
102 literalTerm,
103 Nepomuk::Query::ComparisonTerm::Smaller);
104 return term;
105 /*
106 QString criterion = comp.prefix + descr.identifier() + comp.operation;
107 if (!m_valueWidget->value().isEmpty()) {
108 const QString value = m_valueWidget->value();
109 if (value.contains(' ')) {
110 criterion += '"' + value + '"';
111 } else {
112 // Don't surround the value by " if no space is part of the value.
113 // This increases the readability of the search-URL.
114 criterion += value;
115 }
116 }
117 return criterion;*/
118 }
119
120 SearchCriterionSelector::Type SearchCriterionSelector::type() const
121 {
122 return static_cast<Type>(m_descriptionsBox->currentIndex());
123 }
124
125 void SearchCriterionSelector::slotDescriptionChanged(int index)
126 {
127 if (m_valueWidget != 0) {
128 m_valueWidget->hide();
129 m_layout->removeWidget(m_valueWidget);
130 m_valueWidget = 0;
131 // the value widget is obtained by the Search Criterion
132 // Selector instance and may not get deleted
133 }
134
135 // add comparator items
136 disconnect(m_comparatorBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotComparatorChanged(int)));
137 m_comparatorBox->clear();
138
139 const SearchCriterionDescription& description = m_descriptions[index];
140 foreach (const SearchCriterionDescription::Comparator& comp, description.comparators()) {
141 m_comparatorBox->addItem(comp.name);
142 }
143
144 // add value widget
145 m_valueWidget = description.valueWidget();
146 m_layout->insertWidget(3, m_valueWidget);
147
148 m_comparatorBox->setCurrentIndex(0);
149 slotComparatorChanged(0);
150 connect(m_comparatorBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotComparatorChanged(int)));
151 }
152
153 void SearchCriterionSelector::slotComparatorChanged(int index)
154 {
155 Q_ASSERT(index >= 0);
156
157 // only show the value widget if an operation is defined by the comparator
158 const int descIndex = m_descriptionsBox->currentIndex();
159 const SearchCriterionDescription& descr = m_descriptions[descIndex];
160 const SearchCriterionDescription::Comparator& comp = descr.comparators()[index];
161
162 m_valueWidget->initializeValue(comp.autoValueType);
163 // only show the value widget, if an operation is defined
164 // and no automatic calculation is provided
165 m_valueWidget->setVisible(!comp.operation.isEmpty() && comp.autoValueType.isEmpty());
166
167 emit criterionChanged();
168 }
169
170 void SearchCriterionSelector::createDescriptions()
171 {
172 Q_ASSERT(m_descriptionsBox != 0);
173 Q_ASSERT(m_comparatorBox != 0);
174
175 // TODO: maybe this creation should be forwarded to a factory if
176 // the number of items increases in future
177 QList<SearchCriterionDescription::Comparator> defaultComps;
178 defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than"), ">", "+"));
179 defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Greater Than or Equal to"), ">=", "+"));
180 defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than"), "<", "+"));
181 defaultComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Less Than or Equal to"), "<=", "+"));
182
183 // add "Date" description
184 QList<SearchCriterionDescription::Comparator> dateComps;
185 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Anytime")));
186 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Today"), ":", "+", "today"));
187 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Week"), ">=", "+", "thisWeek"));
188 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Month"), ">=", "+", "thisMonth"));
189 dateComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "This Year"), ">=", "+", "thisYear"));
190 foreach (const SearchCriterionDescription::Comparator& comp, defaultComps) {
191 dateComps.append(comp);
192 }
193
194 DateValue* dateValue = new DateValue(this);
195 dateValue->hide();
196 SearchCriterionDescription date(i18nc("@label", "Date:"),
197 "lastModified",
198 dateComps,
199 dateValue);
200 Q_ASSERT(static_cast<int>(SearchCriterionSelector::Date) == 0);
201 m_descriptions.append(date);
202
203 // add "Size" description
204 QList<SearchCriterionDescription::Comparator> sizeComps = defaultComps;
205 sizeComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (file size)", "Any")));
206
207 SizeValue* sizeValue = new SizeValue(this);
208 sizeValue->hide();
209 SearchCriterionDescription size(i18nc("@label", "Size:"),
210 "contentSize",
211 sizeComps,
212 sizeValue);
213 Q_ASSERT(static_cast<int>(SearchCriterionSelector::Size) == 1);
214 m_descriptions.append(size);
215
216 // add "Tag" description
217 QList<SearchCriterionDescription::Comparator> tagComps;
218 tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label All (tags)", "All")));
219 tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Equal to"), ":", "+"));
220 tagComps.append(SearchCriterionDescription::Comparator(i18nc("@label", "Not Equal to"), ":", "-"));
221
222 TagValue* tagValue = new TagValue(this);
223 tagValue->hide();
224 SearchCriterionDescription tag(i18nc("@label", "Tag:"),
225 "tag",
226 tagComps,
227 tagValue);
228 Q_ASSERT(static_cast<int>(SearchCriterionSelector::Tag) == 2);
229 m_descriptions.append(tag);
230
231 // add "Rating" description
232 QList<SearchCriterionDescription::Comparator> ratingComps = defaultComps;
233 ratingComps.insert(0, SearchCriterionDescription::Comparator(i18nc("@label Any (rating)", "Any")));
234
235 RatingValue* ratingValue = new RatingValue(this);
236 ratingValue->hide();
237 SearchCriterionDescription rating(i18nc("@label", "Rating:"),
238 "rating",
239 ratingComps,
240 ratingValue);
241 Q_ASSERT(static_cast<int>(SearchCriterionSelector::Rating) == 3);
242 m_descriptions.append(rating);
243
244 // add all descriptions to the combo box and connect the value widgets
245 int i = 0;
246 foreach (const SearchCriterionDescription& desc, m_descriptions) {
247 m_descriptionsBox->addItem(desc.name(), i);
248 connect(desc.valueWidget(), SIGNAL(valueChanged(QString)), this, SIGNAL(criterionChanged()));
249 ++i;
250 }
251 }
252
253 #include "searchcriterionselector.moc"