]>
cloud.milkyroute.net Git - dolphin.git/blob - src/search/dolphinfacetswidget.cpp
1 /***************************************************************************
2 * Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com> *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 * **************************************************************************/
20 #include "dolphinfacetswidget.h"
23 #include <QButtonGroup>
26 #include <QRadioButton>
27 #include <QHBoxLayout>
28 #include <QVBoxLayout>
30 DolphinFacetsWidget::DolphinFacetsWidget(QWidget
* parent
) :
49 QButtonGroup
* filetypeGroup
= new QButtonGroup(this);
50 m_anyType
= createRadioButton(i18nc("@option:check", "Any"), filetypeGroup
);
51 m_documents
= createRadioButton(i18nc("@option:check", "Documents"), filetypeGroup
);
52 m_images
= createRadioButton(i18nc("@option:check", "Images"), filetypeGroup
);
53 m_audio
= createRadioButton(i18nc("@option:check", "Audio Files"), filetypeGroup
);
54 m_videos
= createRadioButton(i18nc("@option:check", "Videos"), filetypeGroup
);
56 QVBoxLayout
* typeLayout
= new QVBoxLayout();
57 typeLayout
->setSpacing(0);
58 typeLayout
->addWidget(m_anyType
);
59 typeLayout
->addWidget(m_documents
);
60 typeLayout
->addWidget(m_images
);
61 typeLayout
->addWidget(m_audio
);
62 typeLayout
->addWidget(m_videos
);
63 typeLayout
->addStretch();
65 QButtonGroup
* timespanGroup
= new QButtonGroup(this);
66 m_anytime
= createRadioButton(i18nc("@option:option", "Anytime"), timespanGroup
);
67 m_today
= createRadioButton(i18nc("@option:option", "Today"), timespanGroup
);
68 m_yesterday
= createRadioButton(i18nc("@option:option", "Yesterday"), timespanGroup
);
69 m_thisWeek
= createRadioButton(i18nc("@option:option", "This Week"), timespanGroup
);
70 m_thisMonth
= createRadioButton(i18nc("@option:option", "This Month"), timespanGroup
);
71 m_thisYear
= createRadioButton(i18nc("@option:option", "This Year"), timespanGroup
);
73 QVBoxLayout
* timespanLayout
= new QVBoxLayout();
74 timespanLayout
->setSpacing(0);
75 timespanLayout
->addWidget(m_anytime
);
76 timespanLayout
->addWidget(m_today
);
77 timespanLayout
->addWidget(m_yesterday
);
78 timespanLayout
->addWidget(m_thisWeek
);
79 timespanLayout
->addWidget(m_thisMonth
);
80 timespanLayout
->addWidget(m_thisYear
);
81 timespanLayout
->addStretch();
83 QButtonGroup
* ratingGroup
= new QButtonGroup(this);
84 m_anyRating
= createRadioButton(i18nc("@option:option", "Any Rating"), ratingGroup
);
85 m_oneOrMore
= createRadioButton(i18nc("@option:option", "1 or more"), ratingGroup
);
86 m_twoOrMore
= createRadioButton(i18nc("@option:option", "2 or more"), ratingGroup
);
87 m_threeOrMore
= createRadioButton(i18nc("@option:option", "3 or more"), ratingGroup
);
88 m_fourOrMore
= createRadioButton(i18nc("@option:option", "4 or more"), ratingGroup
);
89 m_maxRating
= createRadioButton(i18nc("@option:option", "Highest Rating"), ratingGroup
);
91 QVBoxLayout
* ratingLayout
= new QVBoxLayout();
92 ratingLayout
->setSpacing(0);
93 ratingLayout
->addWidget(m_anyRating
);
94 ratingLayout
->addWidget(m_oneOrMore
);
95 ratingLayout
->addWidget(m_twoOrMore
);
96 ratingLayout
->addWidget(m_threeOrMore
);
97 ratingLayout
->addWidget(m_fourOrMore
);
98 ratingLayout
->addWidget(m_maxRating
);
100 QHBoxLayout
* topLayout
= new QHBoxLayout(this);
101 topLayout
->addLayout(typeLayout
);
102 topLayout
->addLayout(timespanLayout
);
103 topLayout
->addLayout(ratingLayout
);
104 topLayout
->addStretch();
106 m_anyType
->setChecked(true);
107 m_anytime
->setChecked(true);
108 m_anyRating
->setChecked(true);
111 DolphinFacetsWidget::~DolphinFacetsWidget()
116 Baloo::Term
DolphinFacetsWidget::ratingTerm() const
118 Baloo::Term ratingTerm
;
119 Baloo::Term modifiedTerm
;
121 if (!m_anyRating
->isChecked()) {
122 int stars
= 1; // represents m_oneOrMore
123 if (m_twoOrMore
->isChecked()) {
125 } else if (m_threeOrMore
->isChecked()) {
127 } else if (m_fourOrMore
->isChecked()) {
129 } else if (m_maxRating
->isChecked()) {
133 const int rating
= stars
* 2;
134 ratingTerm
= Baloo::Term("rating", rating
, Baloo::Term::GreaterEqual
);
137 if (!m_anytime
->isChecked()) {
138 QDate date
= QDate::currentDate(); // represents m_today
139 if (m_yesterday
->isChecked()) {
140 date
= date
.addDays(-1);
141 } else if (m_thisWeek
->isChecked()) {
142 date
= date
.addDays(1 - date
.dayOfWeek());
143 } else if (m_thisMonth
->isChecked()) {
144 date
= date
.addDays(1 - date
.day());
145 } else if (m_thisYear
->isChecked()) {
146 date
= date
.addDays(1 - date
.dayOfYear());
149 modifiedTerm
= Baloo::Term("modified", date
, Baloo::Term::GreaterEqual
);
152 if (ratingTerm
.isValid() && modifiedTerm
.isValid()) {
153 Baloo::Term
term(Baloo::Term::And
);
154 term
.addSubTerm(ratingTerm
);
155 term
.addSubTerm(modifiedTerm
);
158 } else if (modifiedTerm
.isValid()) {
160 } else if (ratingTerm
.isValid()) {
164 return Baloo::Term();
167 QString
DolphinFacetsWidget::facetType() const
169 if (m_documents
->isChecked()) {
170 return QLatin1String("Document");
171 } else if (m_images
->isChecked()) {
172 return QLatin1String("Image");
173 } else if (m_audio
->isChecked()) {
174 return QLatin1String("Audio");
175 } else if (m_videos
->isChecked()) {
176 return QLatin1String("Video");
182 bool DolphinFacetsWidget::isRatingTerm(const Baloo::Term
& term
) const
184 const QList
<Baloo::Term
> subTerms
= term
.subTerms();
185 if (subTerms
.isEmpty()) {
186 // If term has no sub terms, then the term itself is either a "rating" term
187 // or a "modified" term.
188 return term
.property() == QLatin1String("modified") ||
189 term
.property() == QLatin1String("rating");
191 } else if (subTerms
.size() == 2) {
192 // If term has sub terms, then the sub terms are always "rating" and "modified" terms.
194 QStringList properties
;
195 foreach (const Baloo::Term
& subTerm
, subTerms
) {
196 properties
<< subTerm
.property();
199 return properties
.contains(QLatin1String("modified")) &&
200 properties
.contains(QLatin1String("rating"));
206 void DolphinFacetsWidget::setRatingTerm(const Baloo::Term
& term
)
208 // If term has sub terms, then the sub terms are always "rating" and "modified" terms.
209 // If term has no sub terms, then the term itself is either a "rating" term or a "modified"
210 // term. To avoid code duplication we add term to subTerms list, if the list is empty.
211 QList
<Baloo::Term
> subTerms
= term
.subTerms();
212 if (subTerms
.isEmpty()) {
216 foreach (const Baloo::Term
& subTerm
, subTerms
) {
217 const QString property
= subTerm
.property();
219 if (property
== QLatin1String("modified")) {
220 const QDate date
= subTerm
.value().toDate();
222 } else if (property
== QLatin1String("rating")) {
223 const int stars
= subTerm
.value().toInt() / 2;
231 void DolphinFacetsWidget::setFacetType(const QString
& type
)
233 if (type
== QLatin1String("Document")) {
234 m_documents
->setChecked(true);
235 } else if (type
== QLatin1String("Image")) {
236 m_images
->setChecked(true);
237 } else if (type
== QLatin1String("Audio")) {
238 m_audio
->setChecked(true);
239 } else if (type
== QLatin1String("Video")) {
240 m_videos
->setChecked(true);
242 m_anyType
->setChecked(true);
246 void DolphinFacetsWidget::setRating(const int stars
)
250 m_maxRating
->setChecked(true);
254 m_fourOrMore
->setChecked(true);
258 m_threeOrMore
->setChecked(true);
262 m_twoOrMore
->setChecked(true);
266 m_oneOrMore
->setChecked(true);
270 m_anyRating
->setChecked(true);
274 void DolphinFacetsWidget::setTimespan(const QDate
& date
)
276 const QDate currentDate
= QDate::currentDate();
277 const int days
= date
.daysTo(currentDate
);
280 m_today
->setChecked(true);
281 } else if (days
<= 1) {
282 m_yesterday
->setChecked(true);
283 } else if (days
<= currentDate
.dayOfWeek()) {
284 m_thisWeek
->setChecked(true);
285 } else if (days
<= currentDate
.day()) {
286 m_thisMonth
->setChecked(true);
287 } else if (days
<= currentDate
.dayOfYear()) {
288 m_thisYear
->setChecked(true);
290 m_anytime
->setChecked(true);
294 QRadioButton
* DolphinFacetsWidget::createRadioButton(const QString
& text
,
297 QRadioButton
* button
= new QRadioButton(text
);
298 connect(button
, &QRadioButton::clicked
, this, &DolphinFacetsWidget::facetChanged
);
299 group
->addButton(button
);