Krita Source Code Documentation
Loading...
Searching...
No Matches
TextPropertyConfigModel.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#include <KSharedConfig>
7#include <KConfigGroup>
8
10
18
19const QMap<TextPropertyConfigModel::VisibilityState, QString> visibilityConfigNames = {
25};
26
27const QString DEFAULT_VISIBILITY_STATE = "defaultVisibilityState";
28
34
36 : QAbstractListModel{parent}
37 , d(new Private)
38{
39}
40
44
48
50 if (state == d->defaultVisibilityState)
51 return;
52 d->defaultVisibilityState = state;
55}
56
58{
59 bool shouldFilter = d->defaultVisibilityState == AlwaysVisible;
60 if (!shouldFilter) return false;
61
62 for (int i = 0; i < d->propertyData.size(); i++) {
63 VisibilityState state = d->propertyData.values().at(i).visibilityState;
64 if (state == WhenRelevant || state == WhenSet) {
65 return false;
66 break;
67 }
68 }
69 return shouldFilter;
70}
71
72int TextPropertyConfigModel::rowCount(const QModelIndex &parent) const
73{
74 Q_UNUSED(parent)
75 return d->propertyNames.size();
76}
77
78QVariant TextPropertyConfigModel::data(const QModelIndex &index, int role) const
79{
80 if (!index.isValid()) return QVariant();
81 if (index.row() < 0 || index.row() >= d->propertyNames.size()) return QVariant();
82
83 const QString name = d->propertyNames.at(index.row());
84
85 const TextPropertyData data = d->propertyData.value(name);
86 if (role == Name) {
87 return name;
88 } else if (role == Qt::DisplayRole) {
89 return data.title;
90 } else if (role == Qt::ToolTipRole) {
91 return data.toolTip;
92 } else if (role == Visibility) {
93 return data.visibilityState;
94 } else if (role == SearchTerms) {
95 return data.searchTerms;
96 } else if (role == Type) {
97 return int (data.propertyType);
98 }
99 return QVariant();
100}
101
102bool TextPropertyConfigModel::setData(const QModelIndex &index, const QVariant &value, int role)
103{
104 if (!index.isValid() || !value.isValid()) return false;
105 if (index.row() < 0 || index.row() >= d->propertyNames.size()) return false;
106
107 if (role == Visibility) {
108 VisibilityState newState = VisibilityState(value.toInt());
109 const QString name = d->propertyNames.at(index.row());
110 if (d->propertyData[name].visibilityState != newState) {
111 d->propertyData[name].visibilityState = VisibilityState(value.toInt());
112 emit dataChanged(index, index, {role});
113 emit shouldFilterChanged();
114 return true;
115 }
116 }
117 return false;
118}
119
120bool TextPropertyConfigModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)
121{
122 if (sourceParent != destinationParent) return false;
123 beginMoveRows(sourceParent, sourceRow, sourceRow+count, destinationParent, destinationChild);
124 for (int i = 0; i < count; i++) {
125 d->propertyNames.move(sourceRow+i, destinationChild+i);
126 }
127 endMoveRows();
128 return true;
129}
130
131QHash<int, QByteArray> TextPropertyConfigModel::roleNames() const
132{
133 QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
134 roles[Visibility] = "visibility";
135 roles[SearchTerms] = "searchTerms";
136 roles[Type] = "type";
137 roles[Name] = "name";
138 roles[Qt::DisplayRole] = "title";
139 return roles;
140}
141
143{
144 KConfigGroup configGroup = KSharedConfig::openConfig()->group("TextProperties");
145 configGroup.writeEntry(DEFAULT_VISIBILITY_STATE, visibilityConfigNames.value(d->defaultVisibilityState));
146 Q_FOREACH (const QString name, d->propertyNames) {
147 const TextPropertyData data = d->propertyData.value(name);
148 configGroup.writeEntry(name, visibilityConfigNames.value(data.visibilityState));
149 }
150}
151
153 KConfigGroup configGroup = KSharedConfig::openConfig()->group("TextProperties");
154 d->defaultVisibilityState = visibilityConfigNames.key(configGroup.readEntry(DEFAULT_VISIBILITY_STATE, visibilityConfigNames.value(d->defaultVisibilityState)));
155 Q_FOREACH (const QString name, d->propertyNames) {
156 d->propertyData[name].visibilityState = visibilityConfigNames.key(configGroup.readEntry(name, visibilityConfigNames.value(d->propertyData[name].visibilityState)));
157 }
158}
159
160void TextPropertyConfigModel::addProperty(const QString &name, const int propertyType, const QString title, const QString toolTip, const QString searchTerms, const int visibilityState)
161{
162 if (d->propertyNames.contains(name)) return;
163 beginInsertRows(QModelIndex(), d->propertyNames.size(), d->propertyNames.size());
164 TextPropertyData data = d->propertyData.value(name, TextPropertyData());
165
166 data.title = title;
167 data.propertyType = PropertyType(propertyType);
168 data.toolTip = toolTip;
169 data.searchTerms = searchTerms.split(",");
170 data.visibilityState = VisibilityState(qMax(visibilityState, 0));
171
172 d->propertyData.insert(name, data);
173 d->propertyNames.append(name);
174 endInsertRows();
175}
176
178{
179 TextPropertyData data = d->propertyData.value(name, TextPropertyData());
180 return int(data.visibilityState);
181}
182
184 : QSortFilterProxyModel(parent) {
185
186 connect(this, &QAbstractItemModel::rowsRemoved, this, &TextPropertyConfigFilterModel::filteredNamesChanged);
187 connect(this, &QAbstractItemModel::rowsInserted, this, &TextPropertyConfigFilterModel::filteredNamesChanged);
188}
189
193
195 if (m_showParagraphProperties == show) return;
197 invalidateFilter();
199}
200
202 if (sourceModel() == model) return;
203 setSourceModel(model);
205}
206
208{
209 QStringList names;
210
211 for (int i = 0; i < rowCount(); i++) {
212 QModelIndex idx = index(i, 0);
213 names.append(data(idx, TextPropertyConfigModel::Name).toString());
214 }
215 return names;
216}
217
218bool TextPropertyConfigFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
219{
220 QModelIndex idx = sourceModel()->index(source_row, 0, source_parent);
221 if (!idx.isValid()) return false;
222
224 if (state == TextPropertyConfigModel::NeverVisible) return false;
225
228 return false;
230 return false;
231 }
232
233 const QString name = sourceModel()->data(idx, Qt::DisplayRole).toString();
234 const QStringList searchTerms = sourceModel()->data(idx, TextPropertyConfigModel::SearchTerms).toStringList();
235
236 return (name.contains(filterRegularExpression()) || searchTerms.filter(filterRegularExpression()).size()>0);
237}
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
const QMap< TextPropertyConfigModel::VisibilityState, QString > visibilityConfigNames
const QString DEFAULT_VISIBILITY_STATE
TextPropertyConfigFilterModel(QObject *parent=nullptr)
void setShowParagraphProperties(const bool show)
void setProxySourceModel(QAbstractItemModel *model)
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
int rowCount(const QModelIndex &parent) const override
const QScopedPointer< Private > d
@ Character
This property can be applied on a character level.
@ Paragraph
This property only does something when applied to a paragraph.
@ Mixed
This property can be in either.
bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
Q_INVOKABLE void addProperty(const QString &name, const int propertyType=0, const QString title=QString(), const QString toolTip=QString(), const QString searchTerms=QString(), const int visibilityState=-1)
Q_INVOKABLE int visibilityStateForName(const QString &name) const
void setDefaultVisibilityState(const VisibilityState state)
@ NeverVisible
Never show property.
@ FollowDefault
Follow the default property.
@ AlwaysVisible
Always show property.
@ WhenRelevant
Show when either set or inherited.
TextPropertyConfigModel(QObject *parent=nullptr)
QVariant data(const QModelIndex &index, int role) const override
QHash< int, QByteArray > roleNames() const override
void defaultVisibilityStateChanged()
TextPropertyConfigModel::VisibilityState defaultVisibilityState
QMap< QString, TextPropertyConfigModel::TextPropertyData > propertyData
TextPropertyConfigModel::PropertyType propertyType
TextPropertyConfigModel::VisibilityState visibilityState