Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
brushpropertymanager.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant reason:default
4
9
10#include <QtCore/qcoreapplication.h>
11#include <QtCore/qvariant.h>
12#include <QtCore/qstring.h>
13
14static const char *brushStyles[] = {
15QT_TRANSLATE_NOOP("BrushPropertyManager", "No brush"),
16QT_TRANSLATE_NOOP("BrushPropertyManager", "Solid"),
17QT_TRANSLATE_NOOP("BrushPropertyManager", "Dense 1"),
18QT_TRANSLATE_NOOP("BrushPropertyManager", "Dense 2"),
19QT_TRANSLATE_NOOP("BrushPropertyManager", "Dense 3"),
20QT_TRANSLATE_NOOP("BrushPropertyManager", "Dense 4"),
21QT_TRANSLATE_NOOP("BrushPropertyManager", "Dense 5"),
22QT_TRANSLATE_NOOP("BrushPropertyManager", "Dense 6"),
23QT_TRANSLATE_NOOP("BrushPropertyManager", "Dense 7"),
24QT_TRANSLATE_NOOP("BrushPropertyManager", "Horizontal"),
25QT_TRANSLATE_NOOP("BrushPropertyManager", "Vertical"),
26QT_TRANSLATE_NOOP("BrushPropertyManager", "Cross"),
27QT_TRANSLATE_NOOP("BrushPropertyManager", "Backward diagonal"),
28QT_TRANSLATE_NOOP("BrushPropertyManager", "Forward diagonal"),
29QT_TRANSLATE_NOOP("BrushPropertyManager", "Crossing diagonal"),
30};
31
32QT_BEGIN_NAMESPACE
33
34using namespace Qt::StringLiterals;
35
36namespace qdesigner_internal {
37
39
40int BrushPropertyManager::brushStyleToIndex(Qt::BrushStyle st)
41{
42 switch (st) {
43 case Qt::NoBrush: return 0;
44 case Qt::SolidPattern: return 1;
45 case Qt::Dense1Pattern: return 2;
46 case Qt::Dense2Pattern: return 3;
47 case Qt::Dense3Pattern: return 4;
48 case Qt::Dense4Pattern: return 5;
49 case Qt::Dense5Pattern: return 6;
50 case Qt::Dense6Pattern: return 7;
51 case Qt::Dense7Pattern: return 8;
52 case Qt::HorPattern: return 9;
53 case Qt::VerPattern: return 10;
54 case Qt::CrossPattern: return 11;
55 case Qt::BDiagPattern: return 12;
56 case Qt::FDiagPattern: return 13;
57 case Qt::DiagCrossPattern: return 14;
58 default: break;
59 }
60 return 0;
61}
62
63Qt::BrushStyle BrushPropertyManager::brushStyleIndexToStyle(int brushStyleIndex)
64{
65 switch (brushStyleIndex) {
66 case 0: return Qt::NoBrush;
67 case 1: return Qt::SolidPattern;
68 case 2: return Qt::Dense1Pattern;
69 case 3: return Qt::Dense2Pattern;
70 case 4: return Qt::Dense3Pattern;
71 case 5: return Qt::Dense4Pattern;
72 case 6: return Qt::Dense5Pattern;
73 case 7: return Qt::Dense6Pattern;
74 case 8: return Qt::Dense7Pattern;
75 case 9: return Qt::HorPattern;
76 case 10: return Qt::VerPattern;
77 case 11: return Qt::CrossPattern;
78 case 12: return Qt::BDiagPattern;
79 case 13: return Qt::FDiagPattern;
80 case 14: return Qt::DiagCrossPattern;
81 }
82 return Qt::NoBrush;
83}
84
85static void clearBrushIcons();
86
87namespace {
88class EnumIndexIconMap : public QMap<int, QIcon>
89{
90public:
91 EnumIndexIconMap()
92 {
93 qAddPostRoutine(clearBrushIcons);
94 }
95};
96}
97
98Q_GLOBAL_STATIC(EnumIndexIconMap, brushIcons)
99
100static void clearBrushIcons()
101{
102 brushIcons()->clear();
103}
104
105const QMap<int, QIcon> &BrushPropertyManager::brushStyleIcons()
106{
107 // Create a map of icons for the brush style editor
108 if (brushIcons()->empty()) {
109 const int brushStyleCount = sizeof(brushStyles)/sizeof(const char *);
110 QBrush brush(Qt::black);
111 for (int i = 0; i < brushStyleCount; i++) {
112 const Qt::BrushStyle style = brushStyleIndexToStyle(i);
113 brush.setStyle(style);
114 brushIcons()->insert(i, QtPropertyBrowserUtils::brushValueIcon(brush));
115 }
116 }
117 return *(brushIcons());
118}
119
120QString BrushPropertyManager::brushStyleIndexToString(int brushStyleIndex)
121{
122 const int brushStyleCount = sizeof(brushStyles)/sizeof(const char *);
123 return brushStyleIndex < brushStyleCount ? QCoreApplication::translate("BrushPropertyManager", brushStyles[brushStyleIndex]) : QString();
124}
125
127
129{
130 m_brushValues.insert(property, QBrush());
131 // style
132 QtVariantProperty *styleSubProperty = vm->addProperty(enumTypeId, QCoreApplication::translate("BrushPropertyManager", "Style"));
133 property->addSubProperty(styleSubProperty);
134 QStringList styles;
135 for (const char *brushStyle : brushStyles)
136 styles.push_back(QCoreApplication::translate("BrushPropertyManager", brushStyle));
137 styleSubProperty->setAttribute(u"enumNames"_s, styles);
138 styleSubProperty->setAttribute(u"enumIcons"_s, QVariant::fromValue(brushStyleIcons()));
139 m_brushPropertyToStyleSubProperty.insert(property, styleSubProperty);
140 m_brushStyleSubPropertyToProperty.insert(styleSubProperty, property);
141 // color
142 QtVariantProperty *colorSubProperty =
143 vm->addProperty(QMetaType::QColor, QCoreApplication::translate("BrushPropertyManager", "Color"));
144 property->addSubProperty(colorSubProperty);
145 m_brushPropertyToColorSubProperty.insert(property, colorSubProperty);
146 m_brushColorSubPropertyToProperty.insert(colorSubProperty, property);
147}
148
150{
151 const auto brit = m_brushValues.find(property); // Brushes
152 if (brit == m_brushValues.end())
153 return false;
154 m_brushValues.erase(brit);
155 // style
156 const auto styleIt = m_brushPropertyToStyleSubProperty.find(property);
157 if (styleIt != m_brushPropertyToStyleSubProperty.end()) {
158 QtProperty *styleProp = styleIt .value();
159 m_brushStyleSubPropertyToProperty.remove(styleProp);
160 m_brushPropertyToStyleSubProperty.erase(styleIt );
161 delete styleProp;
162 }
163 // color
164 const auto colorIt = m_brushPropertyToColorSubProperty.find(property);
165 if (colorIt != m_brushPropertyToColorSubProperty.end()) {
166 QtProperty *colorProp = colorIt .value();
167 m_brushColorSubPropertyToProperty.remove(colorProp);
168 m_brushPropertyToColorSubProperty.erase(colorIt );
169 delete colorProp;
170 }
171 return true;
172}
173
175{
176 auto subit = m_brushStyleSubPropertyToProperty.find(property);
177 if (subit != m_brushStyleSubPropertyToProperty.end()) {
178 m_brushPropertyToStyleSubProperty[subit.value()] = 0;
179 m_brushStyleSubPropertyToProperty.erase(subit);
180 }
181 subit = m_brushColorSubPropertyToProperty.find(property);
182 if (subit != m_brushColorSubPropertyToProperty.end()) {
183 m_brushPropertyToColorSubProperty[subit.value()] = 0;
184 m_brushColorSubPropertyToProperty.erase(subit);
185 }
186}
187
188
189int BrushPropertyManager::valueChanged(QtVariantPropertyManager *vm, QtProperty *property, const QVariant &value)
190{
191 switch (value.metaType().id()) {
192 case QMetaType::Int: // Style subproperty?
193 if (QtProperty *brushProperty = m_brushStyleSubPropertyToProperty.value(property, 0)) {
194 const QBrush oldValue = m_brushValues.value(brushProperty);
195 QBrush newBrush = oldValue;
196 const int index = value.toInt();
197 newBrush.setStyle(brushStyleIndexToStyle(index));
198 if (newBrush == oldValue)
199 return DesignerPropertyManager::Unchanged;
200 vm->variantProperty(brushProperty)->setValue(newBrush);
201 return DesignerPropertyManager::Changed;
202 }
203 break;
204 case QMetaType::QColor: // Color subproperty?
205 if (QtProperty *brushProperty = m_brushColorSubPropertyToProperty.value(property, 0)) {
206 const QBrush oldValue = m_brushValues.value(brushProperty);
207 QBrush newBrush = oldValue;
208 newBrush.setColor(qvariant_cast<QColor>(value));
209 if (newBrush == oldValue)
210 return DesignerPropertyManager::Unchanged;
211 vm->variantProperty(brushProperty)->setValue(newBrush);
212 return DesignerPropertyManager::Changed;
213 }
214 break;
215 default:
216 break;
217 }
218 return DesignerPropertyManager::NoMatch;
219}
220
221int BrushPropertyManager::setValue(QtVariantPropertyManager *vm, QtProperty *property, const QVariant &value)
222{
223 if (value.metaType().id() != QMetaType::QBrush)
224 return DesignerPropertyManager::NoMatch;
225 const auto brit = m_brushValues.find(property);
226 if (brit == m_brushValues.end())
227 return DesignerPropertyManager::NoMatch;
228
229 const QBrush newBrush = qvariant_cast<QBrush>(value);
230 if (newBrush == brit.value())
231 return DesignerPropertyManager::Unchanged;
232 brit.value() = newBrush;
233 if (QtProperty *styleProperty = m_brushPropertyToStyleSubProperty.value(property))
234 vm->variantProperty(styleProperty)->setValue(brushStyleToIndex(newBrush.style()));
235 if (QtProperty *colorProperty = m_brushPropertyToColorSubProperty.value(property))
236 vm->variantProperty(colorProperty)->setValue(newBrush.color());
237
238 return DesignerPropertyManager::Changed;
239}
240
241bool BrushPropertyManager::valueText(const QtProperty *property, QString *text) const
242{
243 const auto brit = m_brushValues.constFind(property);
244 if (brit == m_brushValues.constEnd())
245 return false;
246 const QBrush &brush = brit.value();
247 const QString styleName = brushStyleIndexToString(brushStyleToIndex(brush.style()));
248 *text = QCoreApplication::translate("BrushPropertyManager", "[%1, %2]")
249 .arg(styleName, QtPropertyBrowserUtils::colorValueText(brush.color()));
250 return true;
251}
252
253bool BrushPropertyManager::valueIcon(const QtProperty *property, QIcon *icon) const
254{
255 const auto brit = m_brushValues.constFind(property);
256 if (brit == m_brushValues.constEnd())
257 return false;
258 *icon = QtPropertyBrowserUtils::brushValueIcon(brit.value());
259 return true;
260}
261
262bool BrushPropertyManager::value(const QtProperty *property, QVariant *v) const
263{
264 const auto brit = m_brushValues.constFind(property);
265 if (brit == m_brushValues.constEnd())
266 return false;
267 v->setValue(brit.value());
268 return true;
269}
270}
271
272QT_END_NAMESPACE
static const char * brushStyles[]
The QtProperty class encapsulates an instance of a property.
void addSubProperty(QtProperty *property)
Appends the given property to this property's subproperties.
The QtVariantPropertyManager class provides and manages QVariant based properties.
QtVariantProperty * variantProperty(const QtProperty *property) const
Returns the given property converted into a QtVariantProperty.
The QtVariantProperty class is a convenience class handling QVariant based properties.
int valueChanged(QtVariantPropertyManager *vm, QtProperty *property, const QVariant &value)
bool valueIcon(const QtProperty *property, QIcon *icon) const
bool valueText(const QtProperty *property, QString *text) const
void initializeProperty(QtVariantPropertyManager *vm, QtProperty *property, int enumTypeId)
bool value(const QtProperty *property, QVariant *v) const
int setValue(QtVariantPropertyManager *vm, QtProperty *property, const QVariant &value)
Auxiliary methods to store/retrieve settings.