digiKam
Loading...
Searching...
No Matches
abstractalbummodel.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2009-03-23
7 * Description : Qt Model for Albums
8 *
9 * SPDX-FileCopyrightText: 2008-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 * SPDX-FileCopyrightText: 2010 by Andi Clemens <andi dot clemens at gmail dot com>
11 * SPDX-FileCopyrightText: 2012-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * ============================================================ */
16
17#pragma once
18
19// Qt includes
20
21#include <QAbstractItemModel>
22#include <QHash>
23#include <QPixmap>
24#include <QSet>
25
26// Local includes
27
28#include "album.h"
29#include "digikam_export.h"
30
31namespace Digikam
32{
33
34class Album;
35class AlbumManager;
36class AlbumModelDragDropHandler;
37
38class DIGIKAM_GUI_EXPORT AbstractAlbumModel : public QAbstractItemModel
39{
40 Q_OBJECT
41
42public:
43
50 {
60 IgnoreRootAlbum
61 };
62
64 {
66 AlbumTitleRole = Qt::UserRole,
68 AlbumTypeRole = Qt::UserRole + 1,
70 AlbumPointerRole = Qt::UserRole + 2,
72 AlbumIdRole = Qt::UserRole + 3,
74 AlbumGlobalIdRole = Qt::UserRole + 4,
76 AlbumSortRole = Qt::UserRole + 5
77 };
78
79public:
80
86 explicit AbstractAlbumModel(Album::Type albumType,
87 Album* const rootAlbum,
88 RootAlbumBehavior rootBehavior = IncludeRootAlbum,
89 QObject* const parent = nullptr);
90 ~AbstractAlbumModel() override;
91
95 void setDropIndex(const QModelIndex& index);
96
100 void setDragDropHandler(AlbumModelDragDropHandler* handler);
101
105 AlbumModelDragDropHandler* dragDropHandler() const;
106
110 Album* albumForIndex(const QModelIndex& index) const;
111
116 QModelIndex indexForAlbum(Album* album) const;
117
122 static Album* retrieveAlbum(const QModelIndex& index);
123
124 Album* rootAlbum() const;
125
129 QModelIndex rootAlbumIndex() const;
130
134 RootAlbumBehavior rootAlbumBehavior() const;
135
139 Album::Type albumType() const;
140
144 bool isFaceTagModel() const;
145
146 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
147 QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
148 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
149 int columnCount(const QModelIndex& parent = QModelIndex()) const override;
150 Qt::ItemFlags flags(const QModelIndex& index) const override;
151 bool hasChildren(const QModelIndex& parent = QModelIndex()) const override;
152 QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override;
153 QModelIndex parent(const QModelIndex& index) const override;
154
155 Qt::DropActions supportedDropActions() const override;
156 QStringList mimeTypes() const override;
157 bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) override;
158 QMimeData* mimeData(const QModelIndexList& indexes) const override;
159
160Q_SIGNALS:
161
168
169protected:
170
175 void setEnableDrag(bool enable);
176 void setEnableDrop(bool enable);
177 void setFaceTagModel(bool enable);
178
184 virtual QVariant albumData(Album* a, int role) const;
185
187 virtual QVariant decorationRoleData(Album* a) const;
188
190 virtual QVariant fontRoleData(Album* a) const;
191
193 virtual QVariant sortRoleData(Album* a) const;
194
196 virtual QString columnHeader() const;
197
199 virtual Qt::ItemFlags itemFlags(Album* album) const;
200
205 virtual bool filterAlbum(Album* album) const;
206
208 virtual void albumCleared(Album* /*album*/) {};
209
211 virtual void allAlbumsCleared() {};
212
213protected Q_SLOTS:
214
215 void slotAlbumAboutToBeAdded(Album* album, Album* parent, Album* prev);
216 void slotAlbumAdded(Album*);
217 void slotAlbumAboutToBeDeleted(Album* album);
218 void slotAlbumHasBeenDeleted(Album* album);
219 void slotAlbumsCleared();
220 void slotAlbumIconChanged(Album* album);
221 void slotAlbumRenamed(Album* album);
222
223private:
224
225 class Private;
226 Private* const d = nullptr;
227};
228
229// ------------------------------------------------------------------
230
231class DIGIKAM_GUI_EXPORT AbstractSpecificAlbumModel : public AbstractAlbumModel
232{
233 Q_OBJECT
234
235public:
236
238 explicit AbstractSpecificAlbumModel(Album::Type albumType,
239 Album* const rootAlbum,
240 RootAlbumBehavior rootBehavior = IncludeRootAlbum,
241 QObject* const parent = nullptr);
242
243protected:
244
245 QString columnHeader() const override;
246 void setColumnHeader(const QString& header);
247
249 void setupThumbnailLoading();
250 void emitDataChangedForChildren(Album* album);
251
252protected Q_SLOTS:
253
254 void slotGotThumbnailFromIcon(Album* album, const QPixmap& thumbnail);
255 void slotThumbnailLost(Album* album);
256 void slotReloadThumbnails();
257
258protected:
259
261};
262
263// ------------------------------------------------------------------
264
266{
267 Q_OBJECT
268
269public:
270
272
273 explicit AbstractCountingAlbumModel(Album::Type albumType,
274 Album* const rootAlbum,
275 RootAlbumBehavior rootBehavior = IncludeRootAlbum,
276 QObject* const parent = nullptr);
278
279 bool showCount() const;
280
286 virtual int albumCount(Album* album) const;
287
288Q_SIGNALS:
289
291
292protected:
293
297 void setup();
298
299public Q_SLOTS:
300
302 void setShowCount(bool show);
303
309 void setCountHash(const QHash<int, int>& idCountHash);
310
316 void excludeChildrenCount(const QModelIndex& index);
317
322 void includeChildrenCount(const QModelIndex& index);
323
324protected:
325
327 void setCount(Album* album, int count);
328
330 virtual Album* albumForId(int id) const = 0;
331
333 virtual QString albumName(Album* a) const;
334
336 QVariant albumData(Album* a, int role) const override;
337 void albumCleared(Album* album) override;
338 void allAlbumsCleared() override;
339
340protected Q_SLOTS:
341
342 void slotAlbumMoved(Album* album);
343
344private:
345
346 void updateCount(Album* const album);
347
348private:
349
350 class Private;
351 Private* const d = nullptr;
352};
353
354// ------------------------------------------------------------------
355
357{
358 Q_OBJECT
359
360public:
361
367 explicit AbstractCheckableAlbumModel(Album::Type albumType,
368 Album* const rootAlbum,
369 RootAlbumBehavior rootBehavior = IncludeRootAlbum,
370 QObject* const parent = nullptr);
372
374 void setCheckable(bool isCheckable);
375 bool isCheckable() const;
376
381 void setRootCheckable(bool rootIsCheckable);
382 bool rootIsCheckable() const;
383
390 void setTristate(bool isTristate);
391 bool isTristate() const;
392
399 void setAddExcludeTristate(bool b);
400 bool isAddExcludeTristate() const;
401
403 bool isChecked(Album* album) const;
404
406 Qt::CheckState checkState(Album* album) const;
407
409 QList<Album*> checkedAlbums() const;
410
412 QList<Album*> partiallyCheckedAlbums() const;
413
418 void setRecursive(bool recursive);
419
420public Q_SLOTS:
421
423 void setChecked(Album* album, bool isChecked);
424
426 void setCheckState(Album* album, Qt::CheckState state);
427
429 void toggleChecked(Album* album);
430
432 void resetAllCheckedAlbums();
433
435 void resetCheckedAlbums(const QModelIndex& parent = QModelIndex());
436
438 void resetCheckedParentAlbums(const QModelIndex& child);
439
441 void checkAllAlbums(const QModelIndex& parent = QModelIndex());
442
444 void checkAllParentAlbums(const QModelIndex& child);
445
447 void invertCheckedAlbums(const QModelIndex& parent = QModelIndex());
448
450 void setCheckStateForChildren(Album* album, Qt::CheckState state);
451
453 void setCheckStateForParents(Album* album, Qt::CheckState state);
454
455Q_SIGNALS:
456
461 void checkStateChanged(Album* album, Qt::CheckState checkState);
462
463protected:
464
468 void prepareAddExcludeDecoration(Album* a, QPixmap& icon) const;
469
470 QVariant albumData(Album* a, int role) const override;
471 Qt::ItemFlags flags(const QModelIndex& index) const override;
472
476 bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
477 bool setData(const QModelIndex& index, const QVariant& value, int role, bool recursive);
478
479 void albumCleared(Album* album) override;
480 void allAlbumsCleared() override;
481
482private:
483
484 void setDataForParents(const QModelIndex& child, const QVariant& value, int role = Qt::EditRole);
485 void setDataForChildren(const QModelIndex& parent, const QVariant& value, int role = Qt::EditRole);
486
487private:
488
489 class Private;
490 Private* const d = nullptr;
491};
492
493} // namespace Digikam
Definition abstractalbummodel.h:39
virtual void albumCleared(Album *)
Notification when an entry is removed.
Definition abstractalbummodel.h:208
RootAlbumBehavior
Definition abstractalbummodel.h:50
@ IncludeRootAlbum
Definition abstractalbummodel.h:55
AlbumDataRole
Definition abstractalbummodel.h:64
virtual void allAlbumsCleared()
Notification when all entries are removed.
Definition abstractalbummodel.h:211
Definition abstractalbummodel.h:357
void checkStateChanged(Album *album, Qt::CheckState checkState)
Definition abstractalbummodel.h:266
void signalUpdateAlbumCount(Album *album)
virtual Album * albumForId(int id) const =0
need to implement in subclass
Definition abstractalbummodel.h:232
QString m_columnHeader
Definition abstractalbummodel.h:260
Definition albummodeldragdrophandler.h:29
Abstract base class for all album types.
Definition album.h:57
Type
Definition album.h:61
qulonglong value
Definition itemviewutilities.cpp:585
@ Album
Definition coredbfields.h:48
Definition datefolderview.cpp:34