41
44
AlbumFilterModel::AlbumFilterModel(QObject *parent)
42
45
: QSortFilterProxyModel(parent)
44
48
setDynamicSortFilter(true);
49
setSortRole(AbstractAlbumModel::AlbumSortRole);
50
setSortCaseSensitivity(Qt::CaseInsensitive);
52
// sorting may have changed when the string comparison is different
53
connect(AlbumSettings::instance(), SIGNAL(setupChanged()),
54
this, SLOT(invalidate()));
47
58
void AlbumFilterModel::setSearchTextSettings(const SearchTextSettings& settings)
61
// don't use isFiltering here because it may be reimplemented
62
bool wasSearching = settingsFilter(m_settings);
63
bool willSearch = settingsFilter(settings);
64
emit searchTextSettingsAboutToChange(wasSearching, willSearch);
49
66
m_settings = settings;
50
67
invalidateFilter();
51
68
emit filterChanged();
70
emit searchTextSettingsChanged(wasSearching, willSearch);
72
if (sourceAlbumModel()->albumType() == Album::PHYSICAL)
74
// find out if this setting has some results or not
76
// for every collection we got
77
for(int i = 0; i < rowCount(rootAlbumIndex()); ++i)
79
QModelIndex collectionIndex = index(i, 0, rootAlbumIndex());
80
// count the number of rows
81
validRows += rowCount(collectionIndex);
83
bool hasResult = validRows > 0;
84
kDebug() << "new search text settings: " << settings.text
85
<< ": hasResult = " << hasResult << ", validRows = "
87
emit hasSearchResult(hasResult);
91
QModelIndex head = rootAlbumIndex(); // either root, or invalid, thus toplevel
92
emit hasSearchResult(rowCount(head));
96
bool AlbumFilterModel::settingsFilter(const SearchTextSettings &settings) const
98
return !settings.text.isEmpty();
54
101
bool AlbumFilterModel::isFiltering() const
56
return !m_settings.text.isEmpty();
103
return settingsFilter(m_settings);
59
106
SearchTextSettings AlbumFilterModel::searchTextSettings() const
75
129
AbstractAlbumModel *AlbumFilterModel::sourceAlbumModel() const
132
return m_chainedModel->sourceAlbumModel();
77
133
return static_cast<AbstractAlbumModel*>(sourceModel());
136
QModelIndex AlbumFilterModel::mapToSourceAlbumModel(const QModelIndex& index) const
139
return m_chainedModel->mapToSourceAlbumModel(mapToSource(index));
140
return mapToSource(index);
143
QModelIndex AlbumFilterModel::mapFromSourceAlbumModel(const QModelIndex& albummodel_index) const
146
return mapFromSource(m_chainedModel->mapFromSourceAlbumModel(albummodel_index));
147
return mapFromSource(albummodel_index);
80
150
Album *AlbumFilterModel::albumForIndex(const QModelIndex& index) const
82
return sourceAlbumModel()->albumForIndex(mapToSource(index));
152
return AbstractAlbumModel::retrieveAlbum(index);
85
155
QModelIndex AlbumFilterModel::indexForAlbum(Album *album) const
87
return mapFromSource(sourceAlbumModel()->indexForAlbum(album));
157
return mapFromSourceAlbumModel(sourceAlbumModel()->indexForAlbum(album));
90
160
QModelIndex AlbumFilterModel::rootAlbumIndex() const
92
return mapFromSource(sourceAlbumModel()->rootAlbumIndex());
95
AlbumFilterModel::MatchResult AlbumFilterModel::matches(const QModelIndex& index) const
97
return matches(sourceAlbumModel()->albumForIndex(mapToSource(index)));
100
AlbumFilterModel::MatchResult AlbumFilterModel::matches(Album *album) const
162
return mapFromSourceAlbumModel(sourceAlbumModel()->rootAlbumIndex());
165
bool AlbumFilterModel::matches(Album *album) const
167
// We want to work on the visual representation, so we use model data with AlbumTitleRole,
168
// not a direct Album method.
169
// We use direct source's index, not our index,
170
// because if the item is currently filtered out, we won't have an index for this album.
171
QModelIndex source_index = sourceAlbumModel()->indexForAlbum(album);
173
source_index = m_chainedModel->mapFromSourceAlbumModel(source_index);
174
QString displayTitle = source_index.data(AbstractAlbumModel::AlbumTitleRole).toString();
175
return displayTitle.contains(m_settings.text, m_settings.caseSensitive);
178
AlbumFilterModel::MatchResult AlbumFilterModel::matchResult(const QModelIndex& index) const
180
return matchResult(albumForIndex(index));
183
AlbumFilterModel::MatchResult AlbumFilterModel::matchResult(Album *album) const
149
230
QVariant valLeft = left.data(sortRole());
150
231
QVariant valRight = right.data(sortRole());
152
if (valLeft.type() == QVariant::String && valRight.type() == QVariant::String)
153
return KStringHandler::naturalCompare(valLeft.toString(), valRight.toString(), sortCaseSensitivity()) < 0;
233
if ((valLeft.type() == QVariant::String) && (valRight.type() == QVariant::String))
234
switch (AlbumSettings::instance()->getStringComparisonType())
236
case AlbumSettings::Natural:
237
return KStringHandler::naturalCompare(valLeft.toString(), valRight.toString(), sortCaseSensitivity()) < 0;
238
case AlbumSettings::Normal:
240
return QString::compare(valLeft.toString(), valRight.toString(), sortCaseSensitivity()) < 0;
155
243
return QSortFilterProxyModel::lessThan(left, right);
246
// -----------------------------------------------------------------------------
248
CheckableAlbumFilterModel::CheckableAlbumFilterModel(QObject *parent) :
249
AlbumFilterModel(parent), m_filterChecked(false),
250
m_filterPartiallyChecked(false)
254
void CheckableAlbumFilterModel::setSourceCheckableAlbumModel(AbstractCheckableAlbumModel *source)
256
setSourceModel(source);
259
AbstractCheckableAlbumModel *CheckableAlbumFilterModel::sourceAlbumModel() const
261
return dynamic_cast<AbstractCheckableAlbumModel*> (sourceModel());
264
void CheckableAlbumFilterModel::setSourceAlbumModel(AbstractAlbumModel *source)
266
AlbumFilterModel::setSourceAlbumModel(source);
269
void CheckableAlbumFilterModel::setFilterChecked(bool filter)
271
m_filterChecked = filter;
273
emit filterChanged();
276
void CheckableAlbumFilterModel::setFilterPartiallyChecked(bool filter)
278
m_filterPartiallyChecked = filter;
280
emit filterChanged();
283
bool CheckableAlbumFilterModel::isFiltering() const
285
return AlbumFilterModel::isFiltering() || m_filterChecked
286
|| m_filterPartiallyChecked;
289
bool CheckableAlbumFilterModel::matches(Album *album) const
292
bool accepted = AlbumFilterModel::matches(album);
294
if (!m_filterChecked && !m_filterPartiallyChecked)
299
Qt::CheckState state = sourceAlbumModel()->checkState(album);
301
bool stateAccepted = false;
302
if (m_filterPartiallyChecked)
304
stateAccepted |= state == Qt::PartiallyChecked;
308
stateAccepted |= state == Qt::Checked;
311
return accepted && stateAccepted;
316
// -----------------------------------------------------------------------------
318
SearchFilterModel::SearchFilterModel(QObject *parent)
319
: CheckableAlbumFilterModel(parent), m_searchType(-1)
323
void SearchFilterModel::setSourceSearchModel(SearchModel *source)
325
setSourceModel(source);
328
SearchModel *SearchFilterModel::sourceSearchModel() const
330
return dynamic_cast<SearchModel*> (sourceModel());
333
void SearchFilterModel::setFilterSearchType(DatabaseSearch::Type type)
338
void SearchFilterModel::listNormalSearches()
343
void SearchFilterModel::listAllSearches()
348
void SearchFilterModel::listTimelineSearches()
350
setTypeFilter(DatabaseSearch::TimeLineSearch);
353
void SearchFilterModel::listHaarSearches()
355
setTypeFilter(DatabaseSearch::HaarSearch);
358
void SearchFilterModel::listMapSearches()
360
setTypeFilter(DatabaseSearch::MapSearch);
363
void SearchFilterModel::listDuplicatesSearches()
365
setTypeFilter(DatabaseSearch::DuplicatesSearch);
368
void SearchFilterModel::setTypeFilter(int type)
372
emit filterChanged();
375
void SearchFilterModel::setListTemporarySearches(bool list)
377
m_listTemporary = list;
379
emit filterChanged();
382
bool SearchFilterModel::isFiltering() const
384
return m_searchType != -2 || !m_listTemporary;
387
bool SearchFilterModel::matches(Album *album) const
389
if (!AlbumFilterModel::matches(album))
392
SAlbum *salbum = static_cast<SAlbum*>(album);
394
if (m_searchType == -1)
396
if (!salbum->isNormalSearch())
399
else if (m_searchType == -2)
404
if (salbum->searchType() != (DatabaseSearch::Type)m_searchType)
408
if (!m_listTemporary && salbum->isTemporarySearch())
414
void SearchFilterModel::setSourceAlbumModel(AbstractAlbumModel *source)
416
AlbumFilterModel::setSourceAlbumModel(source);
158
419
} // namespace Digikam