Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_filters_model.cc
Go to the documentation of this file.
1/*
2 * This file is part of Krita
3 *
4 * SPDX-FileCopyrightText: 2007 Cyrille Berger <cberger@cberger.net>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include "kis_filters_model.h"
10
11#include <QPixmap>
12
13#include <filter/kis_filter.h>
15#include <kis_paint_device.h>
17#include <kis_selection.h>
18
20 struct Node {
21
22 virtual ~Node() {}
23
24 QString name;
25 QString displayRole() {
26 return name;
27 }
28 virtual int childrenCount() = 0;
29
30 };
31 struct Filter : public Node {
32
33 ~Filter() override {}
34
35 QString id;
36 QPixmap icon;
38 int childrenCount() override {
39 return 0;
40 }
41 };
42 struct Category : public Node {
43
44 ~Category() override {}
45
46 QString id;
48 int childrenCount() override {
49 return filters.count();
50 }
51 };
52
53 QHash<QString, Category> categories;
56};
57
59 : d(new Private)
60{
61 d->thumb = thumb;
63 keys.sort();
64
65 Q_FOREACH (const QString &filterName, keys) {
66 KisFilterSP filter = KisFilterRegistry::instance()->get(filterName);
67 if (!showAll && !filter->supportsAdjustmentLayers()) {
68 continue;
69 }
70 Q_ASSERT(filter);
71 if (!d->categories.contains(filter->menuCategory().id())) {
73 cat.id = filter->menuCategory().id();
74 cat.name = filter->menuCategory().name();
75 d->categories[ cat.id ] = cat;
76 d->categoriesKeys.append(cat.id);
77 }
78 Private::Filter filt;
79 filt.id = filter->id();
80 filt.name = filter->name();
81 filt.filter = filter;
82 d->categories[filter->menuCategory().id()].filters.append(filt);
83 }
84 std::sort(d->categoriesKeys.begin(), d->categoriesKeys.end());
85
86}
87
92
93int KisFiltersModel::rowCount(const QModelIndex &parent) const
94{
95 if (parent.isValid()) {
96 Private::Node* node = static_cast<Private::Node*>(parent.internalPointer());
97 return node->childrenCount();
98 } else {
99 return d->categoriesKeys.count();
100 }
101}
102
103int KisFiltersModel::columnCount(const QModelIndex &parent) const
104{
105 Q_UNUSED(parent);
106 return 1;
107}
108
109QModelIndex KisFiltersModel::indexForFilter(const QString& id)
110{
111 for (int i = 0; i < d->categoriesKeys.size(); i++) {
113 for (int j = 0; j < category.filters.size(); j++) {
114 KisFiltersModel::Private::Filter& filter = category.filters[j];
115 if (filter.id == id) {
116 return index(j, i, index(i , 0, QModelIndex()));
117 }
118 }
119 }
120 return QModelIndex();
121}
122
123const KisFilter* KisFiltersModel::indexToFilter(const QModelIndex& idx)
124{
125 Private::Node* node = static_cast<Private::Node*>(idx.internalPointer());
126 Private::Filter* filter = dynamic_cast<Private::Filter*>(node);
127 if (filter) {
128 return filter->filter;
129 }
130 return 0;
131}
132
133QModelIndex KisFiltersModel::index(int row, int column, const QModelIndex &parent) const
134{
135// dbgKrita << parent.isValid() << row << Qt::endl;
136 if (parent.isValid()) {
137 Private::Category* category = static_cast<Private::Category*>(parent.internalPointer());
138 return createIndex(row, column, &category->filters[row]);
139 } else {
140 return createIndex(row, column, &d->categories[ d->categoriesKeys[row] ]);
141 }
142}
143
144QModelIndex KisFiltersModel::parent(const QModelIndex &child) const
145{
146 if (!child.isValid())
147 return QModelIndex();
148 Private::Node* node = static_cast<Private::Node*>(child.internalPointer());
149 Private::Filter* filter = dynamic_cast<Private::Filter*>(node);
150 if (filter) {
151 QString catId = filter->filter->menuCategory().id();
152 return createIndex(d->categoriesKeys.indexOf(catId) , 0, &d->categories[ catId ]);
153 }
154 return QModelIndex(); // categories don't have parents
155}
156
157QVariant KisFiltersModel::data(const QModelIndex &index, int role) const
158{
159 if (index.isValid()) {
160 if (role == Qt::DisplayRole) {
161 Private::Node* node = static_cast<Private::Node*>(index.internalPointer());
162 return QVariant(node->displayRole());
163 }
164 }
165 return QVariant();
166}
167
168Qt::ItemFlags KisFiltersModel::flags(const QModelIndex & index) const
169{
170 if (!index.isValid()) return QFlags<Qt::ItemFlag>();
171
172 Private::Node* node = static_cast<Private::Node*>(index.internalPointer());
173 Private::Filter* filter = dynamic_cast<Private::Filter*>(node);
174 if (filter) {
175 return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
176 } else {
177 return Qt::ItemIsEnabled;
178 }
179}
180
181
static KisFilterRegistry * instance()
~KisFiltersModel() override
const KisFilter * indexToFilter(const QModelIndex &idx)
QModelIndex parent(const QModelIndex &child) const override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QModelIndex indexForFilter(const QString &id)
Private *const d
int columnCount(const QModelIndex &parent=QModelIndex()) const override
KisFiltersModel(bool showAll, KisPaintDeviceSP thumb)
KisFiltersModel create a new filters model.
T get(const QString &id) const
QList< QString > keys() const
QString name() const
Definition KoID.cpp:68
QString id() const
Definition KoID.cpp:63
QHash< QString, Category > categories
QList< QString > categoriesKeys