1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : a widget to filter album contents by rating
9
* Copyright (C) 2007-2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
10
* Copyright (C) 2007 by Arnd Baecker <arnd dot baecker at web dot de>
12
* This program is free software; you can redistribute it
13
* and/or modify it under the terms of the GNU General
14
* Public License as published by the Free Software Foundation;
15
* either version 2, or (at your option)
18
* This program is distributed in the hope that it will be useful,
19
* but WITHOUT ANY WARRANTY; without even the implied warranty of
20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
* GNU General Public License for more details.
23
* ============================================================ */
25
#include "ratingfilter.moc"
34
#include <QToolButton>
39
#include <kiconloader.h>
42
#include <kstandarddirs.h>
47
#include "dcursortracker.h"
48
#include "thememanager.h"
53
class RatingFilterWidget::RatingFilterWidgetPriv
57
RatingFilterWidgetPriv()
61
filterCond = ImageFilterSettings::GreaterEqualCondition;
66
DTipTracker* ratingTracker;
68
ImageFilterSettings::RatingCondition filterCond;
71
RatingFilterWidget::RatingFilterWidget(QWidget* parent)
72
: RatingWidget(parent), d(new RatingFilterWidgetPriv)
74
d->ratingTracker = new DTipTracker("", this);
75
updateRatingTooltip();
76
setMouseTracking(true);
78
setWhatsThis(i18n("Select the rating value used to filter "
79
"albums' contents. Use the context pop-up menu to "
80
"set rating filter conditions."));
82
// To dispatch signal from parent widget with filter condition.
83
connect(this, SIGNAL(signalRatingChanged(int)),
84
this, SLOT(slotRatingChanged()));
87
RatingFilterWidget::~RatingFilterWidget()
92
void RatingFilterWidget::slotRatingChanged()
94
emit signalRatingFilterChanged(rating(), d->filterCond);
97
void RatingFilterWidget::setRatingFilterCondition(ImageFilterSettings::RatingCondition cond)
100
updateRatingTooltip();
104
ImageFilterSettings::RatingCondition RatingFilterWidget::ratingFilterCondition()
106
return d->filterCond;
109
void RatingFilterWidget::mouseMoveEvent(QMouseEvent* e)
111
// This method have been re-implemented to display and update the famous TipTracker contents.
115
int pos = e->x() / regPixmapWidth() +1;
122
updateRatingTooltip();
126
void RatingFilterWidget::mousePressEvent(QMouseEvent* e)
128
// This method must be re-implemented to handle which mouse button is pressed
129
// and show the rating filter settings pop-up menu with right mouse button.
130
// NOTE: Left and Middle Mouse buttons continue to change rating filter value.
134
if ( e->button() == Qt::LeftButton || e->button() == Qt::MidButton )
137
int pos = e->x() / regPixmapWidth() +1;
141
setRating(rating()-1);
148
updateRatingTooltip();
152
void RatingFilterWidget::mouseReleaseEvent(QMouseEvent*)
157
void RatingFilterWidget::updateRatingTooltip()
159
// Adapt tip message with rating filter condition settings.
161
switch (d->filterCond)
163
case ImageFilterSettings::GreaterEqualCondition:
165
d->ratingTracker->setText(i18n("Rating greater than or equal to %1.", rating()));
168
case ImageFilterSettings::EqualCondition:
170
d->ratingTracker->setText(i18n("Rating equal to %1.", rating()));
173
case ImageFilterSettings::LessEqualCondition:
175
d->ratingTracker->setText( i18n("Rating less than or equal to %1.", rating()));
183
// -----------------------------------------------------------------------------------------------
185
class RatingFilter::RatingFilterPriv
199
QToolButton* optionsBtn;
201
QAction* geCondAction;
202
QAction* eqCondAction;
203
QAction* leCondAction;
207
RatingFilterWidget* ratingWidget;
210
RatingFilter::RatingFilter(QWidget* parent)
211
: KHBox(parent), d(new RatingFilterPriv)
213
d->ratingWidget = new RatingFilterWidget(this);
215
d->optionsBtn = new QToolButton(this);
216
d->optionsBtn->setToolTip( i18n("Rating Filter Options"));
217
d->optionsBtn->setIcon(KIconLoader::global()->loadIcon("configure", KIconLoader::Toolbar));
218
d->optionsBtn->setPopupMode(QToolButton::InstantPopup);
220
d->optionsMenu = new KMenu(d->optionsBtn);
221
d->geCondAction = d->optionsMenu->addAction(i18n("Greater Than or Equals Condition"));
222
d->geCondAction->setCheckable(true);
223
d->eqCondAction = d->optionsMenu->addAction(i18n("Equals Condition"));
224
d->eqCondAction->setCheckable(true);
225
d->leCondAction = d->optionsMenu->addAction(i18n("Less Than or Equals Condition"));
226
d->leCondAction->setCheckable(true);
227
d->optionsBtn->setMenu(d->optionsMenu);
229
layout()->setAlignment(d->ratingWidget, Qt::AlignVCenter|Qt::AlignRight);
233
connect(d->optionsMenu, SIGNAL(triggered(QAction*)),
234
this, SLOT(slotOptionsTriggered(QAction*)));
236
connect(d->optionsMenu, SIGNAL(aboutToShow()),
237
this, SLOT(slotOptionsMenu()));
239
connect(d->ratingWidget, SIGNAL(signalRatingFilterChanged(int,ImageFilterSettings::RatingCondition)),
240
this, SIGNAL(signalRatingFilterChanged(int,ImageFilterSettings::RatingCondition)));
243
RatingFilter::~RatingFilter()
248
void RatingFilter::setRatingFilterCondition(ImageFilterSettings::RatingCondition cond)
250
d->ratingWidget->setRatingFilterCondition(cond);
253
ImageFilterSettings::RatingCondition RatingFilter::ratingFilterCondition()
255
return d->ratingWidget->ratingFilterCondition();
258
void RatingFilter::slotOptionsMenu()
260
d->geCondAction->setChecked(false);
261
d->eqCondAction->setChecked(false);
262
d->leCondAction->setChecked(false);
264
switch (ratingFilterCondition())
266
case ImageFilterSettings::GreaterEqualCondition:
267
d->geCondAction->setChecked(true);
269
case ImageFilterSettings::EqualCondition:
270
d->eqCondAction->setChecked(true);
272
case ImageFilterSettings::LessEqualCondition:
273
d->leCondAction->setChecked(true);
278
void RatingFilter::slotOptionsTriggered(QAction* action)
282
if (action == d->geCondAction)
284
setRatingFilterCondition(ImageFilterSettings::GreaterEqualCondition);
286
else if (action == d->eqCondAction)
288
setRatingFilterCondition(ImageFilterSettings::EqualCondition);
290
else if (action == d->leCondAction)
292
setRatingFilterCondition(ImageFilterSettings::LessEqualCondition);
297
void RatingFilter::setRating(int val)
299
d->ratingWidget->setRating(val);
302
int RatingFilter::rating() const
304
return d->ratingWidget->rating();
307
} // namespace Digikam