~ubuntu-branches/ubuntu/saucy/digikam/saucy

« back to all changes in this revision

Viewing changes to core/digikam/filters/ratingfilter.cpp

  • Committer: Package Import Robot
  • Author(s): Felix Geyer, Rohan Garg, Philip Muškovac, Felix Geyer
  • Date: 2011-09-23 18:18:55 UTC
  • mfrom: (1.2.36 upstream)
  • Revision ID: package-import@ubuntu.com-20110923181855-ifs67wxkugshev9k
Tags: 2:2.1.1-0ubuntu1
[ Rohan Garg ]
* New upstream release (LP: #834190)
  - debian/control
    + Build with libqtwebkit-dev
 - debian/kipi-plugins-common
    + Install libkvkontakte required by kipi-plugins
 - debian/digikam
    + Install panoramagui

[ Philip Muškovac ]
* New upstream release
  - debian/control:
    + Add libcv-dev, libcvaux-dev, libhighgui-dev, libboost-graph1.46-dev,
      libksane-dev, libxml2-dev, libxslt-dev, libqt4-opengl-dev, libqjson-dev,
      libgpod-dev and libqca2-dev to build-deps
    + Add packages for kipi-plugins, libmediawiki, libkface, libkgeomap and
      libkvkontakte
  - debian/rules:
    + Don't build with gphoto2 since it doesn't build with it.
  - Add kubuntu_fix_test_linking.diff to fix linking of the dngconverter test
  - update install files
  - update kubuntu_01_mysqld_executable_name.diff for new cmake layout
    and rename to kubuntu_mysqld_executable_name.diff
* Fix typo in digikam-data description (LP: #804894)
* Fix Vcs links

[ Felix Geyer ]
* Move library data files to the new packages libkface-data, libkgeomap-data
  and libkvkontakte-data.
* Override version of the embedded library packages to 1.0~digikam<version>.
* Exclude the library packages from digikam-dbg to prevent file conflicts in
  the future.
* Call dh_install with --list-missing.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* ============================================================
 
2
 *
 
3
 * This file is a part of digiKam project
 
4
 * http://www.digikam.org
 
5
 *
 
6
 * Date        : 2007-10-09
 
7
 * Description : a widget to filter album contents by rating
 
8
 *
 
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>
 
11
 *
 
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)
 
16
 * any later version.
 
17
 *
 
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.
 
22
 *
 
23
 * ============================================================ */
 
24
 
 
25
#include "ratingfilter.moc"
 
26
 
 
27
// Qt includes
 
28
 
 
29
#include <QLayout>
 
30
#include <QPainter>
 
31
#include <QPalette>
 
32
#include <QPixmap>
 
33
#include <QCursor>
 
34
#include <QToolButton>
 
35
 
 
36
// KDE includes
 
37
 
 
38
#include <kmenu.h>
 
39
#include <kiconloader.h>
 
40
#include <klocale.h>
 
41
#include <kglobal.h>
 
42
#include <kstandarddirs.h>
 
43
#include <kdebug.h>
 
44
 
 
45
// Local includes
 
46
 
 
47
#include "dcursortracker.h"
 
48
#include "thememanager.h"
 
49
 
 
50
namespace Digikam
 
51
{
 
52
 
 
53
class RatingFilterWidget::RatingFilterWidgetPriv
 
54
{
 
55
public:
 
56
 
 
57
    RatingFilterWidgetPriv()
 
58
    {
 
59
        dirty         = false;
 
60
        ratingTracker = 0;
 
61
        filterCond    = ImageFilterSettings::GreaterEqualCondition;
 
62
    }
 
63
 
 
64
    bool                                 dirty;
 
65
 
 
66
    DTipTracker*                         ratingTracker;
 
67
 
 
68
    ImageFilterSettings::RatingCondition filterCond;
 
69
};
 
70
 
 
71
RatingFilterWidget::RatingFilterWidget(QWidget* parent)
 
72
    : RatingWidget(parent), d(new RatingFilterWidgetPriv)
 
73
{
 
74
    d->ratingTracker = new DTipTracker("", this);
 
75
    updateRatingTooltip();
 
76
    setMouseTracking(true);
 
77
 
 
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."));
 
81
 
 
82
    // To dispatch signal from parent widget with filter condition.
 
83
    connect(this, SIGNAL(signalRatingChanged(int)),
 
84
            this, SLOT(slotRatingChanged()));
 
85
}
 
86
 
 
87
RatingFilterWidget::~RatingFilterWidget()
 
88
{
 
89
    delete d;
 
90
}
 
91
 
 
92
void RatingFilterWidget::slotRatingChanged()
 
93
{
 
94
    emit signalRatingFilterChanged(rating(), d->filterCond);
 
95
}
 
96
 
 
97
void RatingFilterWidget::setRatingFilterCondition(ImageFilterSettings::RatingCondition cond)
 
98
{
 
99
    d->filterCond = cond;
 
100
    updateRatingTooltip();
 
101
    slotRatingChanged();
 
102
}
 
103
 
 
104
ImageFilterSettings::RatingCondition RatingFilterWidget::ratingFilterCondition()
 
105
{
 
106
    return d->filterCond;
 
107
}
 
108
 
 
109
void RatingFilterWidget::mouseMoveEvent(QMouseEvent* e)
 
110
{
 
111
    // This method have been re-implemented to display and update the famous TipTracker contents.
 
112
 
 
113
    if ( d->dirty )
 
114
    {
 
115
        int pos = e->x() / regPixmapWidth() +1;
 
116
 
 
117
        if (rating() != pos)
 
118
        {
 
119
            setRating(pos);
 
120
        }
 
121
 
 
122
        updateRatingTooltip();
 
123
    }
 
124
}
 
125
 
 
126
void RatingFilterWidget::mousePressEvent(QMouseEvent* e)
 
127
{
 
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.
 
131
 
 
132
    d->dirty = false;
 
133
 
 
134
    if ( e->button() == Qt::LeftButton || e->button() == Qt::MidButton )
 
135
    {
 
136
        d->dirty = true;
 
137
        int pos  = e->x() / regPixmapWidth() +1;
 
138
 
 
139
        if (rating() == pos)
 
140
        {
 
141
            setRating(rating()-1);
 
142
        }
 
143
        else
 
144
        {
 
145
            setRating(pos);
 
146
        }
 
147
 
 
148
        updateRatingTooltip();
 
149
    }
 
150
}
 
151
 
 
152
void RatingFilterWidget::mouseReleaseEvent(QMouseEvent*)
 
153
{
 
154
    d->dirty = false;
 
155
}
 
156
 
 
157
void RatingFilterWidget::updateRatingTooltip()
 
158
{
 
159
    // Adapt tip message with rating filter condition settings.
 
160
 
 
161
    switch (d->filterCond)
 
162
    {
 
163
        case ImageFilterSettings::GreaterEqualCondition:
 
164
        {
 
165
            d->ratingTracker->setText(i18n("Rating greater than or equal to %1.", rating()));
 
166
            break;
 
167
        }
 
168
        case ImageFilterSettings::EqualCondition:
 
169
        {
 
170
            d->ratingTracker->setText(i18n("Rating equal to %1.", rating()));
 
171
            break;
 
172
        }
 
173
        case ImageFilterSettings::LessEqualCondition:
 
174
        {
 
175
            d->ratingTracker->setText( i18n("Rating less than or equal to %1.", rating()));
 
176
            break;
 
177
        }
 
178
        default:
 
179
            break;
 
180
    }
 
181
}
 
182
 
 
183
// -----------------------------------------------------------------------------------------------
 
184
 
 
185
class RatingFilter::RatingFilterPriv
 
186
{
 
187
public:
 
188
 
 
189
    RatingFilterPriv()
 
190
    {
 
191
        ratingWidget = 0;
 
192
        optionsBtn   = 0;
 
193
        optionsMenu  = 0;
 
194
        geCondAction = 0;
 
195
        eqCondAction = 0;
 
196
        leCondAction = 0;
 
197
    }
 
198
 
 
199
    QToolButton*        optionsBtn;
 
200
 
 
201
    QAction*            geCondAction;
 
202
    QAction*            eqCondAction;
 
203
    QAction*            leCondAction;
 
204
 
 
205
    KMenu*              optionsMenu;
 
206
 
 
207
    RatingFilterWidget* ratingWidget;
 
208
};
 
209
 
 
210
RatingFilter::RatingFilter(QWidget* parent)
 
211
    : KHBox(parent), d(new RatingFilterPriv)
 
212
{
 
213
    d->ratingWidget = new RatingFilterWidget(this);
 
214
 
 
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);
 
219
 
 
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);
 
228
 
 
229
    layout()->setAlignment(d->ratingWidget, Qt::AlignVCenter|Qt::AlignRight);
 
230
    setMargin(0);
 
231
    setSpacing(0);
 
232
 
 
233
    connect(d->optionsMenu, SIGNAL(triggered(QAction*)),
 
234
            this, SLOT(slotOptionsTriggered(QAction*)));
 
235
 
 
236
    connect(d->optionsMenu, SIGNAL(aboutToShow()),
 
237
            this, SLOT(slotOptionsMenu()));
 
238
 
 
239
    connect(d->ratingWidget, SIGNAL(signalRatingFilterChanged(int,ImageFilterSettings::RatingCondition)),
 
240
            this, SIGNAL(signalRatingFilterChanged(int,ImageFilterSettings::RatingCondition)));
 
241
}
 
