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