1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213 | /* ============================================================
*
* This file is a part of digiKam project
* https://www.digikam.org
*
* Date : 2012-07-13
* Description : Qt categorized item view for camera items
*
* SPDX-FileCopyrightText: 2012 by Islam Wazery <wazery at ubuntu dot com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* ============================================================ */
#pragma once
// Local includes
#include "itemviewcategorized.h"
#include "importimagemodel.h"
#include "importfiltermodel.h"
#include "importthumbnailmodel.h"
#include "itemdelegateoverlay.h"
#include "camiteminfo.h"
#include "digikam_export.h"
namespace Digikam
{
class ImportDelegate;
class ICCSettingsContainer;
class DIGIKAM_GUI_EXPORT ImportCategorizedView : public ItemViewCategorized
{
Q_OBJECT
public:
explicit ImportCategorizedView(QWidget* const parent = nullptr);
~ImportCategorizedView() override;
void setModels(ImportItemModel* model,
ImportSortFilterModel* filterModel);
ImportItemModel* importItemModel() const;
ImportSortFilterModel* importSortFilterModel() const;
QItemSelectionModel* getSelectionModel() const;
/**
* Returns any ImportFilterModel in chain. May not be sourceModel()
*/
ImportFilterModel* importFilterModel() const;
/**
* Returns 0 if the ImportItemModel is not an ImportThumbnailModel
*/
ImportThumbnailModel* importThumbnailModel() const;
ImportDelegate* importDelegate() const;
CamItemInfo currentInfo() const;
QUrl currentUrl() const;
QList<CamItemInfo> selectedCamItemInfos() const;
QList<CamItemInfo> selectedCamItemInfosCurrentFirst() const;
QList<QUrl> selectedUrls() const;
QList<CamItemInfo> camItemInfos() const;
QList<QUrl> urls() const;
/**
* Selects the index as current and scrolls to it
*/
void toIndex(const QUrl& url);
/** Returns the n-th info after the given one.
* Specifically, return the previous info for nth = -1
* and the next info for n = 1.
* Returns a null info if either startingPoint or the nth info are
* not contained in the model
*/
CamItemInfo nextInOrder(const CamItemInfo& startingPoint, int nth);
CamItemInfo previousInfo(const CamItemInfo& info)
{
return nextInOrder(info, -1);
}
CamItemInfo nextInfo(const CamItemInfo& info)
{
return nextInOrder(info, 1);
}
/**
* Add and remove an overlay. It will as well be removed automatically when destroyed.
* Unless you pass a different delegate, the current delegate will be used.
*/
void addOverlay(ItemDelegateOverlay* overlay, ImportDelegate* delegate = nullptr);
void removeOverlay(ItemDelegateOverlay* overlay);
void addSelectionOverlay(ImportDelegate* delegate = nullptr);
ThumbnailSize thumbnailSize() const;
virtual void setThumbnailSize(const ThumbnailSize& size);
public Q_SLOTS:
void setThumbnailSize(int size);
/**
* Scroll the view to the given item when it becomes available
*/
void setCurrentWhenAvailable(qlonglong camItemId);
/**
* Set as current item the item identified by its file url
*/
void setCurrentUrl(const QUrl& url);
/**
* Set as current item the item identified by the CamItemInfo
*/
void setCurrentInfo(const CamItemInfo& info);
/**
* Set selected items identified by their file urls
*/
void setSelectedUrls(const QList<QUrl>& urlList);
/**
* Set selected items
*/
void setSelectedCamItemInfos(const QList<CamItemInfo>& infos);
/**
* Does something to gain attention for info, but not changing current selection
*/
void hintAt(const CamItemInfo& info);
Q_SIGNALS:
void currentCamItemInfoChanged(const CamItemInfo& info);
/**
* Emitted when new items are selected. The parameter includes only the newly selected infos,
* there may be other already selected infos.
*/
void selected(const QList<CamItemInfo>& newSelectedInfos);
/**
* Emitted when items are deselected. There may be other selected infos left.
* This signal is not emitted when the model is reset; then only selectionCleared is emitted.
*/
void deselected(const QList<CamItemInfo>& nowDeselectedInfos);
/**
* Emitted when the given CamItemInfo is activated. Info is never null.
*/
void camItemInfoActivated(const CamItemInfo& info);
/**
* Emitted when a new model is set
*/
void modelChanged();
protected Q_SLOTS:
void slotCamItemInfosAdded();
protected:
/// reimplemented from parent class
QSortFilterProxyModel* filterModel() const override;
AbstractItemDragDropHandler* dragDropHandler() const override;
QModelIndex nextIndexHint(const QModelIndex& indexToAnchor, const QItemSelectionRange& removed) const override;
void setItemDelegate(ImportDelegate* delegate);
void indexActivated(const QModelIndex& index, Qt::KeyboardModifiers modifiers) override;
void currentChanged(const QModelIndex& index, const QModelIndex& previous) override;
void paintEvent(QPaintEvent* e) override;<--- Function in derived class
void selectionChanged(const QItemSelection&, const QItemSelection&) override;
void updateGeometries() override;
/// Reimplement these in a subclass
virtual void activated(const CamItemInfo& info, Qt::KeyboardModifiers modifiers);
virtual void showContextMenuOnInfo(QContextMenuEvent* event, const CamItemInfo& info);
void showContextMenuOnIndex(QContextMenuEvent* event, const QModelIndex& index) override;
private Q_SLOTS:
void slotFileChanged(const QString& filePath);
void slotDelayedEnter();
void slotIccSettingsChanged(const ICCSettingsContainer&, const ICCSettingsContainer&);
private:
void scrollToStoredItem();
private:
// Disable
ImportCategorizedView(const ImportCategorizedView&) = delete;
ImportCategorizedView& operator=(const ImportCategorizedView&) = delete;
private:
class Private;
Private* const d = nullptr;
};
} // namespace Digikam
|