242
 
 
243
RatingFilter::~RatingFilter()
 
244
{
 
245
    delete d;
 
246
}
 
247
 
 
248
void RatingFilter::setRatingFilterCondition(ImageFilterSettings::RatingCondition cond)
 
249
{
 
250
    d->ratingWidget->setRatingFilterCondition(cond);
 
251
}
 
252
 
 
253
ImageFilterSettings::RatingCondition RatingFilter::ratingFilterCondition()
 
254
{
 
255
    return d->ratingWidget->ratingFilterCondition();
 
256
}
 
257
 
 
258
void RatingFilter::slotOptionsMenu()
 
259
{
 
260
    d->geCondAction->setChecked(false);
 
261
    d->eqCondAction->setChecked(false);
 
262
    d->leCondAction->setChecked(false);
 
263
 
 
264
    switch (ratingFilterCondition())
 
265
    {
 
266
        case ImageFilterSettings::GreaterEqualCondition:
 
267
            d->geCondAction->setChecked(true);
 
268
            break;
 
269
        case ImageFilterSettings::EqualCondition:
 
270
            d->eqCondAction->setChecked(true);
 
271
            break;
 
272
        case ImageFilterSettings::LessEqualCondition:
 
273
            d->leCondAction->setChecked(true);
 
274
            break;
 
275
    }
 
276
}
 
277
 
 
278
void RatingFilter::slotOptionsTriggered(QAction* action)
 
279
{
 
280
    if (action)
 
281
    {
 
282
        if (action == d->geCondAction)
 
283
        {
 
284
            setRatingFilterCondition(ImageFilterSettings::GreaterEqualCondition);
 
285
        }
 
286
        else if (action == d->eqCondAction)
 
287
        {
 
288
            setRatingFilterCondition(ImageFilterSettings::EqualCondition);
 
289
        }
 
290
        else if (action == d->leCondAction)
 
291
        {
 
292
            setRatingFilterCondition(ImageFilterSettings::LessEqualCondition);
 
293
        }
 
294
    }
 
295
}
 
296
 
 
297
void RatingFilter::setRating(int val)
 
298
{
 
299
    d->ratingWidget->setRating(val);
 
300
}
 
301
 
 
302
int RatingFilter::rating() const
 
303
{
 
304
    return d->ratingWidget->rating();
 
305
}
 
306
 
 
307
}  // namespace Digikam