digiKam
Loading...
Searching...
No Matches
itemmodel.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-05
7 * Description : Qt item model for database entries
8 *
9 * SPDX-FileCopyrightText: 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 * SPDX-FileCopyrightText: 2012-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 *
14 * ============================================================ */
15
16#pragma once
17
18// Qt includes
19
20#include <QAbstractListModel>
21
22// Local includes
23
25#include "iteminfo.h"
26#include "digikam_export.h"
27
28class QItemSelection;
29
30namespace Digikam
31{
32
33class AlbumChangeset;
34class ImageChangeset;
35class ImageTagChangeset;
36
37namespace DatabaseFields
38{
39class Set;
40}
41
42class DIGIKAM_DATABASE_EXPORT ItemModel : public QAbstractListModel,
44{
45 Q_OBJECT
46
47public:
48
50 {
54 ItemModelPointerRole = Qt::UserRole,
55 ItemModelInternalId = Qt::UserRole + 1,
56
61 ThumbnailRole = Qt::UserRole + 2,
62
66 CreationDateRole = Qt::UserRole + 3,
67
71 ExtraDataRole = Qt::UserRole + 5,
72
76 ExtraDataDuplicateCount = Qt::UserRole + 6,
77
82 LTLeftPanelRole = Qt::UserRole + 50,
83
87 LTRightPanelRole = Qt::UserRole + 51,
88
92 SubclassRoles = Qt::UserRole + 100,
93
97 FilterModelRoles = Qt::UserRole + 500
98 };
99
100public:
101
102 explicit ItemModel(QObject* const parent = nullptr);
103 ~ItemModel() override;
104
109 void setKeepsFilePathCache(bool keepCache);
110 bool keepsFilePathCache() const;
111
117 void setWatchFlags(const DatabaseFields::Set& set);
118
125 ItemInfo imageInfo(const QModelIndex& index) const;
126 ItemInfo& imageInfoRef(const QModelIndex& index) const;
127 qlonglong imageId(const QModelIndex& index) const;
128 QList<ItemInfo> imageInfos(const QList<QModelIndex>& indexes) const;
129 QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
130
136 ItemInfo imageInfo(int row) const;
137 ItemInfo& imageInfoRef(int row) const;
138 qlonglong imageId(int row) const;
139
143 QModelIndex indexForItemInfo(const ItemInfo& info) const;
144 QModelIndex indexForItemInfo(const ItemInfo& info, const QVariant& extraValue) const;
145 QModelIndex indexForImageId(qlonglong id) const;
146 QModelIndex indexForImageId(qlonglong id, const QVariant& extraValue) const;
147 QList<QModelIndex> indexesForItemInfo(const ItemInfo& info) const;
148 QList<QModelIndex> indexesForImageId(qlonglong id) const;
149
150 int numberOfIndexesForItemInfo(const ItemInfo& info) const;
151 int numberOfIndexesForImageId(qlonglong id) const;
152
160 QModelIndex indexForPath(const QString& filePath) const;
161 ItemInfo imageInfo(const QString& filePath) const;
162 QList<QModelIndex> indexesForPath(const QString& filePath) const;
163 QList<ItemInfo> imageInfos(const QString& filePath) const;
164
171 void addItemInfo(const ItemInfo& info);
172 void addItemInfos(const QList<ItemInfo>& infos);
173 void addItemInfos(const QList<ItemInfo>& infos, const QList<QVariant>& extraValues);
174
178 void clearItemInfos();
179
183 void setItemInfos(const QList<ItemInfo>& infos);
184
188 void removeIndex(const QModelIndex& indexes);
189 void removeIndexes(const QList<QModelIndex>& indexes);
190 void removeItemInfo(const ItemInfo& info);
191 void removeItemInfos(const QList<ItemInfo>& infos);
192 void removeItemInfos(const QList<ItemInfo>& infos, const QList<QVariant>& extraValues);
193
201 void addItemInfoSynchronously(const ItemInfo& info);
202 void addItemInfosSynchronously(const QList<ItemInfo>& infos);
203 void addItemInfosSynchronously(const QList<ItemInfo>& infos, const QList<QVariant>& extraValues);
204
210 void ensureHasItemInfo(const ItemInfo& info);
211 void ensureHasItemInfos(const QList<ItemInfo>& infos);
212 void ensureHasItemInfos(const QList<ItemInfo>& infos, const QList<QVariant>& extraValues);
213
217 void ensureHasGroupedImages(const ItemInfo& groupLeader);
218
219 QList<ItemInfo> imageInfos() const;
220 QList<qlonglong> imageIds() const;
221 QList<ItemInfo> uniqueItemInfos() const;
222
223 bool hasImage(qlonglong id) const;
224 bool hasImage(const ItemInfo& info) const;
225 bool hasImage(const ItemInfo& info, const QVariant& extraValue) const;
226 bool hasImage(qlonglong id, const QVariant& extraValue) const;
227
228 bool isEmpty() const;
229 int itemCount() const;
230
231 // Drag and Drop
233
246 void setPreprocessor(QObject* const processor);
247 void unsetPreprocessor(QObject* const processor);
248
254 bool isRefreshing() const;
255
260 void setSendRemovalSignals(bool send);
261
262 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
263 QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
264 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
265 Qt::ItemFlags flags(const QModelIndex& index) const override;
266 QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const override;
267
272 static ItemInfo retrieveItemInfo(const QModelIndex& index);
273 static qlonglong retrieveImageId(const QModelIndex& index);
274
275Q_SIGNALS:
276
281 void imageInfosAboutToBeAdded(const QList<ItemInfo>& infos);
282
287 void imageInfosAdded(const QList<ItemInfo>& infos);
288
295 void imageInfosAboutToBeRemoved(const QList<ItemInfo>& infos);
296
303 void imageInfosRemoved(const QList<ItemInfo>& infos);
304
308 void preprocess(const QList<ItemInfo>& infos, const QList<QVariant>&);
309 void processAdded(const QList<ItemInfo>& infos, const QList<QVariant>&);
310
315 void imageChange(const ImageChangeset&, const QItemSelection&);
316
321 void imageTagChange(const ImageTagChangeset&, const QItemSelection&);
322
328
335
336public Q_SLOTS:
337
338 void reAddItemInfos(const QList<ItemInfo>& infos, const QList<QVariant>& extraValues);
339 void reAddingFinished();
340
341protected:
342
349 void startRefresh();
350 void finishRefresh();
351
357 void requestIncrementalRefresh();
358 bool hasIncrementalRefreshPending() const;
359
365 void startIncrementalRefresh();
366 void finishIncrementalRefresh();
367
368 void emitDataChangedForAll();
369 void emitDataChangedForSelection(const QItemSelection& selection);
370
374 virtual void imageInfosCleared() {};
375
379 virtual void imageInfosAboutToBeRemoved(int /*begin*/, int /*end*/) {};
380
381protected Q_SLOTS:
382
383 virtual void slotAlbumChange(const AlbumChangeset& changeset);
384 virtual void slotImageChange(const ImageChangeset& changeset);
385 virtual void slotImageTagChange(const ImageTagChangeset& changeset);
386
387private:
388
389 void appendInfos(const QList<ItemInfo>& infos, const QList<QVariant>& extraValues);
390 void appendInfosChecked(const QList<ItemInfo>& infos, const QList<QVariant>& extraValues);
391 void publiciseInfos(const QList<ItemInfo>& infos, const QList<QVariant>& extraValues);
392 void cleanSituationChecks();
393 void removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove);
394 void removeRowPairs(const QList<QPair<int, int> >& toRemove);
395
396public:
397
398 // Declared public because it's used in ItemModelIncrementalUpdater class
399 class Private;
400
401private:
402
403 // Disable
404 ItemModel(const ItemModel&) = delete;
405 ItemModel& operator=(const ItemModel&) = delete;
406
407 Private* const d = nullptr;
408};
409
410} // namespace Digikam
411
412Q_DECLARE_METATYPE(Digikam::ItemModel*)
Definition coredbchangesets.h:252
Definition coredbfields.h:376
Definition dragdropimplementations.h:30
Definition coredbchangesets.h:38
Definition coredbchangesets.h:70
Definition iteminfo.h:68
Definition itemmodel.h:44
ItemModelRoles
Definition itemmodel.h:50
virtual void imageInfosAboutToBeRemoved(int, int)
Definition itemmodel.h:379
virtual void imageInfosCleared()
Definition itemmodel.h:374
void imageInfosAdded(const QList< ItemInfo > &infos)
void imageInfosRemoved(const QList< ItemInfo > &infos)
void readyForIncrementalRefresh()
void imageInfosAboutToBeRemoved(const QList< ItemInfo > &infos)
void preprocess(const QList< ItemInfo > &infos, const QList< QVariant > &)
void allRefreshingFinished()
void imageChange(const ImageChangeset &, const QItemSelection &)
void imageInfosAboutToBeAdded(const QList< ItemInfo > &infos)
void imageTagChange(const ImageTagChangeset &, const QItemSelection &)
void processAdded(const QList< ItemInfo > &infos, const QList< QVariant > &)
#define DECLARE_MODEL_DRAG_DROP_METHODS
Definition dragdropimplementations.h:80
Definition datefolderview.cpp:34