Krita Source Code Documentation
Loading...
Searching...
No Matches
WGConfig.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2020 Mathias Wein <lynx.mw+kde@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
7#ifndef WGCONFIG_H
8#define WGCONFIG_H
9
11
12#include <ksharedconfig.h>
13#include <kconfiggroup.h>
14
15#include <QVector4D>
16
17#include <type_traits>
18
19class KoColorSpace;
20
21namespace WGConfig {
22
23template<class T> struct GenericSetting
24{
25 typedef T ValueType;
26
27 T readValue(const KConfigGroup &group) const
28 {
29 return group.readEntry(name, defaultValue);
30 }
31
32 void writeValue(KConfigGroup &group, const T &value) const
33 {
34 group.writeEntry(name, value);
35 }
36
37 QString name;
39};
40
41template<class T> struct NumericSetting
42{
43 typedef T ValueType;
44 // the storage type, for enums it's the underlying integral type, otherwise T
45 // NOTE: The use of std::remove_cv is because std::type_identity is C++20
46 using ST = typename std::conditional_t<std::is_enum<T>::value, std::underlying_type<T>, std::remove_cv<T>>::type;
47
48 T readValue(const KConfigGroup &group) const
49 {
50 T value = static_cast<T>(group.readEntry(name, static_cast<ST>(defaultValue)));
51 return applyLimits(value);
52 }
53
54 void writeValue(KConfigGroup &group, const T &value) const
55 {
56 group.writeEntry(name, static_cast<ST>(value));
57 }
58
59 T boundFunc(const T &min, const T &val, const T &max) const
60 {
61 return qBound(min, val, max);
62 }
63
64 T applyLimits(T value) const {
65 if (enforceLimits) {
67 }
68 return value;
69 }
70 QString name;
74 bool enforceLimits {false};
75};
76
77template<>
78inline QSize NumericSetting<QSize>::boundFunc(const QSize &min, const QSize &val, const QSize &max) const
79{
80 return val.expandedTo(min).boundedTo(max);
81}
82
83struct ShadeLine {
84 ShadeLine() = default;
85 explicit ShadeLine(QVector4D grad, QVector4D offs=QVector4D(), int patchC=-1)
86 : gradient(grad), offset(offs), patchCount(patchC) {}
87 QVector4D gradient;
88 QVector4D offset;
89 int patchCount {-1}; // negative value means slider mode
90};
91
93{
94public:
95
96 explicit WGConfig(bool readOnly = true);
97 ~WGConfig();
98
99 template<class T>
100 typename T::ValueType get(const T &setting, bool defaultValue = false) const
101 {
102 if (defaultValue) {
103 return setting.defaultValue;
104 }
105 return setting.readValue(m_cfg);
106 }
107
108 template<class T>
109 void set(const T &setting, const typename T::ValueType &value) { setting.writeValue(m_cfg, value); }
110
111 static QString configGroupName();
112
113 KisColorSelectorConfiguration colorSelectorConfiguration() const;
114 void setColorSelectorConfiguration(const KisColorSelectorConfiguration &config);
115
116 QVector<KisColorSelectorConfiguration> favoriteConfigurations(bool defaultValue = false) const;
117 static QVector<KisColorSelectorConfiguration> defaultFavoriteConfigurations();
118 void setFavoriteConfigurations(const QVector<KisColorSelectorConfiguration> &favoriteConfigs);
119
120 // shade selector
121 static QVector<ShadeLine> defaultShadeSelectorLines();
122 QVector<ShadeLine> shadeSelectorLines(bool defaultValue = false) const;
123 void setShadeSelectorLines(const QVector<ShadeLine> &shadeLines);
124
125 const KoColorSpace* customSelectionColorSpace(bool defaultValue = false) const;
126 void setCustomSelectionColorSpace(const KoColorSpace *cs);
127
128 template<class T>
129 void writeEntry(const QString& name, const T& value) {
130 m_cfg.writeEntry(name, value);
131 }
132
133 template<class T>
134 T readEntry(const QString& name, const T& defaultValue=T()) {
135 return m_cfg.readEntry(name, defaultValue);
136 }
137
138
139
141
142private:
143 /*mutable*/ KConfigGroup m_cfg;
145};
146
147typedef WGConfig Accessor;
148
149class WGConfigNotifier : public QObject
150{
151 Q_OBJECT
152public:
153 WGConfigNotifier() = default;
155 ~WGConfigNotifier() override = default;
156
158
163 void notifyConfigChanged();
169
170Q_SIGNALS:
176};
177
182
183/* ======== Configuration object definitions ========
184/ TODO: Think about splitting this off into individual headers
185/ to prevent full recompile on every change.
186*/
187
193
202
203extern const ColorPatches colorHistory;
204extern const ColorPatches commonColors;
205extern const ColorPatches popupPatches;
206
212
214extern const NumericSetting<int> popupSize;
215
216// Shade Selector
222
223} // namespace WGConfig
224
225#endif // WGCONFIG_H
float value(const T *src, size_t ch)
WGConfigNotifier(const WGConfigNotifier &)=delete
WGConfigNotifier operator=(const WGConfigNotifier &)=delete
~WGConfigNotifier() override=default
static const KisColorSelectorConfiguration defaultColorSelectorConfiguration
Definition WGConfig.h:140
void set(const T &setting, const typename T::ValueType &value)
Definition WGConfig.h:109
KConfigGroup m_cfg
Definition WGConfig.h:143
void writeEntry(const QString &name, const T &value)
Definition WGConfig.h:129
T::ValueType get(const T &setting, bool defaultValue=false) const
Definition WGConfig.h:100
T readEntry(const QString &name, const T &defaultValue=T())
Definition WGConfig.h:134
const GenericSetting< bool > colorHistoryEnabled
Definition WGConfig.cpp:238
const ColorPatches commonColors
Definition WGConfig.cpp:221
const GenericSetting< bool > minimalShadeSelectorEnabled
Definition WGConfig.cpp:246
const GenericSetting< bool > commonColorsEnabled
Definition WGConfig.cpp:239
const ColorPatches popupPatches
Definition WGConfig.cpp:229
WGConfigNotifier * notifier()
Definition WGConfig.cpp:190
const GenericSetting< bool > colorHistoryShowClearButton
Definition WGConfig.cpp:240
const NumericSetting< int > shadeSelectorLineHeight
Definition WGConfig.cpp:247
class WGConfig Accessor
const GenericSetting< bool > proofToPaintingColors
Definition WGConfig.cpp:237
@ ScrollLongitudinal
Definition WGConfig.h:190
@ ScrollLaterally
Definition WGConfig.h:191
@ ScrollNone
Definition WGConfig.h:189
const NumericSetting< int > popupSize
Definition WGConfig.cpp:244
const GenericSetting< bool > shadeSelectorUpdateOnExternalChanges
Definition WGConfig.cpp:248
const GenericSetting< bool > quickSettingsEnabled
Definition WGConfig.cpp:243
const GenericSetting< bool > commonColorsAutoUpdate
Definition WGConfig.cpp:241
const GenericSetting< bool > shadeSelectorUpdateOnInteractionEnd
Definition WGConfig.cpp:249
const ColorPatches colorHistory
Definition WGConfig.cpp:213
const GenericSetting< bool > shadeSelectorUpdateOnRightClick
Definition WGConfig.cpp:250
NumericSetting< Scrolling > scrolling
Definition WGConfig.h:200
NumericSetting< Qt::Orientation > orientation
Definition WGConfig.h:196
NumericSetting< int > rows
Definition WGConfig.h:199
NumericSetting< int > maxCount
Definition WGConfig.h:198
NumericSetting< QSize > patchSize
Definition WGConfig.h:197
T readValue(const KConfigGroup &group) const
Definition WGConfig.h:27
void writeValue(KConfigGroup &group, const T &value) const
Definition WGConfig.h:32
T readValue(const KConfigGroup &group) const
Definition WGConfig.h:48
T boundFunc(const T &min, const T &val, const T &max) const
Definition WGConfig.h:59
typename std::conditional_t< std::is_enum< T >::value, std::underlying_type< T >, std::remove_cv< T > >::type ST
Definition WGConfig.h:46
T applyLimits(T value) const
Definition WGConfig.h:64
void writeValue(KConfigGroup &group, const T &value) const
Definition WGConfig.h:54
ShadeLine(QVector4D grad, QVector4D offs=QVector4D(), int patchC=-1)
Definition WGConfig.h:85
QVector4D offset
Definition WGConfig.h:88
QVector4D gradient
Definition WGConfig.h:87