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

« back to all changes in this revision

Viewing changes to core/digikam/filters/filtersidebarwidget.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        : 2000-12-05
 
7
 * Description : filters view for the right sidebar
 
8
 *
 
9
 * Copyright (C) 2009-2010 by Johannes Wienke <languitar at semipol dot de>
 
10
 * Copyright (C) 2010-2011 by Andi Clemens <andi dot clemens at gmx dot net>
 
11
 * Copyright (C)      2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
 
12
 *
 
13
 * This program is free software; you can redistribute it
 
14
 * and/or modify it under the terms of the GNU General
 
15
 * Public License as published by the Free Software Foundation;
 
16
 * either version 2, or (at your option)
 
17
 * any later version.
 
18
 *
 
19
 * This program is distributed in the hope that it will be useful,
 
20
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
22
 * GNU General Public License for more details.
 
23
 *
 
24
 * ============================================================ */
 
25
 
 
26
#include "filtersidebarwidget.moc"
 
27
 
 
28
// Qt includes
 
29
 
 
30
#include <QLabel>
 
31
#include <QLayout>
 
32
#include <QCheckBox>
 
33
#include <QGridLayout>
 
34
#include <QToolButton>
 
35
 
 
36
// KDE includes
 
37
 
 
38
#include <khbox.h>
 
39
#include <kmenu.h>
 
40
#include <kdebug.h>
 
41
 
 
42
// Libkdcraw includes
 
43
 
 
44
#include <libkdcraw/version.h>
 
45
#include <libkdcraw/rexpanderbox.h>
 
46
 
 
47
// Local includes
 
48
 
 
49
#include "albumsettings.h"
 
50
#include "colorlabelfilter.h"
 
51
#include "picklabelfilter.h"
 
52
#include "ratingfilter.h"
 
53
#include "mimefilter.h"
 
54
#include "tagfilterview.h"
 
55
 
 
56
using namespace KDcrawIface;
 
57
 
 
58
namespace Digikam
 
