Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_categories_mapper.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_CATEGORIES_MAPPER_H
8#define __KIS_CATEGORIES_MAPPER_H
9
10#include <QObject>
11#include <QScopedPointer>
12#include <kritaui_export.h>
13
14
19class KRITAUI_EXPORT __CategoriesSignalsBase : public QObject
20{
21 Q_OBJECT
22
23Q_SIGNALS:
24 void rowChanged(int row);
25 void beginInsertRow(int row);
27 void beginRemoveRow(int row);
29};
30
31
32template<class TEntry, class TEntryToQStringConverter>
34{
35public:
36
38 {
39 public:
40 DataItem(const QString &categoryName, KisCategoriesMapper *parent)
41 : m_name(categoryName),
42 m_category(0),
43 m_expanded(false),
44 m_enabled(true),
45 m_checkable(false),
46 m_checked(false),
47 m_locked(false),
48 m_lockable(false),
49 m_toggled(false),
50 m_parent(parent)
51 {
52 }
53
54 DataItem(const TEntry &entry, DataItem *category, KisCategoriesMapper *parent)
55 : m_data(new TEntry(entry)),
56 m_category(category),
57 m_expanded(false),
58 m_enabled(true),
59 m_checkable(false),
60 m_checked(false),
61 m_locked(false),
62 m_lockable(false),
63 m_toggled(false),
64 m_parent(parent)
65 {
66 Q_ASSERT(category);
67
68 TEntryToQStringConverter converter;
69 m_name = converter(entry);
70 }
71
72 TEntry* data() const {
73 return m_data.data();
74 }
75
76 QString name() const {
77 return m_name;
78 }
79
80 bool isCategory() const {
81 Q_ASSERT(static_cast<bool>(m_category) == static_cast<bool>(m_data));
82 return !m_category;
83 }
84
86 return m_category;
87 }
88
89 bool isExpanded() const {
90 return m_expanded;
91 }
92
93 void setExpanded(bool value) {
94 Q_ASSERT(isCategory());
95 if (m_expanded == value) return;
96
99 }
100
101 bool isEnabled() const {
102 return m_enabled;
103 }
104
105 void setEnabled(bool value) {
106 if (m_enabled == value) return;
107
110 }
111
112 bool isCheckable() const {
113 return m_checkable;
114 }
115
116 void setCheckable(bool value) {
117 if (m_checkable == value) return;
118
121 }
122
123 bool isChecked() const {
124 return m_checked;
125 }
126
127 void setChecked(bool value) {
128 if (m_checked == value) return;
129
133 }
134 bool isLocked() const {
135 return m_locked;
136 }
137 void setLocked(bool value){
138 m_locked = value;
139 }
140 bool isLockable() const {
141 return m_lockable;
142 }
143 void setLockable(bool value){
145 }
146 bool isToggled() const {
147 return m_toggled;
148 }
149 void setToggled(bool value){
151 }
152
153 private:
156 }
157
158 private:
159 QString m_name;
160 QScopedPointer<TEntry> m_data;
162
171 };
172
173public:
176 qDeleteAll(m_items);
177 }
178
179 DataItem* addCategory(const QString &category) {
180 if (fetchCategory(category)) return 0;
181 DataItem *item = new DataItem(category, this);
182
183 Q_EMIT beginInsertRow(m_items.size());
184 m_items.append(item);
185 Q_EMIT endInsertRow();
186 return item;
187 }
188
189 void removeCategory(const QString &category) {
190 QMutableListIterator<DataItem*> it(m_items);
191 DataItem *categoryItem = 0;
192
193 int row = 0;
194 while(it.hasNext()) {
195 DataItem *item = it.next();
196
197 if (!item->isCategory() &&
198 item->parentCategory()->name() == category) {
199
200 Q_EMIT beginRemoveRow(row);
201 it.remove();
202 delete item;
203 Q_EMIT endRemoveRow();
204 } else {
205 if (item->isCategory() && item->name() == category) {
206 Q_ASSERT(!categoryItem);
207 categoryItem = item;
208 }
209 row++;
210 }
211 }
212
213 if (categoryItem) {
214 int row = m_items.indexOf(categoryItem);
215 Q_EMIT beginRemoveRow(row);
216 delete m_items.takeAt(row);
217 Q_EMIT endRemoveRow();
218 }
219 }
220
221 DataItem* addEntry(const QString &category, const TEntry &entry) {
222 DataItem *categoryItem = fetchCategory(category);
223 if (!categoryItem) {
224 categoryItem = addCategory(category);
225 }
226 DataItem *item = new DataItem(entry, categoryItem, this);
227
228 Q_EMIT beginInsertRow(m_items.size());
229 m_items.append(item);
230 Q_EMIT endInsertRow();
231 return item;
232 }
233
234 void removeEntry(const QString &category, const TEntry &entry) {
235 DataItem *item = fetchEntry(category, entry);
236 if (!item) return;
237
238 int row = m_items.indexOf(item);
239 Q_EMIT beginRemoveRow(row);
240 delete m_items.takeAt(row);
241 Q_EMIT endRemoveRow();
242 }
243
244 DataItem* fetchCategory(const QString &category) const {
245 Q_FOREACH (DataItem *item, m_items) {
246 if (item->isCategory() && item->name() == category) return item;
247 }
248 return 0;
249 }
250
251 DataItem* fetchEntry(const QString &category, const TEntry &entry) const {
252 Q_FOREACH (DataItem *item, m_items) {
253 if (!item->isCategory() &&
254 *item->data() == entry &&
255 item->parentCategory()->name() == category) return item;
256 }
257 return 0;
258 }
259
260 DataItem* fetchOneEntry(const TEntry &entry) const {
261 Q_FOREACH (DataItem *item, m_items) {
262 if (!item->isCategory() &&
263 *item->data() == entry) return item;
264 }
265 return 0;
266 }
267
268 QVector<DataItem*> itemsForCategory(const QString &category) const {
269 QVector<DataItem*> filteredItems;
270
271 Q_FOREACH (DataItem *item, m_items) {
272 if (!item->isCategory() &&
273 item->parentCategory()->name() == category) {
274
275 filteredItems.append(item);
276 }
277 }
278
279 return filteredItems;
280 }
281
283 Q_FOREACH (DataItem *item, m_items) {
284 if (item->isCategory()) {
285 item->setExpanded(true);
286 }
287 }
288 }
289
290 DataItem* itemFromRow(int row) const {
291 return m_items[row];
292 }
293
294 int rowFromItem(DataItem *item) const {
295 return m_items.indexOf(item);
296 }
297
298 int rowCount() const {
299 return m_items.size();
300 }
301
302private:
304 Q_EMIT rowChanged(m_items.indexOf(item));
305 }
306
307 void notifyCategoryExpanded(DataItem *categoryItem) {
308 Q_ASSERT(categoryItem->isCategory());
309 notifyItemChanged(categoryItem);
310
311 Q_FOREACH (DataItem *item, m_items) {
312 if (!item->isCategory() &&
313 item->parentCategory() == categoryItem) {
314
315 notifyItemChanged(item);
316 }
317 }
318 }
319
320protected:
324
325private:
327};
328
329#endif /* __KIS_CATEGORIES_MAPPER_H */
float value(const T *src, size_t ch)
DataItem(const TEntry &entry, DataItem *category, KisCategoriesMapper *parent)
DataItem(const QString &categoryName, KisCategoriesMapper *parent)
DataItem * addEntry(const QString &category, const TEntry &entry)
DataItem * fetchEntry(const QString &category, const TEntry &entry) const
void notifyItemChanged(DataItem *item)
void notifyCategoryExpanded(DataItem *categoryItem)
void removeCategory(const QString &category)
QList< DataItem * > m_items
int rowFromItem(DataItem *item) const
DataItem * fetchCategory(const QString &category) const
QVector< DataItem * > itemsForCategory(const QString &category) const
DataItem * addCategory(const QString &category)
void removeEntry(const QString &category, const TEntry &entry)
DataItem * fetchOneEntry(const TEntry &entry) const
DataItem * itemFromRow(int row) const
QList< DataItem * > & testingGetItems()
void rowChanged(int row)
void beginInsertRow(int row)
void beginRemoveRow(int row)