digiKam
Loading...
Searching...
No Matches
tableview_columnfactory.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 : 2013-02-12
7 * Description : Table view column helpers
8 *
9 * SPDX-FileCopyrightText: 2017-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
10 * SPDX-FileCopyrightText: 2013 by Michael G. Hansen <mike at mghansen dot de>
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 *
14 * ============================================================ */
15
16#pragma once
17
18// Qt includes
19
20#include <QObject>
21#include <QHash>
22#include <QWidget>
23
24// Local includes
25
26#include "tableview_model.h"
27#include "tableview_shared.h"
28
29class QModelIndex;
30class QStyleOptionViewItem;
31
32class KConfigGroup;
33
34namespace Digikam
35{
36
37class ItemInfo;
38class ThumbnailSize;
39
41{
42public:
43
44 explicit TableViewColumnConfiguration(const QString& id = QString())
45 : columnId(id),
47 {
48 }
49
50 QString getSetting(const QString& key, const QString& defaultValue = QString()) const
51 {
52 if (!columnSettings.contains(key))
53 {
54 return defaultValue;
55 }
56
57 return columnSettings.value(key);
58 }
59
60 void loadSettings(const KConfigGroup& configGroup);
61 void saveSettings(KConfigGroup& configGroup) const;
62
63public:
64
65 QString columnId;
66 QHash<QString, QString> columnSettings;
67};
68
69// ----------------------------------------------------------------------------
70
72{
73public:
74
76 : columnId(),
78 columnIcon(),
81 {
82 }
83
84 explicit TableViewColumnDescription(const QString& id, const QString& title,
85 const QString& settingKey = QString(),
86 const QString& settingValue = QString())
87 : columnId(id),
88 columnTitle(title),
89 columnIcon(),
92 {
93 if (!settingKey.isEmpty())
94 {
95 addSetting(settingKey, settingValue);
96 }
97 }
98
99public:
100
101 typedef QList<TableViewColumnDescription> List;
102
103 QString columnId;
104 QString columnTitle;
105 QString columnIcon;
106 QHash<QString, QString> columnSettings;
107 QList<TableViewColumnDescription> subColumns;
108
109public:
110
111 void addSubColumn(const TableViewColumnDescription& subColumnDescription)
112 {
113 subColumns << subColumnDescription;
114 }
115
116 void addSetting(const QString& key, const QString& value)
117 {
118 columnSettings.insert(key, value);
119 }
120
122 {
123 TableViewColumnConfiguration configuration;
124
125 configuration.columnId = columnId;
126 configuration.columnSettings = columnSettings;
127
128 return configuration;
129 }
130
131 TableViewColumnDescription setIcon(const QString& iconName)
132 {
133 columnIcon = iconName;
134
135 return *this;
136 }
137
138 static bool FindInListById(const TableViewColumnDescription::List& listToSearch, const QString& targetId, TableViewColumnDescription* const resultDescription)
139 {
140 TableViewColumnDescription::List leftToSearch = listToSearch;
141
142 while (!leftToSearch.isEmpty())
143 {
144 const TableViewColumnDescription desc = leftToSearch.takeFirst();
145
146 if (desc.columnId == targetId)
147 {
148 *resultDescription = desc;
149
150 return true;
151 }
152
153 if (!desc.subColumns.isEmpty())
154 {
155 leftToSearch << desc.subColumns;
156 }
157 }
158
159 return false;
160 }
161};
162
163// ----------------------------------------------------------------------------
164
166{
167 Q_OBJECT
168
169public:
170
171 explicit TableViewColumnConfigurationWidget(TableViewShared* const sharedObject,
172 const TableViewColumnConfiguration& currentConfiguration,
173 QWidget* const parent = nullptr);
175
177
178public:
179
180 TableViewShared* const s = nullptr;
182};
183
184// ----------------------------------------------------------------------------
185
186class TableViewColumn : public QObject
187{
188 Q_OBJECT
189
190protected:
191
192 TableViewShared* const s = nullptr;
194
195public:
196
204 Q_DECLARE_FLAGS(ColumnFlags, ColumnFlag)
205
212
213public:
214
215 explicit TableViewColumn(TableViewShared* const tableViewShared,
216 const TableViewColumnConfiguration& pConfiguration,
217 QObject* const parent = nullptr);
218 ~TableViewColumn() override = default;
219
220public:
221
223 virtual void setConfiguration(const TableViewColumnConfiguration& newConfiguration);
224 virtual TableViewColumnConfigurationWidget* getConfigurationWidget(QWidget* const parentWidget) const;
225 virtual ColumnFlags getColumnFlags() const;
226 virtual QString getTitle() const = 0;
227
228 virtual QVariant data(TableViewModel::Item* const item, const int role) const;
229 virtual ColumnCompareResult compare(TableViewModel::Item* const itemA, TableViewModel::Item* const itemB) const;
230 virtual bool columnAffectedByChangeset(const ImageChangeset& imageChangeset) const;
231 virtual bool paint(QPainter* const painter, const QStyleOptionViewItem& option, TableViewModel::Item* const item) const;
232 virtual QSize sizeHint(const QStyleOptionViewItem& option, TableViewModel::Item* const item) const;
233 virtual void updateThumbnailSize();
234
235public:
236
238 static bool compareHelperBoolFailCheck(const bool okA, const bool okB, ColumnCompareResult* const result);
239
240 template<class MyType>
241 static ColumnCompareResult compareHelper(const MyType& A, const MyType& B)
242 {
243 if (A == B)
244 {
245 return CmpEqual;
246 }
247 else if (A > B)
248 {
249 return CmpABiggerB;
250 }
251
252 return CmpALessB;
253 }
254
255 template<typename columnClass>
256 static bool getSubColumnIndex(const QString& subColumnId, typename columnClass::SubColumn* const subColumn)
257 {
258 const int index = columnClass::getSubColumns().indexOf(subColumnId);
259
260 if (index < 0)
261 {
262 return false;
263 }
264
265 *subColumn = typename columnClass::SubColumn(index);
266
267 return true;
268 }
269
270 template<typename columnClass>
271 static bool CreateFromConfiguration(TableViewShared* const tableViewShared,
272 const TableViewColumnConfiguration& pConfiguration,
273 TableViewColumn** const pNewColumn,
274 QObject* const parent)
275 {
276 typename columnClass::SubColumn subColumn;
277
278 if (!getSubColumnIndex<columnClass>(pConfiguration.columnId, &subColumn))
279 {
280 return false;
281 }
282
283 *pNewColumn = new columnClass(tableViewShared, pConfiguration, subColumn, parent);
284
285 return true;
286 }
287
288Q_SIGNALS:
289
290 void signalDataChanged(const qlonglong imageId);
292};
293
294// ----------------------------------------------------------------------------
295
296class TableViewColumnFactory : public QObject
297{
298 Q_OBJECT
299
300public:
301
302 explicit TableViewColumnFactory(TableViewShared* const tableViewShared, QWidget* const parent);
303
304 static QList<TableViewColumnDescription> getColumnDescriptionList();
305 TableViewColumn* getColumn(const TableViewColumnConfiguration& columnConfiguration);
306
307private:
308
309 QWidget* m_displayWidget = nullptr;
310 TableViewShared* const s = nullptr;
311};
312
313// ----------------------------------------------------------------------------
314
316{
317public:
318
321
322 void loadSettings(const KConfigGroup& configGroup);
323 void saveSettings(KConfigGroup& configGroup);
324
325public:
326
327 QList<TableViewColumnConfiguration> columnConfigurationList;
328 QString name;
329 QByteArray headerState;
330};
331
332} // namespace Digikam
333
334Q_DECLARE_METATYPE(Digikam::TableViewColumnDescription)
335
336Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::TableViewColumn::ColumnFlags)
Definition coredbchangesets.h:38
Definition tableview_columnfactory.h:166
virtual TableViewColumnConfiguration getNewConfiguration()=0
TableViewShared *const s
Definition tableview_columnfactory.h:180
~TableViewColumnConfigurationWidget() override=default
TableViewColumnConfiguration configuration
Definition tableview_columnfactory.h:181
Definition tableview_columnfactory.h:41
QString getSetting(const QString &key, const QString &defaultValue=QString()) const
Definition tableview_columnfactory.h:50
QHash< QString, QString > columnSettings
Definition tableview_columnfactory.h:66
void saveSettings(KConfigGroup &configGroup) const
Definition tableview_columnfactory.cpp:309
void loadSettings(const KConfigGroup &configGroup)
Definition tableview_columnfactory.cpp:292
QString columnId
Definition tableview_columnfactory.h:65
TableViewColumnConfiguration(const QString &id=QString())
Definition tableview_columnfactory.h:44
Definition tableview_columnfactory.h:72
void addSetting(const QString &key, const QString &value)
Definition tableview_columnfactory.h:116
QString columnIcon
Definition tableview_columnfactory.h:105
TableViewColumnConfiguration toConfiguration() const
Definition tableview_columnfactory.h:121
static bool FindInListById(const TableViewColumnDescription::List &listToSearch, const QString &targetId, TableViewColumnDescription *const resultDescription)
Definition tableview_columnfactory.h:138
TableViewColumnDescription()
Definition tableview_columnfactory.h:75
QList< TableViewColumnDescription > subColumns
Definition tableview_columnfactory.h:107
TableViewColumnDescription setIcon(const QString &iconName)
Definition tableview_columnfactory.h:131
TableViewColumnDescription(const QString &id, const QString &title, const QString &settingKey=QString(), const QString &settingValue=QString())
Definition tableview_columnfactory.h:84
QHash< QString, QString > columnSettings
Definition tableview_columnfactory.h:106
QList< TableViewColumnDescription > List
Definition tableview_columnfactory.h:101
void addSubColumn(const TableViewColumnDescription &subColumnDescription)
Definition tableview_columnfactory.h:111
QString columnTitle
Definition tableview_columnfactory.h:104
QString columnId
Definition tableview_columnfactory.h:103
Definition tableview_columnfactory.h:297
TableViewColumn * getColumn(const TableViewColumnConfiguration &columnConfiguration)
Definition tableview_columnfactory.cpp:51
static QList< TableViewColumnDescription > getColumnDescriptionList()
Definition tableview_columnfactory.cpp:93
Definition tableview_columnfactory.h:316
QByteArray headerState
Definition tableview_columnfactory.h:329
void saveSettings(KConfigGroup &configGroup)
Definition tableview_columnfactory.cpp:274
QList< TableViewColumnConfiguration > columnConfigurationList
Definition tableview_columnfactory.h:327
QString name
Definition tableview_columnfactory.h:328
void loadSettings(const KConfigGroup &configGroup)
Definition tableview_columnfactory.cpp:210
Definition tableview_columnfactory.h:187
ColumnCompareResult
Definition tableview_columnfactory.h:207
@ CmpABiggerB
Definition tableview_columnfactory.h:209
@ CmpEqual
Definition tableview_columnfactory.h:208
@ CmpALessB
Definition tableview_columnfactory.h:210
virtual QVariant data(TableViewModel::Item *const item, const int role) const
Definition tableview_columnfactory.cpp:129
TableViewColumnConfiguration configuration
Definition tableview_columnfactory.h:193
static bool getSubColumnIndex(const QString &subColumnId, typename columnClass::SubColumn *const subColumn)
Definition tableview_columnfactory.h:256
virtual QSize sizeHint(const QStyleOptionViewItem &option, TableViewModel::Item *const item) const
Definition tableview_columnfactory.cpp:121
static bool compareHelperBoolFailCheck(const bool okA, const bool okB, ColumnCompareResult *const result)
Definition tableview_columnfactory.cpp:177
static bool CreateFromConfiguration(TableViewShared *const tableViewShared, const TableViewColumnConfiguration &pConfiguration, TableViewColumn **const pNewColumn, QObject *const parent)
Definition tableview_columnfactory.h:271
virtual ColumnCompareResult compare(TableViewModel::Item *const itemA, TableViewModel::Item *const itemB) const
Definition tableview_columnfactory.cpp:151
virtual TableViewColumnConfigurationWidget * getConfigurationWidget(QWidget *const parentWidget) const
Definition tableview_columnfactory.cpp:161
static TableViewColumnDescription getDescription()
static ColumnCompareResult compareHelper(const MyType &A, const MyType &B)
Definition tableview_columnfactory.h:241
TableViewShared *const s
Definition tableview_columnfactory.h:192
virtual void setConfiguration(const TableViewColumnConfiguration &newConfiguration)
Definition tableview_columnfactory.cpp:168
~TableViewColumn() override=default
virtual bool columnAffectedByChangeset(const ImageChangeset &imageChangeset) const
Definition tableview_columnfactory.cpp:203
virtual void updateThumbnailSize()
Definition tableview_columnfactory.cpp:173
void signalDataChanged(const qlonglong imageId)
virtual QString getTitle() const =0
virtual TableViewColumnConfiguration getConfiguration() const
Definition tableview_columnfactory.cpp:142
ColumnFlag
Definition tableview_columnfactory.h:198
@ ColumnHasConfigurationWidget
Definition tableview_columnfactory.h:202
@ ColumnCustomPainting
Definition tableview_columnfactory.h:200
@ ColumnNoFlags
Definition tableview_columnfactory.h:199
@ ColumnCustomSorting
Definition tableview_columnfactory.h:201
virtual bool paint(QPainter *const painter, const QStyleOptionViewItem &option, TableViewModel::Item *const item) const
Definition tableview_columnfactory.cpp:110
virtual ColumnFlags getColumnFlags() const
Definition tableview_columnfactory.cpp:137
Definition tableview_model.h:62
Definition tableview_shared.h:35
qulonglong value
Definition itemviewutilities.cpp:585
Definition datefolderview.cpp:34