59
{
 
60
 
 
61
class FilterSideBarWidget::FilterSideBarWidgetPriv
 
62
{
 
63
public:
 
64
 
 
65
    FilterSideBarWidgetPriv() :
 
66
        space(0),
 
67
        expanderVlay(0),
 
68
        tagFilterView(0),
 
69
        tagFilterSearchBar(0),
 
70
        tagOptionsBtn(0),
 
71
        tagOptionsMenu(0),
 
72
        tagFilterModel(0),
 
73
        tagOrCondAction(0),
 
74
        tagAndCondAction(0),
 
75
        tagMatchCond(ImageFilterSettings::OrCondition),
 
76
        colorLabelFilter(0),
 
77
        pickLabelFilter(0),
 
78
        ratingFilter(0),
 
79
        mimeFilter(0),
 
80
        textFilter(0),
 
81
        expbox(0)
 
82
    {
 
83
    }
 
84
 
 
85
    static const QString                   configSearchTextFilterFieldsEntry;
 
86
    static const QString                   configLastShowUntaggedEntry;
 
87
    static const QString                   configMatchingConditionEntry;
 
88
 
 
89
    QWidget*                               space;
 
90
    QVBoxLayout*                           expanderVlay;
 
91
 
 
92
    TagFilterView*                         tagFilterView;
 
93
    SearchTextBar*                         tagFilterSearchBar;
 
94
    QToolButton*                           tagOptionsBtn;
 
95
    KMenu*                                 tagOptionsMenu;
 
96
    TagModel*                              tagFilterModel;
 
97
    QAction*                               tagOrCondAction;
 
98
    QAction*                               tagAndCondAction;
 
99
    ImageFilterSettings::MatchingCondition tagMatchCond;
 
100
 
 
101
    ColorLabelFilter*                      colorLabelFilter;
 
102
    PickLabelFilter*                       pickLabelFilter;
 
103
    RatingFilter*                          ratingFilter;
 
104
    MimeFilter*                            mimeFilter;
 
105
    TextFilter*                            textFilter;
 
106
 
 
107
    QCheckBox*                             withoutTagCheckBox;
 
108
 
 
109
    RExpanderBox*                          expbox;
 
110
};
 
111
 
 
112
const QString FilterSideBarWidget::FilterSideBarWidgetPriv::configSearchTextFilterFieldsEntry("Search Text Filter Fields");
 
113
const QString FilterSideBarWidget::FilterSideBarWidgetPriv::configLastShowUntaggedEntry("Show Untagged");
 
114
const QString FilterSideBarWidget::FilterSideBarWidgetPriv::configMatchingConditionEntry("Matching Condition");
 
115
 
 
116
// ---------------------------------------------------------------------------------------------------
 
117
 
 
118
FilterSideBarWidget::FilterSideBarWidget(QWidget* parent, TagModel* tagFilterModel)
 
119
    : KVBox(parent), StateSavingObject(this), d(new FilterSideBarWidgetPriv)
 
120
{
 
121
    setObjectName("TagFilter Sidebar");
 
122
 
 
123
    d->expbox = new RExpanderBox(this);
 
124
    d->expbox->setObjectName("FilterSideBarWidget Expander");
 
125
 
 
126
    // --------------------------------------------------------------------------------------------------------
 
127
 
 
128
    d->textFilter = new TextFilter(d->expbox);
 
129
    d->expbox->addItem(d->textFilter, SmallIcon("text-field"),
 
130
                       i18n("Text Filter"), QString("TextFilter"), true);
 
131
 
 
132
    // --------------------------------------------------------------------------------------------------------
 
133
 
 
134
    d->mimeFilter = new MimeFilter(d->expbox);
 
135
    d->expbox->addItem(d->mimeFilter, SmallIcon("system-file-manager"),
 
136
                       i18n("MIME Type Filter"), QString("TypeMimeFilter"), true);
 
137
 
 
138
    // --------------------------------------------------------------------------------------------------------
 
139
 
 
140
    QWidget* box3         = new QWidget(d->expbox);
 
141
    d->tagFilterModel     = tagFilterModel;
 
142
    d->tagFilterView      = new TagFilterView(box3, tagFilterModel);
 
143
    d->tagFilterView->setObjectName("DigikamViewTagFilterView");
 
144
    d->tagFilterSearchBar = new SearchTextBar(box3, "DigikamViewTagFilterSearchBar");
 
145
    d->tagFilterSearchBar->setModel(d->tagFilterView->filteredModel(),
 
146
                                    AbstractAlbumModel::AlbumIdRole, AbstractAlbumModel::AlbumTitleRole);
 
147
    d->tagFilterSearchBar->setFilterModel(d->tagFilterView->albumFilterModel());
 
148
 
 
149
    const QString notTaggedTitle   = i18n("Images Without Tags");
 
150
    d->withoutTagCheckBox          = new QCheckBox(notTaggedTitle, box3);
 
151
    d->withoutTagCheckBox->setWhatsThis(i18n("Show images without a tag."));
 
152
 
 
153
    d->tagOptionsBtn = new QToolButton(box3);
 
154
    d->tagOptionsBtn->setToolTip( i18n("Tags Matching Condition"));
 
155
    d->tagOptionsBtn->setIcon(KIconLoader::global()->loadIcon("configure", KIconLoader::Toolbar));
 
156
    d->tagOptionsBtn->setPopupMode(QToolButton::InstantPopup);
 
157
    d->tagOptionsBtn->setWhatsThis(i18n("Defines in which way the selected tags are combined "
 
158
                                        "to filter the images. This also includes the '%1' check box.",
 
159
                                        notTaggedTitle));
 
160
 
 
161
    d->tagOptionsMenu  = new KMenu(d->tagOptionsBtn);
 
162
    d->tagOrCondAction = d->tagOptionsMenu->addAction(i18n("OR"));
 
163
    d->tagOrCondAction->setCheckable(true);
 
164
    d->tagAndCondAction = d->tagOptionsMenu->addAction(i18n("AND"));
 
165
    d->tagAndCondAction->setCheckable(true);
 
166
    d->tagOptionsBtn->setMenu(d->tagOptionsMenu);
 
167
 
 
168
    QGridLayout* lay3 = new QGridLayout(box3);
 
169
    lay3->addWidget(d->tagFilterView,      0, 0, 1, 3);
 
170
    lay3->addWidget(d->tagFilterSearchBar, 1, 0, 1, 3);
 
171
    lay3->addWidget(d->withoutTagCheckBox, 2, 0, 1, 1);
 
172
    lay3->addWidget(d->tagOptionsBtn,      2, 2, 1, 1);
 
173
    lay3->setRowStretch(0, 100);
 
174
    lay3->setColumnStretch(1, 10);
 
175
    lay3->setMargin(0);
 
176
    lay3->setSpacing(0);
 
177
 
 
178
    d->expbox->addItem(box3, SmallIcon("tag-assigned"), i18n("Tags Filter"), QString("TagsFilter"), true);
 
179
 
 
180
    // --------------------------------------------------------------------------------------------------------
 
181
 
 
182
    QWidget* box4       = new QWidget(d->expbox);
 
183
    d->colorLabelFilter = new ColorLabelFilter(box4);
 
184
    d->pickLabelFilter  = new PickLabelFilter(box4);
 
185
    d->ratingFilter     = new RatingFilter(box4);
 
186
 
 
187
    QGridLayout* lay4   = new QGridLayout(box4);
 
188
    lay4->addWidget(d->colorLabelFilter, 0, 0, 1, 3);
 
189
    lay4->addWidget(d->pickLabelFilter,  1, 0, 1, 1);
 
190
    lay4->addWidget(d->ratingFilter,     1, 2, 1, 1);
 
191
    lay4->setColumnStretch(2, 1);
 
192
    lay4->setColumnStretch(3, 10);
 
193
    lay4->setMargin(0);
 
194
    lay4->setSpacing(0);
 
195
 
 
196
    d->expbox->addItem(box4, SmallIcon("favorites"), i18n("Labels Filter"), QString("LabelsFilter"), true);
 
197
 
 
198
    d->expanderVlay = dynamic_cast<QVBoxLayout*>(dynamic_cast<QScrollArea*>(d->expbox)->widget()->layout());
 
199
    d->space        = new QWidget();
 
200
    d->expanderVlay->addWidget(d->space);
 
201
 
 
202
    // --------------------------------------------------------------------------------------------------------
 
203
 
 
204
    connect(d->expbox, SIGNAL(signalItemExpanded(int,bool)),
 
205
            this, SLOT(slotItemExpanded(int,bool)));
 
206
 
 
207
    connect(d->mimeFilter, SIGNAL(activated(int)),
 
208
            this, SIGNAL(signalMimeTypeFilterChanged(int)));
 
209
 
 
210
    connect(d->textFilter, SIGNAL(signalSearchTextFilterSettings(SearchTextFilterSettings)),
 
211
            this, SIGNAL(signalSearchTextFilterChanged(SearchTextFilterSettings)));
 
212
 
 
213
    connect(d->tagFilterView, SIGNAL(checkedTagsChanged(QList<TAlbum*>,QList<TAlbum*>)),
 
214
            this, SLOT(slotCheckedTagsChanged(QList<TAlbum*>,QList<TAlbum*>)));
 
215
 
 
216
    connect(d->colorLabelFilter, SIGNAL(signalColorLabelSelectionChanged(QList<ColorLabel>)),
 
217
            this, SLOT(slotColorLabelFilterChanged(QList<ColorLabel>)));
 
218
 
 
219
    connect(d->pickLabelFilter, SIGNAL(signalPickLabelSelectionChanged(QList<PickLabel>)),
 
220
            this, SLOT(slotPickLabelFilterChanged(QList<PickLabel>)));
 
221
 
 
222
    connect(d->withoutTagCheckBox, SIGNAL(stateChanged(int)),
 
223
            this, SLOT(slotWithoutTagChanged(int)));
 
224
 
 
225
    connect(d->tagOptionsMenu, SIGNAL(triggered(QAction*)),
 
226
            this, SLOT(slotTagOptionsTriggered(QAction*)));
 
227
 
 
228
    connect(d->tagOptionsMenu, SIGNAL(aboutToShow()),
 
229
            this, SLOT(slotTagOptionsMenu()));
 
230
 
 
231
    connect(d->ratingFilter, SIGNAL(signalRatingFilterChanged(int,ImageFilterSettings::RatingCondition)),
 
232
            this, SIGNAL(signalRatingFilterChanged(int,ImageFilterSettings::RatingCondition)));
 
233
}
 
234
 
 
235
FilterSideBarWidget::~FilterSideBarWidget()
 
236
{
 
237
    delete d;
 
238
}
 
239
 
 
240
void FilterSideBarWidget::slotTagOptionsMenu()
 
241
{
 
242
    d->tagOrCondAction->setChecked(false);
 
243
    d->tagAndCondAction->setChecked(false);
 
244
 
 
245
    switch (d->tagMatchCond)
 
246
    {
 
247
        case ImageFilterSettings::OrCondition:
 
248
            d->tagOrCondAction->setChecked(true);
 
249
            break;
 
250
        case ImageFilterSettings::AndCondition:
 
251
            d->tagAndCondAction->setChecked(true);
 
252
            break;
 
253
    }
 
254
}
 
255
 
 
256
void FilterSideBarWidget::slotItemExpanded(int id, bool b)
 
257
{
 
258
    if (id == 2)
 
259
    {
 
260
        d->expanderVlay->setStretchFactor(d->space, b ? 0 : 100);
 
261
    }
 
262
}
 
263
 
 
264
void FilterSideBarWidget::setFocusToTextFilter()
 
265
{
 
266
    d->textFilter->searchTextBar()->setFocus();
 
267
}
 
268
 
 
269
void FilterSideBarWidget::slotFilterMatchesForText(bool match)
 
270
{
 
271
    d->textFilter->searchTextBar()->slotSearchResult(match);
 
272
}
 
273
 
 
274
void FilterSideBarWidget::slotResetFilters()
 
275
{
 
276
    d->textFilter->reset();
 
277
    d->mimeFilter->setMimeFilter(MimeFilter::AllFiles);
 
278
    d->tagFilterView->slotResetCheckState();
 
279
    d->withoutTagCheckBox->setChecked(false);
 
280
    d->colorLabelFilter->reset();
 
281
    d->pickLabelFilter->reset();
 
282
    d->ratingFilter->setRating(0);
 
283
    d->ratingFilter->setRatingFilterCondition(ImageFilterSettings::GreaterEqualCondition);
 
284
    d->tagMatchCond = ImageFilterSettings::OrCondition;
 
285
}
 
286
 
 
287
void FilterSideBarWidget::slotTagOptionsTriggered(QAction* action)
 
288
{
 
289
    if (action)
 
290
    {
 
291
        if (action == d->tagOrCondAction)
 
292
        {
 
293
            d->tagMatchCond = ImageFilterSettings::OrCondition;
 
294
        }
 
295
        else if (action == d->tagAndCondAction)
 
296
        {
 
297
            d->tagMatchCond = ImageFilterSettings::AndCondition;
 
298
        }
 
299
    }
 
300
 
 
301
    filterChanged();
 
302
}
 
303
 
 
304
void FilterSideBarWidget::slotCheckedTagsChanged(const QList<TAlbum*>& includedTags,
 
305
                                                 const QList<TAlbum*>& excludedTags)
 
306
{
 
307
    Q_UNUSED(includedTags);
 
308
    Q_UNUSED(excludedTags);
 
309
    filterChanged();
 
310
}
 
311
 
 
312
void FilterSideBarWidget::slotColorLabelFilterChanged(const QList<ColorLabel>& list)
 
313
{
 
314
    Q_UNUSED(list);
 
315
    filterChanged();
 
316
}
 
317
 
 
318
void FilterSideBarWidget::slotPickLabelFilterChanged(const QList<PickLabel>& list)
 
319
{
 
320
    Q_UNUSED(list);
 
321
    filterChanged();
 
322
}
 
323
 
 
324
void FilterSideBarWidget::slotWithoutTagChanged(int newState)
 
325
{
 
326
    Q_UNUSED(newState);
 
327
    filterChanged();
 
328
}
 
329
 
 
330
void FilterSideBarWidget::filterChanged()
 
331
{
 
332
    bool showUntagged = d->withoutTagCheckBox->checkState() == Qt::Checked;
 
333
 
 
334
    QList<int> includedTagIds;
 
335
    QList<int> excludedTagIds;
 
336
    QList<int> clTagIds;
 
337
    QList<int> plTagIds;
 
338
 
 
339
    if (!showUntagged || d->tagMatchCond == ImageFilterSettings::OrCondition)
 
340
    {
 
341
        foreach (TAlbum* tag, d->tagFilterView->getCheckedTags())
 
342
        {
 
343
            if (tag)
 
344
            {
 
345
                includedTagIds << tag->id();
 
346
            }
 
347
        }
 
348
        foreach (TAlbum* tag, d->tagFilterView->getPartiallyCheckedTags())
 
349
        {
 
350
            if (tag)
 
351
            {
 
352
                excludedTagIds << tag->id();
 
353
            }
 
354
        }
 
355
        foreach (TAlbum* tag, d->colorLabelFilter->getCheckedColorLabelTags())
 
356
        {
 
357
            if (tag)
 
358
            {
 
359
                clTagIds << tag->id();
 
360
            }
 
361
        }
 
362
        foreach (TAlbum* tag, d->pickLabelFilter->getCheckedPickLabelTags())
 
363
        {
 
364
            if (tag)
 
365
            {
 
366
                plTagIds << tag->id();
 
367
            }
 
368
        }
 
369
    }
 
370
 
 
371
    emit signalTagFilterChanged(includedTagIds, excludedTagIds, d->tagMatchCond, showUntagged, clTagIds, plTagIds);
 
372
}
 
373
 
 
374
void FilterSideBarWidget::setConfigGroup(const KConfigGroup& group)
 
375
{
 
376
    StateSavingObject::setConfigGroup(group);
 
377
    d->tagFilterView->setConfigGroup(group);
 
378
}
 
379
 
 
380
void FilterSideBarWidget::doLoadState()
 
381
{
 
382
    KConfigGroup group = getConfigGroup();
 
383
 
 
384
#if KDCRAW_VERSION >= 0x020000
 
385
    d->expbox->readSettings(group);
 
386
#else
 
387
    d->expbox->readSettings();
 
388
#endif
 
389
 
 
390
    d->textFilter->setsearchTextFields((SearchTextFilterSettings::TextFilterFields)
 
391
                                       (group.readEntry(entryName(d->configSearchTextFilterFieldsEntry),
 
392
                                                                   (int)SearchTextFilterSettings::All)));
 
393
 
 
394
 
 
395
    d->ratingFilter->setRatingFilterCondition((ImageFilterSettings::RatingCondition)
 
396
                                              (AlbumSettings::instance()->getRatingFilterCond()));
 
397
 
 
398
    d->tagMatchCond = (ImageFilterSettings::MatchingCondition)
 
399
                      (group.readEntry(entryName(d->configMatchingConditionEntry),
 
400
                                                  (int)ImageFilterSettings::OrCondition));
 
401
 
 
402
    d->tagFilterView->loadState();
 
403
 
 
404
    if (d->tagFilterView->isRestoreCheckState())
 
405
    {
 
406
        d->withoutTagCheckBox->setChecked(group.readEntry(entryName(d->configLastShowUntaggedEntry), false));
 
407
    }
 
408
 
 
409
    filterChanged();
 
410
}
 
411
 
 
412
void FilterSideBarWidget::doSaveState()
 
413
{
 
414
    KConfigGroup group = getConfigGroup();
 
415
 
 
416
#if KDCRAW_VERSION >= 0x020000
 
417
    d->expbox->writeSettings(group);
 
418
#else
 
419
    d->expbox->writeSettings();
 
420
#endif
 
421
 
 
422
    group.writeEntry(entryName(d->configSearchTextFilterFieldsEntry), (int)d->textFilter->searchTextFields());
 
423
 
 
424
    AlbumSettings::instance()->setRatingFilterCond(d->ratingFilter->ratingFilterCondition());
 
425
 
 
426
    group.writeEntry(entryName(d->configMatchingConditionEntry), (int)d->tagMatchCond);
 
427
 
 
428
    d->tagFilterView->saveState();
 
429
    group.writeEntry(entryName(d->configLastShowUntaggedEntry), d->withoutTagCheckBox->isChecked());
 
430
    group.sync();
 
431
}
 
432
 
 
433
} // namespace Digikam