1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : filters view for the right sidebar
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>
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)
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.
24
* ============================================================ */
26
#include "filtersidebarwidget.moc"
33
#include <QGridLayout>
34
#include <QToolButton>
44
#include <libkdcraw/version.h>
45
#include <libkdcraw/rexpanderbox.h>
49
#include "albumsettings.h"
50
#include "colorlabelfilter.h"
51
#include "picklabelfilter.h"
52
#include "ratingfilter.h"
53
#include "mimefilter.h"
54
#include "tagfilterview.h"
56
using namespace KDcrawIface;
61
class FilterSideBarWidget::FilterSideBarWidgetPriv
65
FilterSideBarWidgetPriv() :
69
tagFilterSearchBar(0),
75
tagMatchCond(ImageFilterSettings::OrCondition),
85
static const QString configSearchTextFilterFieldsEntry;
86
static const QString configLastShowUntaggedEntry;
87
static const QString configMatchingConditionEntry;
90
QVBoxLayout* expanderVlay;
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;
101
ColorLabelFilter* colorLabelFilter;
102
PickLabelFilter* pickLabelFilter;
103
RatingFilter* ratingFilter;
104
MimeFilter* mimeFilter;
105
TextFilter* textFilter;
107
QCheckBox* withoutTagCheckBox;
109
RExpanderBox* expbox;
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");
116
// ---------------------------------------------------------------------------------------------------
118
FilterSideBarWidget::FilterSideBarWidget(QWidget* parent, TagModel* tagFilterModel)
119
: KVBox(parent), StateSavingObject(this), d(new FilterSideBarWidgetPriv)
121
setObjectName("TagFilter Sidebar");
123
d->expbox = new RExpanderBox(this);
124
d->expbox->setObjectName("FilterSideBarWidget Expander");
126
// --------------------------------------------------------------------------------------------------------
128
d->textFilter = new TextFilter(d->expbox);
129
d->expbox->addItem(d->textFilter, SmallIcon("text-field"),
130
i18n("Text Filter"), QString("TextFilter"), true);
132
// --------------------------------------------------------------------------------------------------------
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);
138
// --------------------------------------------------------------------------------------------------------
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());
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."));
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.",
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);
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);
178
d->expbox->addItem(box3, SmallIcon("tag-assigned"), i18n("Tags Filter"), QString("TagsFilter"), true);
180
// --------------------------------------------------------------------------------------------------------
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);
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);
196
d->expbox->addItem(box4, SmallIcon("favorites"), i18n("Labels Filter"), QString("LabelsFilter"), true);
198
d->expanderVlay = dynamic_cast<QVBoxLayout*>(dynamic_cast<QScrollArea*>(d->expbox)->widget()->layout());
199
d->space = new QWidget();
200
d->expanderVlay->addWidget(d->space);
202
// --------------------------------------------------------------------------------------------------------
204
connect(d->expbox, SIGNAL(signalItemExpanded(int,bool)),
205
this, SLOT(slotItemExpanded(int,bool)));
207
connect(d->mimeFilter, SIGNAL(activated(int)),
208
this, SIGNAL(signalMimeTypeFilterChanged(int)));
210
connect(d->textFilter, SIGNAL(signalSearchTextFilterSettings(SearchTextFilterSettings)),
211
this, SIGNAL(signalSearchTextFilterChanged(SearchTextFilterSettings)));
213
connect(d->tagFilterView, SIGNAL(checkedTagsChanged(QList<TAlbum*>,QList<TAlbum*>)),
214
this, SLOT(slotCheckedTagsChanged(QList<TAlbum*>,QList<TAlbum*>)));
216
connect(d->colorLabelFilter, SIGNAL(signalColorLabelSelectionChanged(QList<ColorLabel>)),
217
this, SLOT(slotColorLabelFilterChanged(QList<ColorLabel>)));
219
connect(d->pickLabelFilter, SIGNAL(signalPickLabelSelectionChanged(QList<PickLabel>)),
220
this, SLOT(slotPickLabelFilterChanged(QList<PickLabel>)));
222
connect(d->withoutTagCheckBox, SIGNAL(stateChanged(int)),
223
this, SLOT(slotWithoutTagChanged(int)));
225
connect(d->tagOptionsMenu, SIGNAL(triggered(QAction*)),
226
this, SLOT(slotTagOptionsTriggered(QAction*)));
228
connect(d->tagOptionsMenu, SIGNAL(aboutToShow()),
229
this, SLOT(slotTagOptionsMenu()));
231
connect(d->ratingFilter, SIGNAL(signalRatingFilterChanged(int,ImageFilterSettings::RatingCondition)),
232
this, SIGNAL(signalRatingFilterChanged(int,ImageFilterSettings::RatingCondition)));
235
FilterSideBarWidget::~FilterSideBarWidget()
240
void FilterSideBarWidget::slotTagOptionsMenu()
242
d->tagOrCondAction->setChecked(false);
243
d->tagAndCondAction->setChecked(false);
245
switch (d->tagMatchCond)
247
case ImageFilterSettings::OrCondition:
248
d->tagOrCondAction->setChecked(true);
250
case ImageFilterSettings::AndCondition:
251
d->tagAndCondAction->setChecked(true);
256
void FilterSideBarWidget::slotItemExpanded(int id, bool b)
260
d->expanderVlay->setStretchFactor(d->space, b ? 0 : 100);
264
void FilterSideBarWidget::setFocusToTextFilter()
266
d->textFilter->searchTextBar()->setFocus();
269
void FilterSideBarWidget::slotFilterMatchesForText(bool match)
271
d->textFilter->searchTextBar()->slotSearchResult(match);
274
void FilterSideBarWidget::slotResetFilters()
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;
287
void FilterSideBarWidget::slotTagOptionsTriggered(QAction* action)
291
if (action == d->tagOrCondAction)
293
d->tagMatchCond = ImageFilterSettings::OrCondition;
295
else if (action == d->tagAndCondAction)
297
d->tagMatchCond = ImageFilterSettings::AndCondition;
304
void FilterSideBarWidget::slotCheckedTagsChanged(const QList<TAlbum*>& includedTags,
305
const QList<TAlbum*>& excludedTags)
307
Q_UNUSED(includedTags);
308
Q_UNUSED(excludedTags);
312
void FilterSideBarWidget::slotColorLabelFilterChanged(const QList<ColorLabel>& list)
318
void FilterSideBarWidget::slotPickLabelFilterChanged(const QList<PickLabel>& list)
324
void FilterSideBarWidget::slotWithoutTagChanged(int newState)
330
void FilterSideBarWidget::filterChanged()
332
bool showUntagged = d->withoutTagCheckBox->checkState() == Qt::Checked;
334
QList<int> includedTagIds;
335
QList<int> excludedTagIds;
339
if (!showUntagged || d->tagMatchCond == ImageFilterSettings::OrCondition)
341
foreach (TAlbum* tag, d->tagFilterView->getCheckedTags())
345
includedTagIds << tag->id();
348
foreach (TAlbum* tag, d->tagFilterView->getPartiallyCheckedTags())
352
excludedTagIds << tag->id();
355
foreach (TAlbum* tag, d->colorLabelFilter->getCheckedColorLabelTags())
359
clTagIds << tag->id();
362
foreach (TAlbum* tag, d->pickLabelFilter->getCheckedPickLabelTags())
366
plTagIds << tag->id();
371
emit signalTagFilterChanged(includedTagIds, excludedTagIds, d->tagMatchCond, showUntagged, clTagIds, plTagIds);
374
void FilterSideBarWidget::setConfigGroup(const KConfigGroup& group)
376
StateSavingObject::setConfigGroup(group);
377
d->tagFilterView->setConfigGroup(group);
380
void FilterSideBarWidget::doLoadState()
382
KConfigGroup group = getConfigGroup();
384
#if KDCRAW_VERSION >= 0x020000
385
d->expbox->readSettings(group);
387
d->expbox->readSettings();
390
d->textFilter->setsearchTextFields((SearchTextFilterSettings::TextFilterFields)
391
(group.readEntry(entryName(d->configSearchTextFilterFieldsEntry),
392
(int)SearchTextFilterSettings::All)));
395
d->ratingFilter->setRatingFilterCondition((ImageFilterSettings::RatingCondition)
396
(AlbumSettings::instance()->getRatingFilterCond()));
398
d->tagMatchCond = (ImageFilterSettings::MatchingCondition)
399
(group.readEntry(entryName(d->configMatchingConditionEntry),
400
(int)ImageFilterSettings::OrCondition));
402
d->tagFilterView->loadState();
404
if (d->tagFilterView->isRestoreCheckState())
406
d->withoutTagCheckBox->setChecked(group.readEntry(entryName(d->configLastShowUntaggedEntry), false));
412
void FilterSideBarWidget::doSaveState()
414
KConfigGroup group = getConfigGroup();
416
#if KDCRAW_VERSION >= 0x020000
417
d->expbox->writeSettings(group);
419
d->expbox->writeSettings();
422
group.writeEntry(entryName(d->configSearchTextFilterFieldsEntry), (int)d->textFilter->searchTextFields());
424
AlbumSettings::instance()->setRatingFilterCond(d->ratingFilter->ratingFilterCondition());
426
group.writeEntry(entryName(d->configMatchingConditionEntry), (int)d->tagMatchCond);
428
d->tagFilterView->saveState();
429
group.writeEntry(entryName(d->configLastShowUntaggedEntry), d->withoutTagCheckBox->isChecked());
433
} // namespace Digikam