source: trunk/tools/shared/qtpropertybrowser/qtpropertymanager.cpp@ 769

Last change on this file since 769 was 769, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

File size: 205.9 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the tools applications of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at qt-info@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qtpropertymanager.h"
43#include "qtpropertybrowserutils_p.h"
44#include <QtCore/QDateTime>
45#include <QtCore/QLocale>
46#include <QtCore/QMap>
47#include <QtCore/QTimer>
48#include <QtGui/QIcon>
49#include <QtCore/QMetaEnum>
50#include <QtGui/QFontDatabase>
51#include <QtGui/QStyleOption>
52#include <QtGui/QStyle>
53#include <QtGui/QApplication>
54#include <QtGui/QPainter>
55#include <QtGui/QLabel>
56
57#include <limits.h>
58#include <float.h>
59
60#if defined(Q_CC_MSVC)
61# pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */
62#endif
63
64QT_BEGIN_NAMESPACE
65
66template <class PrivateData, class Value>
67static void setSimpleMinimumData(PrivateData *data, const Value &minVal)
68{
69 data->minVal = minVal;
70 if (data->maxVal < data->minVal)
71 data->maxVal = data->minVal;
72
73 if (data->val < data->minVal)
74 data->val = data->minVal;
75}
76
77template <class PrivateData, class Value>
78static void setSimpleMaximumData(PrivateData *data, const Value &maxVal)
79{
80 data->maxVal = maxVal;
81 if (data->minVal > data->maxVal)
82 data->minVal = data->maxVal;
83
84 if (data->val > data->maxVal)
85 data->val = data->maxVal;
86}
87
88template <class PrivateData, class Value>
89static void setSizeMinimumData(PrivateData *data, const Value &newMinVal)
90{
91 data->minVal = newMinVal;
92 if (data->maxVal.width() < data->minVal.width())
93 data->maxVal.setWidth(data->minVal.width());
94 if (data->maxVal.height() < data->minVal.height())
95 data->maxVal.setHeight(data->minVal.height());
96
97 if (data->val.width() < data->minVal.width())
98 data->val.setWidth(data->minVal.width());
99 if (data->val.height() < data->minVal.height())
100 data->val.setHeight(data->minVal.height());
101}
102
103template <class PrivateData, class Value>
104static void setSizeMaximumData(PrivateData *data, const Value &newMaxVal)
105{
106 data->maxVal = newMaxVal;
107 if (data->minVal.width() > data->maxVal.width())
108 data->minVal.setWidth(data->maxVal.width());
109 if (data->minVal.height() > data->maxVal.height())
110 data->minVal.setHeight(data->maxVal.height());
111
112 if (data->val.width() > data->maxVal.width())
113 data->val.setWidth(data->maxVal.width());
114 if (data->val.height() > data->maxVal.height())
115 data->val.setHeight(data->maxVal.height());
116}
117
118template <class SizeValue>
119static SizeValue qBoundSize(const SizeValue &minVal, const SizeValue &val, const SizeValue &maxVal)
120{
121 SizeValue croppedVal = val;
122 if (minVal.width() > val.width())
123 croppedVal.setWidth(minVal.width());
124 else if (maxVal.width() < val.width())
125 croppedVal.setWidth(maxVal.width());
126
127 if (minVal.height() > val.height())
128 croppedVal.setHeight(minVal.height());
129 else if (maxVal.height() < val.height())
130 croppedVal.setHeight(maxVal.height());
131
132 return croppedVal;
133}
134
135// Match the exact signature of qBound for VS 6.
136QSize qBound(QSize minVal, QSize val, QSize maxVal)
137{
138 return qBoundSize(minVal, val, maxVal);
139}
140
141QSizeF qBound(QSizeF minVal, QSizeF val, QSizeF maxVal)
142{
143 return qBoundSize(minVal, val, maxVal);
144}
145
146namespace {
147
148namespace {
149template <class Value>
150void orderBorders(Value &minVal, Value &maxVal)
151{
152 if (minVal > maxVal)
153 qSwap(minVal, maxVal);
154}
155
156template <class Value>
157static void orderSizeBorders(Value &minVal, Value &maxVal)
158{
159 Value fromSize = minVal;
160 Value toSize = maxVal;
161 if (fromSize.width() > toSize.width()) {
162 fromSize.setWidth(maxVal.width());
163 toSize.setWidth(minVal.width());
164 }
165 if (fromSize.height() > toSize.height()) {
166 fromSize.setHeight(maxVal.height());
167 toSize.setHeight(minVal.height());
168 }
169 minVal = fromSize;
170 maxVal = toSize;
171}
172
173void orderBorders(QSize &minVal, QSize &maxVal)
174{
175 orderSizeBorders(minVal, maxVal);
176}
177
178void orderBorders(QSizeF &minVal, QSizeF &maxVal)
179{
180 orderSizeBorders(minVal, maxVal);
181}
182
183}
184}
185////////
186
187template <class Value, class PrivateData>
188static Value getData(const QMap<const QtProperty *, PrivateData> &propertyMap,
189 Value PrivateData::*data,
190 const QtProperty *property, const Value &defaultValue = Value())
191{
192 typedef QMap<const QtProperty *, PrivateData> PropertyToData;
193 typedef Q_TYPENAME PropertyToData::const_iterator PropertyToDataConstIterator;
194 const PropertyToDataConstIterator it = propertyMap.constFind(property);
195 if (it == propertyMap.constEnd())
196 return defaultValue;
197 return it.value().*data;
198}
199
200template <class Value, class PrivateData>
201static Value getValue(const QMap<const QtProperty *, PrivateData> &propertyMap,
202 const QtProperty *property, const Value &defaultValue = Value())
203{
204 return getData<Value>(propertyMap, &PrivateData::val, property, defaultValue);
205}
206
207template <class Value, class PrivateData>
208static Value getMinimum(const QMap<const QtProperty *, PrivateData> &propertyMap,
209 const QtProperty *property, const Value &defaultValue = Value())
210{
211 return getData<Value>(propertyMap, &PrivateData::minVal, property, defaultValue);
212}
213
214template <class Value, class PrivateData>
215static Value getMaximum(const QMap<const QtProperty *, PrivateData> &propertyMap,
216 const QtProperty *property, const Value &defaultValue = Value())
217{
218 return getData<Value>(propertyMap, &PrivateData::maxVal, property, defaultValue);
219}
220
221template <class ValueChangeParameter, class Value, class PropertyManager>
222static void setSimpleValue(QMap<const QtProperty *, Value> &propertyMap,
223 PropertyManager *manager,
224 void (PropertyManager::*propertyChangedSignal)(QtProperty *),
225 void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
226 QtProperty *property, const Value &val)
227{
228 typedef QMap<const QtProperty *, Value> PropertyToData;
229 typedef Q_TYPENAME PropertyToData::iterator PropertyToDataIterator;
230 const PropertyToDataIterator it = propertyMap.find(property);
231 if (it == propertyMap.end())
232 return;
233
234 if (it.value() == val)
235 return;
236
237 it.value() = val;
238
239 emit (manager->*propertyChangedSignal)(property);
240 emit (manager->*valueChangedSignal)(property, val);
241}
242
243template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value>
244static void setValueInRange(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
245 void (PropertyManager::*propertyChangedSignal)(QtProperty *),
246 void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
247 QtProperty *property, const Value &val,
248 void (PropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, ValueChangeParameter))
249{
250 typedef Q_TYPENAME PropertyManagerPrivate::Data PrivateData;
251 typedef QMap<const QtProperty *, PrivateData> PropertyToData;
252 typedef Q_TYPENAME PropertyToData::iterator PropertyToDataIterator;
253 const PropertyToDataIterator it = managerPrivate->m_values.find(property);
254 if (it == managerPrivate->m_values.end())
255 return;
256
257 PrivateData &data = it.value();
258
259 if (data.val == val)
260 return;
261
262 const Value oldVal = data.val;
263
264 data.val = qBound(data.minVal, val, data.maxVal);
265
266 if (data.val == oldVal)
267 return;
268
269 if (setSubPropertyValue)
270 (managerPrivate->*setSubPropertyValue)(property, data.val);
271
272 emit (manager->*propertyChangedSignal)(property);
273 emit (manager->*valueChangedSignal)(property, data.val);
274}
275
276template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value>
277static void setBorderValues(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
278 void (PropertyManager::*propertyChangedSignal)(QtProperty *),
279 void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
280 void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter),
281 QtProperty *property, const Value &minVal, const Value &maxVal,
282 void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *,
283 ValueChangeParameter, ValueChangeParameter, ValueChangeParameter))
284{
285 typedef Q_TYPENAME PropertyManagerPrivate::Data PrivateData;
286 typedef QMap<const QtProperty *, PrivateData> PropertyToData;
287 typedef Q_TYPENAME PropertyToData::iterator PropertyToDataIterator;
288 const PropertyToDataIterator it = managerPrivate->m_values.find(property);
289 if (it == managerPrivate->m_values.end())
290 return;
291
292 Value fromVal = minVal;
293 Value toVal = maxVal;
294 orderBorders(fromVal, toVal);
295
296 PrivateData &data = it.value();
297
298 if (data.minVal == fromVal && data.maxVal == toVal)
299 return;
300
301 const Value oldVal = data.val;
302
303 data.setMinimumValue(fromVal);
304 data.setMaximumValue(toVal);
305
306 emit (manager->*rangeChangedSignal)(property, data.minVal, data.maxVal);
307
308 if (setSubPropertyRange)
309 (managerPrivate->*setSubPropertyRange)(property, data.minVal, data.maxVal, data.val);
310
311 if (data.val == oldVal)
312 return;
313
314 emit (manager->*propertyChangedSignal)(property);
315 emit (manager->*valueChangedSignal)(property, data.val);
316}
317
318template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value, class PrivateData>
319static void setBorderValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
320 void (PropertyManager::*propertyChangedSignal)(QtProperty *),
321 void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
322 void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter),
323 QtProperty *property,
324 Value (PrivateData::*getRangeVal)() const,
325 void (PrivateData::*setRangeVal)(ValueChangeParameter), const Value &borderVal,
326 void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *,
327 ValueChangeParameter, ValueChangeParameter, ValueChangeParameter))
328{
329 typedef QMap<const QtProperty *, PrivateData> PropertyToData;
330 typedef Q_TYPENAME PropertyToData::iterator PropertyToDataIterator;
331 const PropertyToDataIterator it = managerPrivate->m_values.find(property);
332 if (it == managerPrivate->m_values.end())
333 return;
334
335 PrivateData &data = it.value();
336
337 if ((data.*getRangeVal)() == borderVal)
338 return;
339
340 const Value oldVal = data.val;
341
342 (data.*setRangeVal)(borderVal);
343
344 emit (manager->*rangeChangedSignal)(property, data.minVal, data.maxVal);
345
346 if (setSubPropertyRange)
347 (managerPrivate->*setSubPropertyRange)(property, data.minVal, data.maxVal, data.val);
348
349 if (data.val == oldVal)
350 return;
351
352 emit (manager->*propertyChangedSignal)(property);
353 emit (manager->*valueChangedSignal)(property, data.val);
354}
355
356template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value, class PrivateData>
357static void setMinimumValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
358 void (PropertyManager::*propertyChangedSignal)(QtProperty *),
359 void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
360 void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter),
361 QtProperty *property, const Value &minVal)
362{
363 void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *,
364 ValueChangeParameter, ValueChangeParameter, ValueChangeParameter) = 0;
365 setBorderValue<ValueChangeParameter, PropertyManagerPrivate, PropertyManager, Value, PrivateData>(manager, managerPrivate,
366 propertyChangedSignal, valueChangedSignal, rangeChangedSignal,
367 property, &PropertyManagerPrivate::Data::minimumValue, &PropertyManagerPrivate::Data::setMinimumValue, minVal, setSubPropertyRange);
368}
369
370template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value, class PrivateData>
371static void setMaximumValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
372 void (PropertyManager::*propertyChangedSignal)(QtProperty *),
373 void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
374 void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter),
375 QtProperty *property, const Value &maxVal)
376{
377 void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *,
378 ValueChangeParameter, ValueChangeParameter, ValueChangeParameter) = 0;
379 setBorderValue<ValueChangeParameter, PropertyManagerPrivate, PropertyManager, Value, PrivateData>(manager, managerPrivate,
380 propertyChangedSignal, valueChangedSignal, rangeChangedSignal,
381 property, &PropertyManagerPrivate::Data::maximumValue, &PropertyManagerPrivate::Data::setMaximumValue, maxVal, setSubPropertyRange);
382}
383
384class QtMetaEnumWrapper : public QObject
385{
386 Q_OBJECT
387 Q_PROPERTY(QSizePolicy::Policy policy READ policy)
388public:
389 QSizePolicy::Policy policy() const { return QSizePolicy::Ignored; }
390private:
391 QtMetaEnumWrapper(QObject *parent) : QObject(parent) {}
392};
393
394class QtMetaEnumProvider
395{
396public:
397 QtMetaEnumProvider();
398
399 QStringList policyEnumNames() const { return m_policyEnumNames; }
400 QStringList languageEnumNames() const { return m_languageEnumNames; }
401 QStringList countryEnumNames(QLocale::Language language) const { return m_countryEnumNames.value(language); }
402
403 QSizePolicy::Policy indexToSizePolicy(int index) const;
404 int sizePolicyToIndex(QSizePolicy::Policy policy) const;
405
406 void indexToLocale(int languageIndex, int countryIndex, QLocale::Language *language, QLocale::Country *country) const;
407 void localeToIndex(QLocale::Language language, QLocale::Country country, int *languageIndex, int *countryIndex) const;
408
409private:
410 void initLocale();
411
412 QStringList m_policyEnumNames;
413 QStringList m_languageEnumNames;
414 QMap<QLocale::Language, QStringList> m_countryEnumNames;
415 QMap<int, QLocale::Language> m_indexToLanguage;
416 QMap<QLocale::Language, int> m_languageToIndex;
417 QMap<int, QMap<int, QLocale::Country> > m_indexToCountry;
418 QMap<QLocale::Language, QMap<QLocale::Country, int> > m_countryToIndex;
419 QMetaEnum m_policyEnum;
420};
421
422static QList<QLocale::Country> sortCountries(const QList<QLocale::Country> &countries)
423{
424 QMultiMap<QString, QLocale::Country> nameToCountry;
425 QListIterator<QLocale::Country> itCountry(countries);
426 while (itCountry.hasNext()) {
427 QLocale::Country country = itCountry.next();
428 nameToCountry.insert(QLocale::countryToString(country), country);
429 }
430 return nameToCountry.values();
431}
432
433void QtMetaEnumProvider::initLocale()
434{
435 QMultiMap<QString, QLocale::Language> nameToLanguage;
436 QLocale::Language language = QLocale::C;
437 while (language <= QLocale::LastLanguage) {
438 QLocale locale(language);
439 if (locale.language() == language)
440 nameToLanguage.insert(QLocale::languageToString(language), language);
441 language = (QLocale::Language)((uint)language + 1); // ++language
442 }
443
444 const QLocale system = QLocale::system();
445 if (!nameToLanguage.contains(QLocale::languageToString(system.language())))
446 nameToLanguage.insert(QLocale::languageToString(system.language()), system.language());
447
448 QList<QLocale::Language> languages = nameToLanguage.values();
449 QListIterator<QLocale::Language> itLang(languages);
450 while (itLang.hasNext()) {
451 QLocale::Language language = itLang.next();
452 QList<QLocale::Country> countries;
453 countries = QLocale::countriesForLanguage(language);
454 if (countries.isEmpty() && language == system.language())
455 countries << system.country();
456
457 if (!countries.isEmpty() && !m_languageToIndex.contains(language)) {
458 countries = sortCountries(countries);
459 int langIdx = m_languageEnumNames.count();
460 m_indexToLanguage[langIdx] = language;
461 m_languageToIndex[language] = langIdx;
462 QStringList countryNames;
463 QListIterator<QLocale::Country> it(countries);
464 int countryIdx = 0;
465 while (it.hasNext()) {
466 QLocale::Country country = it.next();
467 countryNames << QLocale::countryToString(country);
468 m_indexToCountry[langIdx][countryIdx] = country;
469 m_countryToIndex[language][country] = countryIdx;
470 ++countryIdx;
471 }
472 m_languageEnumNames << QLocale::languageToString(language);
473 m_countryEnumNames[language] = countryNames;
474 }
475 }
476}
477
478QtMetaEnumProvider::QtMetaEnumProvider()
479{
480 QMetaProperty p;
481
482 p = QtMetaEnumWrapper::staticMetaObject.property(
483 QtMetaEnumWrapper::staticMetaObject.propertyOffset() + 0);
484 m_policyEnum = p.enumerator();
485 const int keyCount = m_policyEnum.keyCount();
486 for (int i = 0; i < keyCount; i++)
487 m_policyEnumNames << QLatin1String(m_policyEnum.key(i));
488
489 initLocale();
490}
491
492QSizePolicy::Policy QtMetaEnumProvider::indexToSizePolicy(int index) const
493{
494 return static_cast<QSizePolicy::Policy>(m_policyEnum.value(index));
495}
496
497int QtMetaEnumProvider::sizePolicyToIndex(QSizePolicy::Policy policy) const
498{
499 const int keyCount = m_policyEnum.keyCount();
500 for (int i = 0; i < keyCount; i++)
501 if (indexToSizePolicy(i) == policy)
502 return i;
503 return -1;
504}
505
506void QtMetaEnumProvider::indexToLocale(int languageIndex, int countryIndex, QLocale::Language *language, QLocale::Country *country) const
507{
508 QLocale::Language l = QLocale::C;
509 QLocale::Country c = QLocale::AnyCountry;
510 if (m_indexToLanguage.contains(languageIndex)) {
511 l = m_indexToLanguage[languageIndex];
512 if (m_indexToCountry.contains(languageIndex) && m_indexToCountry[languageIndex].contains(countryIndex))
513 c = m_indexToCountry[languageIndex][countryIndex];
514 }
515 if (language)
516 *language = l;
517 if (country)
518 *country = c;
519}
520
521void QtMetaEnumProvider::localeToIndex(QLocale::Language language, QLocale::Country country, int *languageIndex, int *countryIndex) const
522{
523 int l = -1;
524 int c = -1;
525 if (m_languageToIndex.contains(language)) {
526 l = m_languageToIndex[language];
527 if (m_countryToIndex.contains(language) && m_countryToIndex[language].contains(country))
528 c = m_countryToIndex[language][country];
529 }
530
531 if (languageIndex)
532 *languageIndex = l;
533 if (countryIndex)
534 *countryIndex = c;
535}
536
537Q_GLOBAL_STATIC(QtMetaEnumProvider, metaEnumProvider)
538
539// QtGroupPropertyManager
540
541/*!
542 \class QtGroupPropertyManager
543 \internal
544 \inmodule QtDesigner
545 \since 4.4
546
547 \brief The QtGroupPropertyManager provides and manages group properties.
548
549 This class is intended to provide a grouping element without any value.
550
551 \sa QtAbstractPropertyManager
552*/
553
554/*!
555 Creates a manager with the given \a parent.
556*/
557QtGroupPropertyManager::QtGroupPropertyManager(QObject *parent)
558 : QtAbstractPropertyManager(parent)
559{
560
561}
562
563/*!
564 Destroys this manager, and all the properties it has created.
565*/
566QtGroupPropertyManager::~QtGroupPropertyManager()
567{
568
569}
570
571/*!
572 \reimp
573*/
574bool QtGroupPropertyManager::hasValue(const QtProperty *property) const
575{
576 Q_UNUSED(property)
577 return false;
578}
579
580/*!
581 \reimp
582*/
583void QtGroupPropertyManager::initializeProperty(QtProperty *property)
584{
585 Q_UNUSED(property)
586}
587
588/*!
589 \reimp
590*/
591void QtGroupPropertyManager::uninitializeProperty(QtProperty *property)
592{
593 Q_UNUSED(property)
594}
595
596// QtIntPropertyManager
597
598class QtIntPropertyManagerPrivate
599{
600 QtIntPropertyManager *q_ptr;
601 Q_DECLARE_PUBLIC(QtIntPropertyManager)
602public:
603
604 struct Data
605 {
606 Data() : val(0), minVal(-INT_MAX), maxVal(INT_MAX), singleStep(1) {}
607 int val;
608 int minVal;
609 int maxVal;
610 int singleStep;
611 int minimumValue() const { return minVal; }
612 int maximumValue() const { return maxVal; }
613 void setMinimumValue(int newMinVal) { setSimpleMinimumData(this, newMinVal); }
614 void setMaximumValue(int newMaxVal) { setSimpleMaximumData(this, newMaxVal); }
615 };
616
617 typedef QMap<const QtProperty *, Data> PropertyValueMap;
618 PropertyValueMap m_values;
619};
620
621/*!
622 \class QtIntPropertyManager
623 \internal
624 \inmodule QtDesigner
625 \since 4.4
626
627 \brief The QtIntPropertyManager provides and manages int properties.
628
629 An int property has a current value, and a range specifying the
630 valid values. The range is defined by a minimum and a maximum
631 value.
632
633 The property's value and range can be retrieved using the value(),
634 minimum() and maximum() functions, and can be set using the
635 setValue(), setMinimum() and setMaximum() slots. Alternatively,
636 the range can be defined in one go using the setRange() slot.
637
638 In addition, QtIntPropertyManager provides the valueChanged() signal which
639 is emitted whenever a property created by this manager changes,
640 and the rangeChanged() signal which is emitted whenever such a
641 property changes its range of valid values.
642
643 \sa QtAbstractPropertyManager, QtSpinBoxFactory, QtSliderFactory, QtScrollBarFactory
644*/
645
646/*!
647 \fn void QtIntPropertyManager::valueChanged(QtProperty *property, int value)
648
649 This signal is emitted whenever a property created by this manager
650 changes its value, passing a pointer to the \a property and the new
651 \a value as parameters.
652
653 \sa setValue()
654*/
655
656/*!
657 \fn void QtIntPropertyManager::rangeChanged(QtProperty *property, int minimum, int maximum)
658
659 This signal is emitted whenever a property created by this manager
660 changes its range of valid values, passing a pointer to the
661 \a property and the new \a minimum and \a maximum values.
662
663 \sa setRange()
664*/
665
666/*!
667 \fn void QtIntPropertyManager::singleStepChanged(QtProperty *property, int step)
668
669 This signal is emitted whenever a property created by this manager
670 changes its single step property, passing a pointer to the
671 \a property and the new \a step value
672
673 \sa setSingleStep()
674*/
675
676/*!
677 Creates a manager with the given \a parent.
678*/
679QtIntPropertyManager::QtIntPropertyManager(QObject *parent)
680 : QtAbstractPropertyManager(parent), d_ptr(new QtIntPropertyManagerPrivate)
681{
682 d_ptr->q_ptr = this;
683}
684
685/*!
686 Destroys this manager, and all the properties it has created.
687*/
688QtIntPropertyManager::~QtIntPropertyManager()
689{
690 clear();
691}
692
693/*!
694 Returns the given \a property's value.
695
696 If the given property is not managed by this manager, this
697 function returns 0.
698
699 \sa setValue()
700*/
701int QtIntPropertyManager::value(const QtProperty *property) const
702{
703 return getValue<int>(d_ptr->m_values, property, 0);
704}
705
706/*!
707 Returns the given \a property's minimum value.
708
709 \sa setMinimum(), maximum(), setRange()
710*/
711int QtIntPropertyManager::minimum(const QtProperty *property) const
712{
713 return getMinimum<int>(d_ptr->m_values, property, 0);
714}
715
716/*!
717 Returns the given \a property's maximum value.
718
719 \sa setMaximum(), minimum(), setRange()
720*/
721int QtIntPropertyManager::maximum(const QtProperty *property) const
722{
723 return getMaximum<int>(d_ptr->m_values, property, 0);
724}
725
726/*!
727 Returns the given \a property's step value.
728
729 The step is typically used to increment or decrement a property value while pressing an arrow key.
730
731 \sa setSingleStep()
732*/
733int QtIntPropertyManager::singleStep(const QtProperty *property) const
734{
735 return getData<int>(d_ptr->m_values, &QtIntPropertyManagerPrivate::Data::singleStep, property, 0);
736}
737
738/*!
739 \reimp
740*/
741QString QtIntPropertyManager::valueText(const QtProperty *property) const
742{
743 const QtIntPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
744 if (it == d_ptr->m_values.constEnd())
745 return QString();
746 return QString::number(it.value().val);
747}
748
749/*!
750 \fn void QtIntPropertyManager::setValue(QtProperty *property, int value)
751
752 Sets the value of the given \a property to \a value.
753
754 If the specified \a value is not valid according to the given \a
755 property's range, the \a value is adjusted to the nearest valid
756 value within the range.
757
758 \sa value(), setRange(), valueChanged()
759*/
760void QtIntPropertyManager::setValue(QtProperty *property, int val)
761{
762 void (QtIntPropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, int) = 0;
763 setValueInRange<int, QtIntPropertyManagerPrivate, QtIntPropertyManager, int>(this, d_ptr.data(),
764 &QtIntPropertyManager::propertyChanged,
765 &QtIntPropertyManager::valueChanged,
766 property, val, setSubPropertyValue);
767}
768
769/*!
770 Sets the minimum value for the given \a property to \a minVal.
771
772 When setting the minimum value, the maximum and current values are
773 adjusted if necessary (ensuring that the range remains valid and
774 that the current value is within the range).
775
776 \sa minimum(), setRange(), rangeChanged()
777*/
778void QtIntPropertyManager::setMinimum(QtProperty *property, int minVal)
779{
780 setMinimumValue<int, QtIntPropertyManagerPrivate, QtIntPropertyManager, int, QtIntPropertyManagerPrivate::Data>(this, d_ptr.data(),
781 &QtIntPropertyManager::propertyChanged,
782 &QtIntPropertyManager::valueChanged,
783 &QtIntPropertyManager::rangeChanged,
784 property, minVal);
785}
786
787/*!
788 Sets the maximum value for the given \a property to \a maxVal.
789
790 When setting maximum value, the minimum and current values are
791 adjusted if necessary (ensuring that the range remains valid and
792 that the current value is within the range).
793
794 \sa maximum(), setRange(), rangeChanged()
795*/
796void QtIntPropertyManager::setMaximum(QtProperty *property, int maxVal)
797{
798 setMaximumValue<int, QtIntPropertyManagerPrivate, QtIntPropertyManager, int, QtIntPropertyManagerPrivate::Data>(this, d_ptr.data(),
799 &QtIntPropertyManager::propertyChanged,
800 &QtIntPropertyManager::valueChanged,
801 &QtIntPropertyManager::rangeChanged,
802 property, maxVal);
803}
804
805/*!
806 \fn void QtIntPropertyManager::setRange(QtProperty *property, int minimum, int maximum)
807
808 Sets the range of valid values.
809
810 This is a convenience function defining the range of valid values
811 in one go; setting the \a minimum and \a maximum values for the
812 given \a property with a single function call.
813
814 When setting a new range, the current value is adjusted if
815 necessary (ensuring that the value remains within range).
816
817 \sa setMinimum(), setMaximum(), rangeChanged()
818*/
819void QtIntPropertyManager::setRange(QtProperty *property, int minVal, int maxVal)
820{
821 void (QtIntPropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, int, int, int) = 0;
822 setBorderValues<int, QtIntPropertyManagerPrivate, QtIntPropertyManager, int>(this, d_ptr.data(),
823 &QtIntPropertyManager::propertyChanged,
824 &QtIntPropertyManager::valueChanged,
825 &QtIntPropertyManager::rangeChanged,
826 property, minVal, maxVal, setSubPropertyRange);
827}
828
829/*!
830 Sets the step value for the given \a property to \a step.
831
832 The step is typically used to increment or decrement a property value while pressing an arrow key.
833
834 \sa singleStep()
835*/
836void QtIntPropertyManager::setSingleStep(QtProperty *property, int step)
837{
838 const QtIntPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
839 if (it == d_ptr->m_values.end())
840 return;
841
842 QtIntPropertyManagerPrivate::Data data = it.value();
843
844 if (step < 0)
845 step = 0;
846
847 if (data.singleStep == step)
848 return;
849
850 data.singleStep = step;
851
852 it.value() = data;
853
854 emit singleStepChanged(property, data.singleStep);
855}
856
857/*!
858 \reimp
859*/
860void QtIntPropertyManager::initializeProperty(QtProperty *property)
861{
862 d_ptr->m_values[property] = QtIntPropertyManagerPrivate::Data();
863}
864
865/*!
866 \reimp
867*/
868void QtIntPropertyManager::uninitializeProperty(QtProperty *property)
869{
870 d_ptr->m_values.remove(property);
871}
872
873// QtDoublePropertyManager
874
875class QtDoublePropertyManagerPrivate
876{
877 QtDoublePropertyManager *q_ptr;
878 Q_DECLARE_PUBLIC(QtDoublePropertyManager)
879public:
880
881 struct Data
882 {
883 Data() : val(0), minVal(-INT_MAX), maxVal(INT_MAX), singleStep(1), decimals(2) {}
884 double val;
885 double minVal;
886 double maxVal;
887 double singleStep;
888 int decimals;
889 double minimumValue() const { return minVal; }
890 double maximumValue() const { return maxVal; }
891 void setMinimumValue(double newMinVal) { setSimpleMinimumData(this, newMinVal); }
892 void setMaximumValue(double newMaxVal) { setSimpleMaximumData(this, newMaxVal); }
893 };
894
895 typedef QMap<const QtProperty *, Data> PropertyValueMap;
896 PropertyValueMap m_values;
897};
898
899/*!
900 \class QtDoublePropertyManager
901 \internal
902 \inmodule QtDesigner
903 \since 4.4
904
905 \brief The QtDoublePropertyManager provides and manages double properties.
906
907 A double property has a current value, and a range specifying the
908 valid values. The range is defined by a minimum and a maximum
909 value.
910
911 The property's value and range can be retrieved using the value(),
912 minimum() and maximum() functions, and can be set using the
913 setValue(), setMinimum() and setMaximum() slots.
914 Alternatively, the range can be defined in one go using the
915 setRange() slot.
916
917 In addition, QtDoublePropertyManager provides the valueChanged() signal
918 which is emitted whenever a property created by this manager
919 changes, and the rangeChanged() signal which is emitted whenever
920 such a property changes its range of valid values.
921
922 \sa QtAbstractPropertyManager, QtDoubleSpinBoxFactory
923*/
924
925/*!
926 \fn void QtDoublePropertyManager::valueChanged(QtProperty *property, double value)
927
928 This signal is emitted whenever a property created by this manager
929 changes its value, passing a pointer to the \a property and the new
930 \a value as parameters.
931
932 \sa setValue()
933*/
934
935/*!
936 \fn void QtDoublePropertyManager::rangeChanged(QtProperty *property, double minimum, double maximum)
937
938 This signal is emitted whenever a property created by this manager
939 changes its range of valid values, passing a pointer to the
940 \a property and the new \a minimum and \a maximum values
941
942 \sa setRange()
943*/
944
945/*!
946 \fn void QtDoublePropertyManager::decimalsChanged(QtProperty *property, int prec)
947
948 This signal is emitted whenever a property created by this manager
949 changes its precision of value, passing a pointer to the
950 \a property and the new \a prec value
951
952 \sa setDecimals()
953*/
954
955/*!
956 \fn void QtDoublePropertyManager::singleStepChanged(QtProperty *property, double step)
957
958 This signal is emitted whenever a property created by this manager
959 changes its single step property, passing a pointer to the
960 \a property and the new \a step value
961
962 \sa setSingleStep()
963*/
964
965/*!
966 Creates a manager with the given \a parent.
967*/
968QtDoublePropertyManager::QtDoublePropertyManager(QObject *parent)
969 : QtAbstractPropertyManager(parent), d_ptr(new QtDoublePropertyManagerPrivate)
970{
971 d_ptr->q_ptr = this;
972}
973
974/*!
975 Destroys this manager, and all the properties it has created.
976*/
977QtDoublePropertyManager::~QtDoublePropertyManager()
978{
979 clear();
980}
981
982/*!
983 Returns the given \a property's value.
984
985 If the given property is not managed by this manager, this
986 function returns 0.
987
988 \sa setValue()
989*/
990double QtDoublePropertyManager::value(const QtProperty *property) const
991{
992 return getValue<double>(d_ptr->m_values, property, 0.0);
993}
994
995/*!
996 Returns the given \a property's minimum value.
997
998 \sa maximum(), setRange()
999*/
1000double QtDoublePropertyManager::minimum(const QtProperty *property) const
1001{
1002 return getMinimum<double>(d_ptr->m_values, property, 0.0);
1003}
1004
1005/*!
1006 Returns the given \a property's maximum value.
1007
1008 \sa minimum(), setRange()
1009*/
1010double QtDoublePropertyManager::maximum(const QtProperty *property) const
1011{
1012 return getMaximum<double>(d_ptr->m_values, property, 0.0);
1013}
1014
1015/*!
1016 Returns the given \a property's step value.
1017
1018 The step is typically used to increment or decrement a property value while pressing an arrow key.
1019
1020 \sa setSingleStep()
1021*/
1022double QtDoublePropertyManager::singleStep(const QtProperty *property) const
1023{
1024 return getData<double>(d_ptr->m_values, &QtDoublePropertyManagerPrivate::Data::singleStep, property, 0);
1025}
1026
1027/*!
1028 Returns the given \a property's precision, in decimals.
1029
1030 \sa setDecimals()
1031*/
1032int QtDoublePropertyManager::decimals(const QtProperty *property) const
1033{
1034 return getData<int>(d_ptr->m_values, &QtDoublePropertyManagerPrivate::Data::decimals, property, 0);
1035}
1036
1037/*!
1038 \reimp
1039*/
1040QString QtDoublePropertyManager::valueText(const QtProperty *property) const
1041{
1042 const QtDoublePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
1043 if (it == d_ptr->m_values.constEnd())
1044 return QString();
1045 return QString::number(it.value().val, 'f', it.value().decimals);
1046}
1047
1048/*!
1049 \fn void QtDoublePropertyManager::setValue(QtProperty *property, double value)
1050
1051 Sets the value of the given \a property to \a value.
1052
1053 If the specified \a value is not valid according to the given
1054 \a property's range, the \a value is adjusted to the nearest valid value
1055 within the range.
1056
1057 \sa value(), setRange(), valueChanged()
1058*/
1059void QtDoublePropertyManager::setValue(QtProperty *property, double val)
1060{
1061 void (QtDoublePropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, double) = 0;
1062 setValueInRange<double, QtDoublePropertyManagerPrivate, QtDoublePropertyManager, double>(this, d_ptr.data(),
1063 &QtDoublePropertyManager::propertyChanged,
1064 &QtDoublePropertyManager::valueChanged,
1065 property, val, setSubPropertyValue);
1066}
1067
1068/*!
1069 Sets the step value for the given \a property to \a step.
1070
1071 The step is typically used to increment or decrement a property value while pressing an arrow key.
1072
1073 \sa singleStep()
1074*/
1075void QtDoublePropertyManager::setSingleStep(QtProperty *property, double step)
1076{
1077 const QtDoublePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
1078 if (it == d_ptr->m_values.end())
1079 return;
1080
1081 QtDoublePropertyManagerPrivate::Data data = it.value();
1082
1083 if (step < 0)
1084 step = 0;
1085
1086 if (data.singleStep == step)
1087 return;
1088
1089 data.singleStep = step;
1090
1091 it.value() = data;
1092
1093 emit singleStepChanged(property, data.singleStep);
1094}
1095
1096/*!
1097 \fn void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec)
1098
1099 Sets the precision of the given \a property to \a prec.
1100
1101 The valid decimal range is 0-13. The default is 2.
1102
1103 \sa decimals()
1104*/
1105void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec)
1106{
1107 const QtDoublePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
1108 if (it == d_ptr->m_values.end())
1109 return;
1110
1111 QtDoublePropertyManagerPrivate::Data data = it.value();
1112
1113 if (prec > 13)
1114 prec = 13;
1115 else if (prec < 0)
1116 prec = 0;
1117
1118 if (data.decimals == prec)
1119 return;
1120
1121 data.decimals = prec;
1122
1123 it.value() = data;
1124
1125 emit decimalsChanged(property, data.decimals);
1126}
1127
1128/*!
1129 Sets the minimum value for the given \a property to \a minVal.
1130
1131 When setting the minimum value, the maximum and current values are
1132 adjusted if necessary (ensuring that the range remains valid and
1133 that the current value is within in the range).
1134
1135 \sa minimum(), setRange(), rangeChanged()
1136*/
1137void QtDoublePropertyManager::setMinimum(QtProperty *property, double minVal)
1138{
1139 setMinimumValue<double, QtDoublePropertyManagerPrivate, QtDoublePropertyManager, double, QtDoublePropertyManagerPrivate::Data>(this, d_ptr.data(),
1140 &QtDoublePropertyManager::propertyChanged,
1141 &QtDoublePropertyManager::valueChanged,
1142 &QtDoublePropertyManager::rangeChanged,
1143 property, minVal);
1144}
1145
1146/*!
1147 Sets the maximum value for the given \a property to \a maxVal.
1148
1149 When setting the maximum value, the minimum and current values are
1150 adjusted if necessary (ensuring that the range remains valid and
1151 that the current value is within in the range).
1152
1153 \sa maximum(), setRange(), rangeChanged()
1154*/
1155void QtDoublePropertyManager::setMaximum(QtProperty *property, double maxVal)
1156{
1157 setMaximumValue<double, QtDoublePropertyManagerPrivate, QtDoublePropertyManager, double, QtDoublePropertyManagerPrivate::Data>(this, d_ptr.data(),
1158 &QtDoublePropertyManager::propertyChanged,
1159 &QtDoublePropertyManager::valueChanged,
1160 &QtDoublePropertyManager::rangeChanged,
1161 property, maxVal);
1162}
1163
1164/*!
1165 \fn void QtDoublePropertyManager::setRange(QtProperty *property, double minimum, double maximum)
1166
1167 Sets the range of valid values.
1168
1169 This is a convenience function defining the range of valid values
1170 in one go; setting the \a minimum and \a maximum values for the
1171 given \a property with a single function call.
1172
1173 When setting a new range, the current value is adjusted if
1174 necessary (ensuring that the value remains within range).
1175
1176 \sa setMinimum(), setMaximum(), rangeChanged()
1177*/
1178void QtDoublePropertyManager::setRange(QtProperty *property, double minVal, double maxVal)
1179{
1180 void (QtDoublePropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, double, double, double) = 0;
1181 setBorderValues<double, QtDoublePropertyManagerPrivate, QtDoublePropertyManager, double>(this, d_ptr.data(),
1182 &QtDoublePropertyManager::propertyChanged,
1183 &QtDoublePropertyManager::valueChanged,
1184 &QtDoublePropertyManager::rangeChanged,
1185 property, minVal, maxVal, setSubPropertyRange);
1186}
1187
1188/*!
1189 \reimp
1190*/
1191void QtDoublePropertyManager::initializeProperty(QtProperty *property)
1192{
1193 d_ptr->m_values[property] = QtDoublePropertyManagerPrivate::Data();
1194}
1195
1196/*!
1197 \reimp
1198*/
1199void QtDoublePropertyManager::uninitializeProperty(QtProperty *property)
1200{
1201 d_ptr->m_values.remove(property);
1202}
1203
1204// QtStringPropertyManager
1205
1206class QtStringPropertyManagerPrivate
1207{
1208 QtStringPropertyManager *q_ptr;
1209 Q_DECLARE_PUBLIC(QtStringPropertyManager)
1210public:
1211
1212 struct Data
1213 {
1214 Data() : regExp(QString(QLatin1Char('*')), Qt::CaseSensitive, QRegExp::Wildcard)
1215 {
1216 }
1217 QString val;
1218 QRegExp regExp;
1219 };
1220
1221 typedef QMap<const QtProperty *, Data> PropertyValueMap;
1222 QMap<const QtProperty *, Data> m_values;
1223};
1224
1225/*!
1226 \class QtStringPropertyManager
1227 \internal
1228 \inmodule QtDesigner
1229 \since 4.4
1230
1231 \brief The QtStringPropertyManager provides and manages QString properties.
1232
1233 A string property's value can be retrieved using the value()
1234 function, and set using the setValue() slot.
1235
1236 The current value can be checked against a regular expression. To
1237 set the regular expression use the setRegExp() slot, use the
1238 regExp() function to retrieve the currently set expression.
1239
1240 In addition, QtStringPropertyManager provides the valueChanged() signal
1241 which is emitted whenever a property created by this manager
1242 changes, and the regExpChanged() signal which is emitted whenever
1243 such a property changes its currently set regular expression.
1244
1245 \sa QtAbstractPropertyManager, QtLineEditFactory
1246*/
1247
1248/*!
1249 \fn void QtStringPropertyManager::valueChanged(QtProperty *property, const QString &value)
1250
1251 This signal is emitted whenever a property created by this manager
1252 changes its value, passing a pointer to the \a property and the
1253 new \a value as parameters.
1254
1255 \sa setValue()
1256*/
1257
1258/*!
1259 \fn void QtStringPropertyManager::regExpChanged(QtProperty *property, const QRegExp &regExp)
1260
1261 This signal is emitted whenever a property created by this manager
1262 changes its currenlty set regular expression, passing a pointer to
1263 the \a property and the new \a regExp as parameters.
1264
1265 \sa setRegExp()
1266*/
1267
1268/*!
1269 Creates a manager with the given \a parent.
1270*/
1271QtStringPropertyManager::QtStringPropertyManager(QObject *parent)
1272 : QtAbstractPropertyManager(parent), d_ptr(new QtStringPropertyManagerPrivate)
1273{
1274 d_ptr->q_ptr = this;
1275}
1276
1277/*!
1278 Destroys this manager, and all the properties it has created.
1279*/
1280QtStringPropertyManager::~QtStringPropertyManager()
1281{
1282 clear();
1283}
1284
1285/*!
1286 Returns the given \a property's value.
1287
1288 If the given property is not managed by this manager, this
1289 function returns an empty string.
1290
1291 \sa setValue()
1292*/
1293QString QtStringPropertyManager::value(const QtProperty *property) const
1294{
1295 return getValue<QString>(d_ptr->m_values, property);
1296}
1297
1298/*!
1299 Returns the given \a property's currently set regular expression.
1300
1301 If the given \a property is not managed by this manager, this
1302 function returns an empty expression.
1303
1304 \sa setRegExp()
1305*/
1306QRegExp QtStringPropertyManager::regExp(const QtProperty *property) const
1307{
1308 return getData<QRegExp>(d_ptr->m_values, &QtStringPropertyManagerPrivate::Data::regExp, property, QRegExp());
1309}
1310
1311/*!
1312 \reimp
1313*/
1314QString QtStringPropertyManager::valueText(const QtProperty *property) const
1315{
1316 const QtStringPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
1317 if (it == d_ptr->m_values.constEnd())
1318 return QString();
1319 return it.value().val;
1320}
1321
1322/*!
1323 \fn void QtStringPropertyManager::setValue(QtProperty *property, const QString &value)
1324
1325 Sets the value of the given \a property to \a value.
1326
1327 If the specified \a value doesn't match the given \a property's
1328 regular expression, this function does nothing.
1329
1330 \sa value(), setRegExp(), valueChanged()
1331*/
1332void QtStringPropertyManager::setValue(QtProperty *property, const QString &val)
1333{
1334 const QtStringPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
1335 if (it == d_ptr->m_values.end())
1336 return;
1337
1338 QtStringPropertyManagerPrivate::Data data = it.value();
1339
1340 if (data.val == val)
1341 return;
1342
1343 if (data.regExp.isValid() && !data.regExp.exactMatch(val))
1344 return;
1345
1346 data.val = val;
1347
1348 it.value() = data;
1349
1350 emit propertyChanged(property);
1351 emit valueChanged(property, data.val);
1352}
1353
1354/*!
1355 Sets the regular expression of the given \a property to \a regExp.
1356
1357 \sa regExp(), setValue(), regExpChanged()
1358*/
1359void QtStringPropertyManager::setRegExp(QtProperty *property, const QRegExp &regExp)
1360{
1361 const QtStringPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
1362 if (it == d_ptr->m_values.end())
1363 return;
1364
1365 QtStringPropertyManagerPrivate::Data data = it.value() ;
1366
1367 if (data.regExp == regExp)
1368 return;
1369
1370 data.regExp = regExp;
1371
1372 it.value() = data;
1373
1374 emit regExpChanged(property, data.regExp);
1375}
1376
1377/*!
1378 \reimp
1379*/
1380void QtStringPropertyManager::initializeProperty(QtProperty *property)
1381{
1382 d_ptr->m_values[property] = QtStringPropertyManagerPrivate::Data();
1383}
1384
1385/*!
1386 \reimp
1387*/
1388void QtStringPropertyManager::uninitializeProperty(QtProperty *property)
1389{
1390 d_ptr->m_values.remove(property);
1391}
1392
1393// QtBoolPropertyManager
1394// Return an icon containing a check box indicator
1395static QIcon drawCheckBox(bool value)
1396{
1397 QStyleOptionButton opt;
1398 opt.state |= value ? QStyle::State_On : QStyle::State_Off;
1399 opt.state |= QStyle::State_Enabled;
1400 const QStyle *style = QApplication::style();
1401 // Figure out size of an indicator and make sure it is not scaled down in a list view item
1402 // by making the pixmap as big as a list view icon and centering the indicator in it.
1403 // (if it is smaller, it can't be helped)
1404 const int indicatorWidth = style->pixelMetric(QStyle::PM_IndicatorWidth, &opt);
1405 const int indicatorHeight = style->pixelMetric(QStyle::PM_IndicatorHeight, &opt);
1406 const int listViewIconSize = indicatorWidth;
1407 const int pixmapWidth = indicatorWidth;
1408 const int pixmapHeight = qMax(indicatorHeight, listViewIconSize);
1409
1410 opt.rect = QRect(0, 0, indicatorWidth, indicatorHeight);
1411 QPixmap pixmap = QPixmap(pixmapWidth, pixmapHeight);
1412 pixmap.fill(Qt::transparent);
1413 {
1414 // Center?
1415 const int xoff = (pixmapWidth > indicatorWidth) ? (pixmapWidth - indicatorWidth) / 2 : 0;
1416 const int yoff = (pixmapHeight > indicatorHeight) ? (pixmapHeight - indicatorHeight) / 2 : 0;
1417 QPainter painter(&pixmap);
1418 painter.translate(xoff, yoff);
1419 style->drawPrimitive(QStyle::PE_IndicatorCheckBox, &opt, &painter);
1420 }
1421 return QIcon(pixmap);
1422}
1423
1424class QtBoolPropertyManagerPrivate
1425{
1426 QtBoolPropertyManager *q_ptr;
1427 Q_DECLARE_PUBLIC(QtBoolPropertyManager)
1428public:
1429 QtBoolPropertyManagerPrivate();
1430
1431 QMap<const QtProperty *, bool> m_values;
1432 const QIcon m_checkedIcon;
1433 const QIcon m_uncheckedIcon;
1434};
1435
1436QtBoolPropertyManagerPrivate::QtBoolPropertyManagerPrivate() :
1437 m_checkedIcon(drawCheckBox(true)),
1438 m_uncheckedIcon(drawCheckBox(false))
1439{
1440}
1441
1442/*!
1443 \class QtBoolPropertyManager
1444 \internal
1445 \inmodule QtDesigner
1446 \since 4.4
1447
1448 \brief The QtBoolPropertyManager class provides and manages boolean properties.
1449
1450 The property's value can be retrieved using the value() function,
1451 and set using the setValue() slot.
1452
1453 In addition, QtBoolPropertyManager provides the valueChanged() signal
1454 which is emitted whenever a property created by this manager
1455 changes.
1456
1457 \sa QtAbstractPropertyManager, QtCheckBoxFactory
1458*/
1459
1460/*!
1461 \fn void QtBoolPropertyManager::valueChanged(QtProperty *property, bool value)
1462
1463 This signal is emitted whenever a property created by this manager
1464 changes its value, passing a pointer to the \a property and the
1465 new \a value as parameters.
1466*/
1467
1468/*!
1469 Creates a manager with the given \a parent.
1470*/
1471QtBoolPropertyManager::QtBoolPropertyManager(QObject *parent)
1472 : QtAbstractPropertyManager(parent), d_ptr(new QtBoolPropertyManagerPrivate)
1473{
1474 d_ptr->q_ptr = this;
1475}
1476
1477/*!
1478 Destroys this manager, and all the properties it has created.
1479*/
1480QtBoolPropertyManager::~QtBoolPropertyManager()
1481{
1482 clear();
1483}
1484
1485/*!
1486 Returns the given \a property's value.
1487
1488 If the given \a property is not managed by \e this manager, this
1489 function returns false.
1490
1491 \sa setValue()
1492*/
1493bool QtBoolPropertyManager::value(const QtProperty *property) const
1494{
1495 return d_ptr->m_values.value(property, false);
1496}
1497
1498/*!
1499 \reimp
1500*/
1501QString QtBoolPropertyManager::valueText(const QtProperty *property) const
1502{
1503 const QMap<const QtProperty *, bool>::const_iterator it = d_ptr->m_values.constFind(property);
1504 if (it == d_ptr->m_values.constEnd())
1505 return QString();
1506
1507 static const QString trueText = tr("True");
1508 static const QString falseText = tr("False");
1509 return it.value() ? trueText : falseText;
1510}
1511
1512/*!
1513 \reimp
1514*/
1515QIcon QtBoolPropertyManager::valueIcon(const QtProperty *property) const
1516{
1517 const QMap<const QtProperty *, bool>::const_iterator it = d_ptr->m_values.constFind(property);
1518 if (it == d_ptr->m_values.constEnd())
1519 return QIcon();
1520
1521 return it.value() ? d_ptr->m_checkedIcon : d_ptr->m_uncheckedIcon;
1522}
1523
1524/*!
1525 \fn void QtBoolPropertyManager::setValue(QtProperty *property, bool value)
1526
1527 Sets the value of the given \a property to \a value.
1528
1529 \sa value()
1530*/
1531void QtBoolPropertyManager::setValue(QtProperty *property, bool val)
1532{
1533 setSimpleValue<bool, bool, QtBoolPropertyManager>(d_ptr->m_values, this,
1534 &QtBoolPropertyManager::propertyChanged,
1535 &QtBoolPropertyManager::valueChanged,
1536 property, val);
1537}
1538
1539/*!
1540 \reimp
1541*/
1542void QtBoolPropertyManager::initializeProperty(QtProperty *property)
1543{
1544 d_ptr->m_values[property] = false;
1545}
1546
1547/*!
1548 \reimp
1549*/
1550void QtBoolPropertyManager::uninitializeProperty(QtProperty *property)
1551{
1552 d_ptr->m_values.remove(property);
1553}
1554
1555// QtDatePropertyManager
1556
1557class QtDatePropertyManagerPrivate
1558{
1559 QtDatePropertyManager *q_ptr;
1560 Q_DECLARE_PUBLIC(QtDatePropertyManager)
1561public:
1562 explicit QtDatePropertyManagerPrivate(QtDatePropertyManager *q);
1563
1564 struct Data
1565 {
1566 Data() : val(QDate::currentDate()), minVal(QDate(1752, 9, 14)),
1567 maxVal(QDate(7999, 12, 31)) {}
1568 QDate val;
1569 QDate minVal;
1570 QDate maxVal;
1571 QDate minimumValue() const { return minVal; }
1572 QDate maximumValue() const { return maxVal; }
1573 void setMinimumValue(const QDate &newMinVal) { setSimpleMinimumData(this, newMinVal); }
1574 void setMaximumValue(const QDate &newMaxVal) { setSimpleMaximumData(this, newMaxVal); }
1575 };
1576
1577 QString m_format;
1578
1579 typedef QMap<const QtProperty *, Data> PropertyValueMap;
1580 QMap<const QtProperty *, Data> m_values;
1581};
1582
1583QtDatePropertyManagerPrivate::QtDatePropertyManagerPrivate(QtDatePropertyManager *q) :
1584 q_ptr(q),
1585 m_format(QtPropertyBrowserUtils::dateFormat())
1586{
1587}
1588
1589/*!
1590 \class QtDatePropertyManager
1591 \internal
1592 \inmodule QtDesigner
1593 \since 4.4
1594
1595 \brief The QtDatePropertyManager provides and manages QDate properties.
1596
1597 A date property has a current value, and a range specifying the
1598 valid dates. The range is defined by a minimum and a maximum
1599 value.
1600
1601 The property's values can be retrieved using the minimum(),
1602 maximum() and value() functions, and can be set using the
1603 setMinimum(), setMaximum() and setValue() slots. Alternatively,
1604 the range can be defined in one go using the setRange() slot.
1605
1606 In addition, QtDatePropertyManager provides the valueChanged() signal
1607 which is emitted whenever a property created by this manager
1608 changes, and the rangeChanged() signal which is emitted whenever
1609 such a property changes its range of valid dates.
1610
1611 \sa QtAbstractPropertyManager, QtDateEditFactory, QtDateTimePropertyManager
1612*/
1613
1614/*!
1615 \fn void QtDatePropertyManager::valueChanged(QtProperty *property, const QDate &value)
1616
1617 This signal is emitted whenever a property created by this manager
1618 changes its value, passing a pointer to the \a property and the new
1619 \a value as parameters.
1620
1621 \sa setValue()
1622*/
1623
1624/*!
1625 \fn void QtDatePropertyManager::rangeChanged(QtProperty *property, const QDate &minimum, const QDate &maximum)
1626
1627 This signal is emitted whenever a property created by this manager
1628 changes its range of valid dates, passing a pointer to the \a
1629 property and the new \a minimum and \a maximum dates.
1630
1631 \sa setRange()
1632*/
1633
1634/*!
1635 Creates a manager with the given \a parent.
1636*/
1637QtDatePropertyManager::QtDatePropertyManager(QObject *parent)
1638 : QtAbstractPropertyManager(parent), d_ptr(new QtDatePropertyManagerPrivate(this))
1639{
1640}
1641
1642/*!
1643 Destroys this manager, and all the properties it has created.
1644*/
1645QtDatePropertyManager::~QtDatePropertyManager()
1646{
1647 clear();
1648}
1649
1650/*!
1651 Returns the given \a property's value.
1652
1653 If the given \a property is not managed by \e this manager, this
1654 function returns an invalid date.
1655
1656 \sa setValue()
1657*/
1658QDate QtDatePropertyManager::value(const QtProperty *property) const
1659{
1660 return getValue<QDate>(d_ptr->m_values, property);
1661}
1662
1663/*!
1664 Returns the given \a property's minimum date.
1665
1666 \sa maximum(), setRange()
1667*/
1668QDate QtDatePropertyManager::minimum(const QtProperty *property) const
1669{
1670 return getMinimum<QDate>(d_ptr->m_values, property);
1671}
1672
1673/*!
1674 Returns the given \a property's maximum date.
1675
1676 \sa minimum(), setRange()
1677*/
1678QDate QtDatePropertyManager::maximum(const QtProperty *property) const
1679{
1680 return getMaximum<QDate>(d_ptr->m_values, property);
1681}
1682
1683/*!
1684 \reimp
1685*/
1686QString QtDatePropertyManager::valueText(const QtProperty *property) const
1687{
1688 const QtDatePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
1689 if (it == d_ptr->m_values.constEnd())
1690 return QString();
1691 return it.value().val.toString(d_ptr->m_format);
1692}
1693
1694/*!
1695 \fn void QtDatePropertyManager::setValue(QtProperty *property, const QDate &value)
1696
1697 Sets the value of the given \a property to \a value.
1698
1699 If the specified \a value is not a valid date according to the
1700 given \a property's range, the value is adjusted to the nearest
1701 valid value within the range.
1702
1703 \sa value(), setRange(), valueChanged()
1704*/
1705void QtDatePropertyManager::setValue(QtProperty *property, const QDate &val)
1706{
1707 void (QtDatePropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, const QDate &) = 0;
1708 setValueInRange<const QDate &, QtDatePropertyManagerPrivate, QtDatePropertyManager, const QDate>(this, d_ptr.data(),
1709 &QtDatePropertyManager::propertyChanged,
1710 &QtDatePropertyManager::valueChanged,
1711 property, val, setSubPropertyValue);
1712}
1713
1714/*!
1715 Sets the minimum value for the given \a property to \a minVal.
1716
1717 When setting the minimum value, the maximum and current values are
1718 adjusted if necessary (ensuring that the range remains valid and
1719 that the current value is within in the range).
1720
1721 \sa minimum(), setRange()
1722*/
1723void QtDatePropertyManager::setMinimum(QtProperty *property, const QDate &minVal)
1724{
1725 setMinimumValue<const QDate &, QtDatePropertyManagerPrivate, QtDatePropertyManager, QDate, QtDatePropertyManagerPrivate::Data>(this, d_ptr.data(),
1726 &QtDatePropertyManager::propertyChanged,
1727 &QtDatePropertyManager::valueChanged,
1728 &QtDatePropertyManager::rangeChanged,
1729 property, minVal);
1730}
1731
1732/*!
1733 Sets the maximum value for the given \a property to \a maxVal.
1734
1735 When setting the maximum value, the minimum and current
1736 values are adjusted if necessary (ensuring that the range remains
1737 valid and that the current value is within in the range).
1738
1739 \sa maximum(), setRange()
1740*/
1741void QtDatePropertyManager::setMaximum(QtProperty *property, const QDate &maxVal)
1742{
1743 setMaximumValue<const QDate &, QtDatePropertyManagerPrivate, QtDatePropertyManager, QDate, QtDatePropertyManagerPrivate::Data>(this, d_ptr.data(),
1744 &QtDatePropertyManager::propertyChanged,
1745 &QtDatePropertyManager::valueChanged,
1746 &QtDatePropertyManager::rangeChanged,
1747 property, maxVal);
1748}
1749
1750/*!
1751 \fn void QtDatePropertyManager::setRange(QtProperty *property, const QDate &minimum, const QDate &maximum)
1752
1753 Sets the range of valid dates.
1754
1755 This is a convenience function defining the range of valid dates
1756 in one go; setting the \a minimum and \a maximum values for the
1757 given \a property with a single function call.
1758
1759 When setting a new date range, the current value is adjusted if
1760 necessary (ensuring that the value remains in date range).
1761
1762 \sa setMinimum(), setMaximum(), rangeChanged()
1763*/
1764void QtDatePropertyManager::setRange(QtProperty *property, const QDate &minVal, const QDate &maxVal)
1765{
1766 void (QtDatePropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, const QDate &,
1767 const QDate &, const QDate &) = 0;
1768 setBorderValues<const QDate &, QtDatePropertyManagerPrivate, QtDatePropertyManager, QDate>(this, d_ptr.data(),
1769 &QtDatePropertyManager::propertyChanged,
1770 &QtDatePropertyManager::valueChanged,
1771 &QtDatePropertyManager::rangeChanged,
1772 property, minVal, maxVal, setSubPropertyRange);
1773}
1774
1775/*!
1776 \reimp
1777*/
1778void QtDatePropertyManager::initializeProperty(QtProperty *property)
1779{
1780 d_ptr->m_values[property] = QtDatePropertyManagerPrivate::Data();
1781}
1782
1783/*!
1784 \reimp
1785*/
1786void QtDatePropertyManager::uninitializeProperty(QtProperty *property)
1787{
1788 d_ptr->m_values.remove(property);
1789}
1790
1791// QtTimePropertyManager
1792
1793class QtTimePropertyManagerPrivate
1794{
1795 QtTimePropertyManager *q_ptr;
1796 Q_DECLARE_PUBLIC(QtTimePropertyManager)
1797public:
1798 explicit QtTimePropertyManagerPrivate(QtTimePropertyManager *q);
1799
1800 const QString m_format;
1801
1802 typedef QMap<const QtProperty *, QTime> PropertyValueMap;
1803 PropertyValueMap m_values;
1804};
1805
1806QtTimePropertyManagerPrivate::QtTimePropertyManagerPrivate(QtTimePropertyManager *q) :
1807 q_ptr(q),
1808 m_format(QtPropertyBrowserUtils::timeFormat())
1809{
1810}
1811
1812/*!
1813 \class QtTimePropertyManager
1814 \internal
1815 \inmodule QtDesigner
1816 \since 4.4
1817
1818 \brief The QtTimePropertyManager provides and manages QTime properties.
1819
1820 A time property's value can be retrieved using the value()
1821 function, and set using the setValue() slot.
1822
1823 In addition, QtTimePropertyManager provides the valueChanged() signal
1824 which is emitted whenever a property created by this manager
1825 changes.
1826
1827 \sa QtAbstractPropertyManager, QtTimeEditFactory
1828*/
1829
1830/*!
1831 \fn void QtTimePropertyManager::valueChanged(QtProperty *property, const QTime &value)
1832
1833 This signal is emitted whenever a property created by this manager
1834 changes its value, passing a pointer to the \a property and the
1835 new \a value as parameters.
1836
1837 \sa setValue()
1838*/
1839
1840/*!
1841 Creates a manager with the given \a parent.
1842*/
1843QtTimePropertyManager::QtTimePropertyManager(QObject *parent)
1844 : QtAbstractPropertyManager(parent), d_ptr(new QtTimePropertyManagerPrivate(this))
1845{
1846}
1847
1848/*!
1849 Destroys this manager, and all the properties it has created.
1850*/
1851QtTimePropertyManager::~QtTimePropertyManager()
1852{
1853 clear();
1854}
1855
1856/*!
1857 Returns the given \a property's value.
1858
1859 If the given property is not managed by this manager, this
1860 function returns an invalid time object.
1861
1862 \sa setValue()
1863*/
1864QTime QtTimePropertyManager::value(const QtProperty *property) const
1865{
1866 return d_ptr->m_values.value(property, QTime());
1867}
1868
1869/*!
1870 \reimp
1871*/
1872QString QtTimePropertyManager::valueText(const QtProperty *property) const
1873{
1874 const QtTimePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
1875 if (it == d_ptr->m_values.constEnd())
1876 return QString();
1877 return it.value().toString(d_ptr->m_format);
1878}
1879
1880/*!
1881 \fn void QtTimePropertyManager::setValue(QtProperty *property, const QTime &value)
1882
1883 Sets the value of the given \a property to \a value.
1884
1885 \sa value(), valueChanged()
1886*/
1887void QtTimePropertyManager::setValue(QtProperty *property, const QTime &val)
1888{
1889 setSimpleValue<const QTime &, QTime, QtTimePropertyManager>(d_ptr->m_values, this,
1890 &QtTimePropertyManager::propertyChanged,
1891 &QtTimePropertyManager::valueChanged,
1892 property, val);
1893}
1894
1895/*!
1896 \reimp
1897*/
1898void QtTimePropertyManager::initializeProperty(QtProperty *property)
1899{
1900 d_ptr->m_values[property] = QTime::currentTime();
1901}
1902
1903/*!
1904 \reimp
1905*/
1906void QtTimePropertyManager::uninitializeProperty(QtProperty *property)
1907{
1908 d_ptr->m_values.remove(property);
1909}
1910
1911// QtDateTimePropertyManager
1912
1913class QtDateTimePropertyManagerPrivate
1914{
1915 QtDateTimePropertyManager *q_ptr;
1916 Q_DECLARE_PUBLIC(QtDateTimePropertyManager)
1917public:
1918 explicit QtDateTimePropertyManagerPrivate(QtDateTimePropertyManager *q);
1919
1920 const QString m_format;
1921
1922 typedef QMap<const QtProperty *, QDateTime> PropertyValueMap;
1923 PropertyValueMap m_values;
1924};
1925
1926QtDateTimePropertyManagerPrivate::QtDateTimePropertyManagerPrivate(QtDateTimePropertyManager *q) :
1927 q_ptr(q),
1928 m_format(QtPropertyBrowserUtils::dateTimeFormat())
1929{
1930}
1931
1932/*! \class QtDateTimePropertyManager
1933 \internal
1934 \inmodule QtDesigner
1935 \since 4.4
1936
1937 \brief The QtDateTimePropertyManager provides and manages QDateTime properties.
1938
1939 A date and time property has a current value which can be
1940 retrieved using the value() function, and set using the setValue()
1941 slot. In addition, QtDateTimePropertyManager provides the
1942 valueChanged() signal which is emitted whenever a property created
1943 by this manager changes.
1944
1945 \sa QtAbstractPropertyManager, QtDateTimeEditFactory, QtDatePropertyManager
1946*/
1947
1948/*!
1949 \fn void QtDateTimePropertyManager::valueChanged(QtProperty *property, const QDateTime &value)
1950
1951 This signal is emitted whenever a property created by this manager
1952 changes its value, passing a pointer to the \a property and the new
1953 \a value as parameters.
1954*/
1955
1956/*!
1957 Creates a manager with the given \a parent.
1958*/
1959QtDateTimePropertyManager::QtDateTimePropertyManager(QObject *parent)
1960 : QtAbstractPropertyManager(parent), d_ptr(new QtDateTimePropertyManagerPrivate(this))
1961{
1962}
1963
1964/*!
1965 Destroys this manager, and all the properties it has created.
1966*/
1967QtDateTimePropertyManager::~QtDateTimePropertyManager()
1968{
1969 clear();
1970}
1971
1972/*!
1973 Returns the given \a property's value.
1974
1975 If the given \a property is not managed by this manager, this
1976 function returns an invalid QDateTime object.
1977
1978 \sa setValue()
1979*/
1980QDateTime QtDateTimePropertyManager::value(const QtProperty *property) const
1981{
1982 return d_ptr->m_values.value(property, QDateTime());
1983}
1984
1985/*!
1986 \reimp
1987*/
1988QString QtDateTimePropertyManager::valueText(const QtProperty *property) const
1989{
1990 const QtDateTimePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
1991 if (it == d_ptr->m_values.constEnd())
1992 return QString();
1993 return it.value().toString(d_ptr->m_format);
1994}
1995
1996/*!
1997 \fn void QtDateTimePropertyManager::setValue(QtProperty *property, const QDateTime &value)
1998
1999 Sets the value of the given \a property to \a value.
2000
2001 \sa value(), valueChanged()
2002*/
2003void QtDateTimePropertyManager::setValue(QtProperty *property, const QDateTime &val)
2004{
2005 setSimpleValue<const QDateTime &, QDateTime, QtDateTimePropertyManager>(d_ptr->m_values, this,
2006 &QtDateTimePropertyManager::propertyChanged,
2007 &QtDateTimePropertyManager::valueChanged,
2008 property, val);
2009}
2010
2011/*!
2012 \reimp
2013*/
2014void QtDateTimePropertyManager::initializeProperty(QtProperty *property)
2015{
2016 d_ptr->m_values[property] = QDateTime::currentDateTime();
2017}
2018
2019/*!
2020 \reimp
2021*/
2022void QtDateTimePropertyManager::uninitializeProperty(QtProperty *property)
2023{
2024 d_ptr->m_values.remove(property);
2025}
2026
2027// QtKeySequencePropertyManager
2028
2029class QtKeySequencePropertyManagerPrivate
2030{
2031 QtKeySequencePropertyManager *q_ptr;
2032 Q_DECLARE_PUBLIC(QtKeySequencePropertyManager)
2033public:
2034
2035 QString m_format;
2036
2037 typedef QMap<const QtProperty *, QKeySequence> PropertyValueMap;
2038 PropertyValueMap m_values;
2039};
2040
2041/*! \class QtKeySequencePropertyManager
2042 \internal
2043 \inmodule QtDesigner
2044 \since 4.4
2045
2046 \brief The QtKeySequencePropertyManager provides and manages QKeySequence properties.
2047
2048 A key sequence's value can be retrieved using the value()
2049 function, and set using the setValue() slot.
2050
2051 In addition, QtKeySequencePropertyManager provides the valueChanged() signal
2052 which is emitted whenever a property created by this manager
2053 changes.
2054
2055 \sa QtAbstractPropertyManager
2056*/
2057
2058/*!
2059 \fn void QtKeySequencePropertyManager::valueChanged(QtProperty *property, const QKeySequence &value)
2060
2061 This signal is emitted whenever a property created by this manager
2062 changes its value, passing a pointer to the \a property and the new
2063 \a value as parameters.
2064*/
2065
2066/*!
2067 Creates a manager with the given \a parent.
2068*/
2069QtKeySequencePropertyManager::QtKeySequencePropertyManager(QObject *parent)
2070 : QtAbstractPropertyManager(parent), d_ptr(new QtKeySequencePropertyManagerPrivate)
2071{
2072 d_ptr->q_ptr = this;
2073}
2074
2075/*!
2076 Destroys this manager, and all the properties it has created.
2077*/
2078QtKeySequencePropertyManager::~QtKeySequencePropertyManager()
2079{
2080 clear();
2081}
2082
2083/*!
2084 Returns the given \a property's value.
2085
2086 If the given \a property is not managed by this manager, this
2087 function returns an empty QKeySequence object.
2088
2089 \sa setValue()
2090*/
2091QKeySequence QtKeySequencePropertyManager::value(const QtProperty *property) const
2092{
2093 return d_ptr->m_values.value(property, QKeySequence());
2094}
2095
2096/*!
2097 \reimp
2098*/
2099QString QtKeySequencePropertyManager::valueText(const QtProperty *property) const
2100{
2101 const QtKeySequencePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
2102 if (it == d_ptr->m_values.constEnd())
2103 return QString();
2104 return it.value().toString(QKeySequence::NativeText);
2105}
2106
2107/*!
2108 \fn void QtKeySequencePropertyManager::setValue(QtProperty *property, const QKeySequence &value)
2109
2110 Sets the value of the given \a property to \a value.
2111
2112 \sa value(), valueChanged()
2113*/
2114void QtKeySequencePropertyManager::setValue(QtProperty *property, const QKeySequence &val)
2115{
2116 setSimpleValue<const QKeySequence &, QKeySequence, QtKeySequencePropertyManager>(d_ptr->m_values, this,
2117 &QtKeySequencePropertyManager::propertyChanged,
2118 &QtKeySequencePropertyManager::valueChanged,
2119 property, val);
2120}
2121
2122/*!
2123 \reimp
2124*/
2125void QtKeySequencePropertyManager::initializeProperty(QtProperty *property)
2126{
2127 d_ptr->m_values[property] = QKeySequence();
2128}
2129
2130/*!
2131 \reimp
2132*/
2133void QtKeySequencePropertyManager::uninitializeProperty(QtProperty *property)
2134{
2135 d_ptr->m_values.remove(property);
2136}
2137
2138// QtCharPropertyManager
2139
2140class QtCharPropertyManagerPrivate
2141{
2142 QtCharPropertyManager *q_ptr;
2143 Q_DECLARE_PUBLIC(QtCharPropertyManager)
2144public:
2145
2146 typedef QMap<const QtProperty *, QChar> PropertyValueMap;
2147 PropertyValueMap m_values;
2148};
2149
2150/*! \class QtCharPropertyManager
2151 \internal
2152 \inmodule QtDesigner
2153 \since 4.4
2154
2155 \brief The QtCharPropertyManager provides and manages QChar properties.
2156
2157 A char's value can be retrieved using the value()
2158 function, and set using the setValue() slot.
2159
2160 In addition, QtCharPropertyManager provides the valueChanged() signal
2161 which is emitted whenever a property created by this manager
2162 changes.
2163
2164 \sa QtAbstractPropertyManager
2165*/
2166
2167/*!
2168 \fn void QtCharPropertyManager::valueChanged(QtProperty *property, const QChar &value)
2169
2170 This signal is emitted whenever a property created by this manager
2171 changes its value, passing a pointer to the \a property and the new
2172 \a value as parameters.
2173*/
2174
2175/*!
2176 Creates a manager with the given \a parent.
2177*/
2178QtCharPropertyManager::QtCharPropertyManager(QObject *parent)
2179 : QtAbstractPropertyManager(parent), d_ptr(new QtCharPropertyManagerPrivate)
2180{
2181 d_ptr->q_ptr = this;
2182}
2183
2184/*!
2185 Destroys this manager, and all the properties it has created.
2186*/
2187QtCharPropertyManager::~QtCharPropertyManager()
2188{
2189 clear();
2190}
2191
2192/*!
2193 Returns the given \a property's value.
2194
2195 If the given \a property is not managed by this manager, this
2196 function returns an null QChar object.
2197
2198 \sa setValue()
2199*/
2200QChar QtCharPropertyManager::value(const QtProperty *property) const
2201{
2202 return d_ptr->m_values.value(property, QChar());
2203}
2204
2205/*!
2206 \reimp
2207*/
2208QString QtCharPropertyManager::valueText(const QtProperty *property) const
2209{
2210 const QtCharPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
2211 if (it == d_ptr->m_values.constEnd())
2212 return QString();
2213 const QChar c = it.value();
2214 return c.isNull() ? QString() : QString(c);
2215}
2216
2217/*!
2218 \fn void QtCharPropertyManager::setValue(QtProperty *property, const QChar &value)
2219
2220 Sets the value of the given \a property to \a value.
2221
2222 \sa value(), valueChanged()
2223*/
2224void QtCharPropertyManager::setValue(QtProperty *property, const QChar &val)
2225{
2226 setSimpleValue<const QChar &, QChar, QtCharPropertyManager>(d_ptr->m_values, this,
2227 &QtCharPropertyManager::propertyChanged,
2228 &QtCharPropertyManager::valueChanged,
2229 property, val);
2230}
2231
2232/*!
2233 \reimp
2234*/
2235void QtCharPropertyManager::initializeProperty(QtProperty *property)
2236{
2237 d_ptr->m_values[property] = QChar();
2238}
2239
2240/*!
2241 \reimp
2242*/
2243void QtCharPropertyManager::uninitializeProperty(QtProperty *property)
2244{
2245 d_ptr->m_values.remove(property);
2246}
2247
2248// QtLocalePropertyManager
2249
2250class QtLocalePropertyManagerPrivate
2251{
2252 QtLocalePropertyManager *q_ptr;
2253 Q_DECLARE_PUBLIC(QtLocalePropertyManager)
2254public:
2255
2256 QtLocalePropertyManagerPrivate();
2257
2258 void slotEnumChanged(QtProperty *property, int value);
2259 void slotPropertyDestroyed(QtProperty *property);
2260
2261 typedef QMap<const QtProperty *, QLocale> PropertyValueMap;
2262 PropertyValueMap m_values;
2263
2264 QtEnumPropertyManager *m_enumPropertyManager;
2265
2266 QMap<const QtProperty *, QtProperty *> m_propertyToLanguage;
2267 QMap<const QtProperty *, QtProperty *> m_propertyToCountry;
2268
2269 QMap<const QtProperty *, QtProperty *> m_languageToProperty;
2270 QMap<const QtProperty *, QtProperty *> m_countryToProperty;
2271};
2272
2273QtLocalePropertyManagerPrivate::QtLocalePropertyManagerPrivate()
2274{
2275}
2276
2277void QtLocalePropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value)
2278{
2279 if (QtProperty *prop = m_languageToProperty.value(property, 0)) {
2280 const QLocale loc = m_values[prop];
2281 QLocale::Language newLanguage = loc.language();
2282 QLocale::Country newCountry = loc.country();
2283 metaEnumProvider()->indexToLocale(value, 0, &newLanguage, 0);
2284 QLocale newLoc(newLanguage, newCountry);
2285 q_ptr->setValue(prop, newLoc);
2286 } else if (QtProperty *prop = m_countryToProperty.value(property, 0)) {
2287 const QLocale loc = m_values[prop];
2288 QLocale::Language newLanguage = loc.language();
2289 QLocale::Country newCountry = loc.country();
2290 metaEnumProvider()->indexToLocale(m_enumPropertyManager->value(m_propertyToLanguage.value(prop)), value, &newLanguage, &newCountry);
2291 QLocale newLoc(newLanguage, newCountry);
2292 q_ptr->setValue(prop, newLoc);
2293 }
2294}
2295
2296void QtLocalePropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
2297{
2298 if (QtProperty *subProp = m_languageToProperty.value(property, 0)) {
2299 m_propertyToLanguage[subProp] = 0;
2300 m_languageToProperty.remove(property);
2301 } else if (QtProperty *subProp = m_countryToProperty.value(property, 0)) {
2302 m_propertyToCountry[subProp] = 0;
2303 m_countryToProperty.remove(property);
2304 }
2305}
2306
2307/*!
2308 \class QtLocalePropertyManager
2309 \internal
2310 \inmodule QtDesigner
2311 \since 4.4
2312
2313 \brief The QtLocalePropertyManager provides and manages QLocale properties.
2314
2315 A locale property has nested \e language and \e country
2316 subproperties. The top-level property's value can be retrieved
2317 using the value() function, and set using the setValue() slot.
2318
2319 The subproperties are created by QtEnumPropertyManager object.
2320 These submanager can be retrieved using the subEnumPropertyManager()
2321 function. In order to provide editing widgets for the subproperties
2322 in a property browser widget, this manager must be associated with editor factory.
2323
2324 In addition, QtLocalePropertyManager provides the valueChanged()
2325 signal which is emitted whenever a property created by this
2326 manager changes.
2327
2328 \sa QtAbstractPropertyManager, QtEnumPropertyManager
2329*/
2330
2331/*!
2332 \fn void QtLocalePropertyManager::valueChanged(QtProperty *property, const QLocale &value)
2333
2334 This signal is emitted whenever a property created by this manager
2335 changes its value, passing a pointer to the \a property and the
2336 new \a value as parameters.
2337
2338 \sa setValue()
2339*/
2340
2341/*!
2342 Creates a manager with the given \a parent.
2343*/
2344QtLocalePropertyManager::QtLocalePropertyManager(QObject *parent)
2345 : QtAbstractPropertyManager(parent), d_ptr(new QtLocalePropertyManagerPrivate)
2346{
2347 d_ptr->q_ptr = this;
2348
2349 d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this);
2350 connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
2351 this, SLOT(slotEnumChanged(QtProperty*,int)));
2352
2353 connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
2354 this, SLOT(slotPropertyDestroyed(QtProperty*)));
2355}
2356
2357/*!
2358 Destroys this manager, and all the properties it has created.
2359*/
2360QtLocalePropertyManager::~QtLocalePropertyManager()
2361{
2362 clear();
2363}
2364
2365/*!
2366 Returns the manager that creates the nested \e language
2367 and \e country subproperties.
2368
2369 In order to provide editing widgets for the mentioned subproperties
2370 in a property browser widget, this manager must be associated with
2371 an editor factory.
2372
2373 \sa QtAbstractPropertyBrowser::setFactoryForManager()
2374*/
2375QtEnumPropertyManager *QtLocalePropertyManager::subEnumPropertyManager() const
2376{
2377 return d_ptr->m_enumPropertyManager;
2378}
2379
2380/*!
2381 Returns the given \a property's value.
2382
2383 If the given property is not managed by this manager, this
2384 function returns the default locale.
2385
2386 \sa setValue()
2387*/
2388QLocale QtLocalePropertyManager::value(const QtProperty *property) const
2389{
2390 return d_ptr->m_values.value(property, QLocale());
2391}
2392
2393/*!
2394 \reimp
2395*/
2396QString QtLocalePropertyManager::valueText(const QtProperty *property) const
2397{
2398 const QtLocalePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
2399 if (it == d_ptr->m_values.constEnd())
2400 return QString();
2401
2402 QLocale loc = it.value();
2403
2404 int langIdx = 0;
2405 int countryIdx = 0;
2406 metaEnumProvider()->localeToIndex(loc.language(), loc.country(), &langIdx, &countryIdx);
2407 QString str = tr("%1, %2")
2408 .arg(metaEnumProvider()->languageEnumNames().at(langIdx))
2409 .arg(metaEnumProvider()->countryEnumNames(loc.language()).at(countryIdx));
2410 return str;
2411}
2412
2413/*!
2414 \fn void QtLocalePropertyManager::setValue(QtProperty *property, const QLocale &value)
2415
2416 Sets the value of the given \a property to \a value. Nested
2417 properties are updated automatically.
2418
2419 \sa value(), valueChanged()
2420*/
2421void QtLocalePropertyManager::setValue(QtProperty *property, const QLocale &val)
2422{
2423 const QtLocalePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
2424 if (it == d_ptr->m_values.end())
2425 return;
2426
2427 const QLocale loc = it.value();
2428 if (loc == val)
2429 return;
2430
2431 it.value() = val;
2432
2433 int langIdx = 0;
2434 int countryIdx = 0;
2435 metaEnumProvider()->localeToIndex(val.language(), val.country(), &langIdx, &countryIdx);
2436 if (loc.language() != val.language()) {
2437 d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToLanguage.value(property), langIdx);
2438 d_ptr->m_enumPropertyManager->setEnumNames(d_ptr->m_propertyToCountry.value(property),
2439 metaEnumProvider()->countryEnumNames(val.language()));
2440 }
2441 d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToCountry.value(property), countryIdx);
2442
2443 emit propertyChanged(property);
2444 emit valueChanged(property, val);
2445}
2446
2447/*!
2448 \reimp
2449*/
2450void QtLocalePropertyManager::initializeProperty(QtProperty *property)
2451{
2452 QLocale val;
2453 d_ptr->m_values[property] = val;
2454
2455 int langIdx = 0;
2456 int countryIdx = 0;
2457 metaEnumProvider()->localeToIndex(val.language(), val.country(), &langIdx, &countryIdx);
2458
2459 QtProperty *languageProp = d_ptr->m_enumPropertyManager->addProperty();
2460 languageProp->setPropertyName(tr("Language"));
2461 d_ptr->m_enumPropertyManager->setEnumNames(languageProp, metaEnumProvider()->languageEnumNames());
2462 d_ptr->m_enumPropertyManager->setValue(languageProp, langIdx);
2463 d_ptr->m_propertyToLanguage[property] = languageProp;
2464 d_ptr->m_languageToProperty[languageProp] = property;
2465 property->addSubProperty(languageProp);
2466
2467 QtProperty *countryProp = d_ptr->m_enumPropertyManager->addProperty();
2468 countryProp->setPropertyName(tr("Country"));
2469 d_ptr->m_enumPropertyManager->setEnumNames(countryProp, metaEnumProvider()->countryEnumNames(val.language()));
2470 d_ptr->m_enumPropertyManager->setValue(countryProp, countryIdx);
2471 d_ptr->m_propertyToCountry[property] = countryProp;
2472 d_ptr->m_countryToProperty[countryProp] = property;
2473 property->addSubProperty(countryProp);
2474}
2475
2476/*!
2477 \reimp
2478*/
2479void QtLocalePropertyManager::uninitializeProperty(QtProperty *property)
2480{
2481 QtProperty *languageProp = d_ptr->m_propertyToLanguage[property];
2482 if (languageProp) {
2483 d_ptr->m_languageToProperty.remove(languageProp);
2484 delete languageProp;
2485 }
2486 d_ptr->m_propertyToLanguage.remove(property);
2487
2488 QtProperty *countryProp = d_ptr->m_propertyToCountry[property];
2489 if (countryProp) {
2490 d_ptr->m_countryToProperty.remove(countryProp);
2491 delete countryProp;
2492 }
2493 d_ptr->m_propertyToCountry.remove(property);
2494
2495 d_ptr->m_values.remove(property);
2496}
2497
2498// QtPointPropertyManager
2499
2500class QtPointPropertyManagerPrivate
2501{
2502 QtPointPropertyManager *q_ptr;
2503 Q_DECLARE_PUBLIC(QtPointPropertyManager)
2504public:
2505
2506 void slotIntChanged(QtProperty *property, int value);
2507 void slotPropertyDestroyed(QtProperty *property);
2508
2509 typedef QMap<const QtProperty *, QPoint> PropertyValueMap;
2510 PropertyValueMap m_values;
2511
2512 QtIntPropertyManager *m_intPropertyManager;
2513
2514 QMap<const QtProperty *, QtProperty *> m_propertyToX;
2515 QMap<const QtProperty *, QtProperty *> m_propertyToY;
2516
2517 QMap<const QtProperty *, QtProperty *> m_xToProperty;
2518 QMap<const QtProperty *, QtProperty *> m_yToProperty;
2519};
2520
2521void QtPointPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
2522{
2523 if (QtProperty *xprop = m_xToProperty.value(property, 0)) {
2524 QPoint p = m_values[xprop];
2525 p.setX(value);
2526 q_ptr->setValue(xprop, p);
2527 } else if (QtProperty *yprop = m_yToProperty.value(property, 0)) {
2528 QPoint p = m_values[yprop];
2529 p.setY(value);
2530 q_ptr->setValue(yprop, p);
2531 }
2532}
2533
2534void QtPointPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
2535{
2536 if (QtProperty *pointProp = m_xToProperty.value(property, 0)) {
2537 m_propertyToX[pointProp] = 0;
2538 m_xToProperty.remove(property);
2539 } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) {
2540 m_propertyToY[pointProp] = 0;
2541 m_yToProperty.remove(property);
2542 }
2543}
2544
2545/*! \class QtPointPropertyManager
2546 \internal
2547 \inmodule QtDesigner
2548 \since 4.4
2549
2550 \brief The QtPointPropertyManager provides and manages QPoint properties.
2551
2552 A point property has nested \e x and \e y subproperties. The
2553 top-level property's value can be retrieved using the value()
2554 function, and set using the setValue() slot.
2555
2556 The subproperties are created by a QtIntPropertyManager object. This
2557 manager can be retrieved using the subIntPropertyManager() function. In
2558 order to provide editing widgets for the subproperties in a
2559 property browser widget, this manager must be associated with an
2560 editor factory.
2561
2562 In addition, QtPointPropertyManager provides the valueChanged() signal which
2563 is emitted whenever a property created by this manager changes.
2564
2565 \sa QtAbstractPropertyManager, QtIntPropertyManager, QtPointFPropertyManager
2566*/
2567
2568/*!
2569 \fn void QtPointPropertyManager::valueChanged(QtProperty *property, const QPoint &value)
2570
2571 This signal is emitted whenever a property created by this manager
2572 changes its value, passing a pointer to the \a property and the
2573 new \a value as parameters.
2574
2575 \sa setValue()
2576*/
2577
2578/*!
2579 Creates a manager with the given \a parent.
2580*/
2581QtPointPropertyManager::QtPointPropertyManager(QObject *parent)
2582 : QtAbstractPropertyManager(parent), d_ptr(new QtPointPropertyManagerPrivate)
2583{
2584 d_ptr->q_ptr = this;
2585
2586 d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
2587 connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
2588 this, SLOT(slotIntChanged(QtProperty*,int)));
2589 connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
2590 this, SLOT(slotPropertyDestroyed(QtProperty*)));
2591}
2592
2593/*!
2594 Destroys this manager, and all the properties it has created.
2595*/
2596QtPointPropertyManager::~QtPointPropertyManager()
2597{
2598 clear();
2599}
2600
2601/*!
2602 Returns the manager that creates the nested \e x and \e y
2603 subproperties.
2604
2605 In order to provide editing widgets for the subproperties in a
2606 property browser widget, this manager must be associated with an
2607 editor factory.
2608
2609 \sa QtAbstractPropertyBrowser::setFactoryForManager()
2610*/
2611QtIntPropertyManager *QtPointPropertyManager::subIntPropertyManager() const
2612{
2613 return d_ptr->m_intPropertyManager;
2614}
2615
2616/*!
2617 Returns the given \a property's value.
2618
2619 If the given \a property is not managed by this manager, this
2620 function returns a point with coordinates (0, 0).
2621
2622 \sa setValue()
2623*/
2624QPoint QtPointPropertyManager::value(const QtProperty *property) const
2625{
2626 return d_ptr->m_values.value(property, QPoint());
2627}
2628
2629/*!
2630 \reimp
2631*/
2632QString QtPointPropertyManager::valueText(const QtProperty *property) const
2633{
2634 const QtPointPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
2635 if (it == d_ptr->m_values.constEnd())
2636 return QString();
2637 const QPoint v = it.value();
2638 return QString(tr("(%1, %2)").arg(QString::number(v.x()))
2639 .arg(QString::number(v.y())));
2640}
2641
2642/*!
2643 \fn void QtPointPropertyManager::setValue(QtProperty *property, const QPoint &value)
2644
2645 Sets the value of the given \a property to \a value. Nested
2646 properties are updated automatically.
2647
2648 \sa value(), valueChanged()
2649*/
2650void QtPointPropertyManager::setValue(QtProperty *property, const QPoint &val)
2651{
2652 const QtPointPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
2653 if (it == d_ptr->m_values.end())
2654 return;
2655
2656 if (it.value() == val)
2657 return;
2658
2659 it.value() = val;
2660 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToX[property], val.x());
2661 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToY[property], val.y());
2662
2663 emit propertyChanged(property);
2664 emit valueChanged(property, val);
2665}
2666
2667/*!
2668 \reimp
2669*/
2670void QtPointPropertyManager::initializeProperty(QtProperty *property)
2671{
2672 d_ptr->m_values[property] = QPoint(0, 0);
2673
2674 QtProperty *xProp = d_ptr->m_intPropertyManager->addProperty();
2675 xProp->setPropertyName(tr("X"));
2676 d_ptr->m_intPropertyManager->setValue(xProp, 0);
2677 d_ptr->m_propertyToX[property] = xProp;
2678 d_ptr->m_xToProperty[xProp] = property;
2679 property->addSubProperty(xProp);
2680
2681 QtProperty *yProp = d_ptr->m_intPropertyManager->addProperty();
2682 yProp->setPropertyName(tr("Y"));
2683 d_ptr->m_intPropertyManager->setValue(yProp, 0);
2684 d_ptr->m_propertyToY[property] = yProp;
2685 d_ptr->m_yToProperty[yProp] = property;
2686 property->addSubProperty(yProp);
2687}
2688
2689/*!
2690 \reimp
2691*/
2692void QtPointPropertyManager::uninitializeProperty(QtProperty *property)
2693{
2694 QtProperty *xProp = d_ptr->m_propertyToX[property];
2695 if (xProp) {
2696 d_ptr->m_xToProperty.remove(xProp);
2697 delete xProp;
2698 }
2699 d_ptr->m_propertyToX.remove(property);
2700
2701 QtProperty *yProp = d_ptr->m_propertyToY[property];
2702 if (yProp) {
2703 d_ptr->m_yToProperty.remove(yProp);
2704 delete yProp;
2705 }
2706 d_ptr->m_propertyToY.remove(property);
2707
2708 d_ptr->m_values.remove(property);
2709}
2710
2711// QtPointFPropertyManager
2712
2713class QtPointFPropertyManagerPrivate
2714{
2715 QtPointFPropertyManager *q_ptr;
2716 Q_DECLARE_PUBLIC(QtPointFPropertyManager)
2717public:
2718
2719 struct Data
2720 {
2721 Data() : decimals(2) {}
2722 QPointF val;
2723 int decimals;
2724 };
2725
2726 void slotDoubleChanged(QtProperty *property, double value);
2727 void slotPropertyDestroyed(QtProperty *property);
2728
2729 typedef QMap<const QtProperty *, Data> PropertyValueMap;
2730 PropertyValueMap m_values;
2731
2732 QtDoublePropertyManager *m_doublePropertyManager;
2733
2734 QMap<const QtProperty *, QtProperty *> m_propertyToX;
2735 QMap<const QtProperty *, QtProperty *> m_propertyToY;
2736
2737 QMap<const QtProperty *, QtProperty *> m_xToProperty;
2738 QMap<const QtProperty *, QtProperty *> m_yToProperty;
2739};
2740
2741void QtPointFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value)
2742{
2743 if (QtProperty *prop = m_xToProperty.value(property, 0)) {
2744 QPointF p = m_values[prop].val;
2745 p.setX(value);
2746 q_ptr->setValue(prop, p);
2747 } else if (QtProperty *prop = m_yToProperty.value(property, 0)) {
2748 QPointF p = m_values[prop].val;
2749 p.setY(value);
2750 q_ptr->setValue(prop, p);
2751 }
2752}
2753
2754void QtPointFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
2755{
2756 if (QtProperty *pointProp = m_xToProperty.value(property, 0)) {
2757 m_propertyToX[pointProp] = 0;
2758 m_xToProperty.remove(property);
2759 } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) {
2760 m_propertyToY[pointProp] = 0;
2761 m_yToProperty.remove(property);
2762 }
2763}
2764
2765/*! \class QtPointFPropertyManager
2766 \internal
2767 \inmodule QtDesigner
2768 \since 4.4
2769
2770 \brief The QtPointFPropertyManager provides and manages QPointF properties.
2771
2772 A point property has nested \e x and \e y subproperties. The
2773 top-level property's value can be retrieved using the value()
2774 function, and set using the setValue() slot.
2775
2776 The subproperties are created by a QtDoublePropertyManager object. This
2777 manager can be retrieved using the subDoublePropertyManager() function. In
2778 order to provide editing widgets for the subproperties in a
2779 property browser widget, this manager must be associated with an
2780 editor factory.
2781
2782 In addition, QtPointFPropertyManager provides the valueChanged() signal which
2783 is emitted whenever a property created by this manager changes.
2784
2785 \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtPointPropertyManager
2786*/
2787
2788/*!
2789 \fn void QtPointFPropertyManager::valueChanged(QtProperty *property, const QPointF &value)
2790
2791 This signal is emitted whenever a property created by this manager
2792 changes its value, passing a pointer to the \a property and the
2793 new \a value as parameters.
2794
2795 \sa setValue()
2796*/
2797
2798/*!
2799 \fn void QtPointFPropertyManager::decimalsChanged(QtProperty *property, int prec)
2800
2801 This signal is emitted whenever a property created by this manager
2802 changes its precision of value, passing a pointer to the
2803 \a property and the new \a prec value
2804
2805 \sa setDecimals()
2806*/
2807
2808/*!
2809 Creates a manager with the given \a parent.
2810*/
2811QtPointFPropertyManager::QtPointFPropertyManager(QObject *parent)
2812 : QtAbstractPropertyManager(parent), d_ptr(new QtPointFPropertyManagerPrivate)
2813{
2814 d_ptr->q_ptr = this;
2815
2816 d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this);
2817 connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty*,double)),
2818 this, SLOT(slotDoubleChanged(QtProperty*,double)));
2819 connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
2820 this, SLOT(slotPropertyDestroyed(QtProperty*)));
2821}
2822
2823/*!
2824 Destroys this manager, and all the properties it has created.
2825*/
2826QtPointFPropertyManager::~QtPointFPropertyManager()
2827{
2828 clear();
2829}
2830
2831/*!
2832 Returns the manager that creates the nested \e x and \e y
2833 subproperties.
2834
2835 In order to provide editing widgets for the subproperties in a
2836 property browser widget, this manager must be associated with an
2837 editor factory.
2838
2839 \sa QtAbstractPropertyBrowser::setFactoryForManager()
2840*/
2841QtDoublePropertyManager *QtPointFPropertyManager::subDoublePropertyManager() const
2842{
2843 return d_ptr->m_doublePropertyManager;
2844}
2845
2846/*!
2847 Returns the given \a property's value.
2848
2849 If the given \a property is not managed by this manager, this
2850 function returns a point with coordinates (0, 0).
2851
2852 \sa setValue()
2853*/
2854QPointF QtPointFPropertyManager::value(const QtProperty *property) const
2855{
2856 return getValue<QPointF>(d_ptr->m_values, property);
2857}
2858
2859/*!
2860 Returns the given \a property's precision, in decimals.
2861
2862 \sa setDecimals()
2863*/
2864int QtPointFPropertyManager::decimals(const QtProperty *property) const
2865{
2866 return getData<int>(d_ptr->m_values, &QtPointFPropertyManagerPrivate::Data::decimals, property, 0);
2867}
2868
2869/*!
2870 \reimp
2871*/
2872QString QtPointFPropertyManager::valueText(const QtProperty *property) const
2873{
2874 const QtPointFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
2875 if (it == d_ptr->m_values.constEnd())
2876 return QString();
2877 const QPointF v = it.value().val;
2878 const int dec = it.value().decimals;
2879 return QString(tr("(%1, %2)").arg(QString::number(v.x(), 'f', dec))
2880 .arg(QString::number(v.y(), 'f', dec)));
2881}
2882
2883/*!
2884 \fn void QtPointFPropertyManager::setValue(QtProperty *property, const QPointF &value)
2885
2886 Sets the value of the given \a property to \a value. Nested
2887 properties are updated automatically.
2888
2889 \sa value(), valueChanged()
2890*/
2891void QtPointFPropertyManager::setValue(QtProperty *property, const QPointF &val)
2892{
2893 const QtPointFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
2894 if (it == d_ptr->m_values.end())
2895 return;
2896
2897 if (it.value().val == val)
2898 return;
2899
2900 it.value().val = val;
2901 d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToX[property], val.x());
2902 d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToY[property], val.y());
2903
2904 emit propertyChanged(property);
2905 emit valueChanged(property, val);
2906}
2907
2908/*!
2909 \fn void QtPointFPropertyManager::setDecimals(QtProperty *property, int prec)
2910
2911 Sets the precision of the given \a property to \a prec.
2912
2913 The valid decimal range is 0-13. The default is 2.
2914
2915 \sa decimals()
2916*/
2917void QtPointFPropertyManager::setDecimals(QtProperty *property, int prec)
2918{
2919 const QtPointFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
2920 if (it == d_ptr->m_values.end())
2921 return;
2922
2923 QtPointFPropertyManagerPrivate::Data data = it.value();
2924
2925 if (prec > 13)
2926 prec = 13;
2927 else if (prec < 0)
2928 prec = 0;
2929
2930 if (data.decimals == prec)
2931 return;
2932
2933 data.decimals = prec;
2934 d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToX[property], prec);
2935 d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToY[property], prec);
2936
2937 it.value() = data;
2938
2939 emit decimalsChanged(property, data.decimals);
2940}
2941
2942/*!
2943 \reimp
2944*/
2945void QtPointFPropertyManager::initializeProperty(QtProperty *property)
2946{
2947 d_ptr->m_values[property] = QtPointFPropertyManagerPrivate::Data();
2948
2949 QtProperty *xProp = d_ptr->m_doublePropertyManager->addProperty();
2950 xProp->setPropertyName(tr("X"));
2951 d_ptr->m_doublePropertyManager->setDecimals(xProp, decimals(property));
2952 d_ptr->m_doublePropertyManager->setValue(xProp, 0);
2953 d_ptr->m_propertyToX[property] = xProp;
2954 d_ptr->m_xToProperty[xProp] = property;
2955 property->addSubProperty(xProp);
2956
2957 QtProperty *yProp = d_ptr->m_doublePropertyManager->addProperty();
2958 yProp->setPropertyName(tr("Y"));
2959 d_ptr->m_doublePropertyManager->setDecimals(yProp, decimals(property));
2960 d_ptr->m_doublePropertyManager->setValue(yProp, 0);
2961 d_ptr->m_propertyToY[property] = yProp;
2962 d_ptr->m_yToProperty[yProp] = property;
2963 property->addSubProperty(yProp);
2964}
2965
2966/*!
2967 \reimp
2968*/
2969void QtPointFPropertyManager::uninitializeProperty(QtProperty *property)
2970{
2971 QtProperty *xProp = d_ptr->m_propertyToX[property];
2972 if (xProp) {
2973 d_ptr->m_xToProperty.remove(xProp);
2974 delete xProp;
2975 }
2976 d_ptr->m_propertyToX.remove(property);
2977
2978 QtProperty *yProp = d_ptr->m_propertyToY[property];
2979 if (yProp) {
2980 d_ptr->m_yToProperty.remove(yProp);
2981 delete yProp;
2982 }
2983 d_ptr->m_propertyToY.remove(property);
2984
2985 d_ptr->m_values.remove(property);
2986}
2987
2988// QtSizePropertyManager
2989
2990class QtSizePropertyManagerPrivate
2991{
2992 QtSizePropertyManager *q_ptr;
2993 Q_DECLARE_PUBLIC(QtSizePropertyManager)
2994public:
2995
2996 void slotIntChanged(QtProperty *property, int value);
2997 void slotPropertyDestroyed(QtProperty *property);
2998 void setValue(QtProperty *property, const QSize &val);
2999 void setRange(QtProperty *property,
3000 const QSize &minVal, const QSize &maxVal, const QSize &val);
3001
3002 struct Data
3003 {
3004 Data() : val(QSize(0, 0)), minVal(QSize(0, 0)), maxVal(QSize(INT_MAX, INT_MAX)) {}
3005 QSize val;
3006 QSize minVal;
3007 QSize maxVal;
3008 QSize minimumValue() const { return minVal; }
3009 QSize maximumValue() const { return maxVal; }
3010 void setMinimumValue(const QSize &newMinVal) { setSizeMinimumData(this, newMinVal); }
3011 void setMaximumValue(const QSize &newMaxVal) { setSizeMaximumData(this, newMaxVal); }
3012 };
3013
3014 typedef QMap<const QtProperty *, Data> PropertyValueMap;
3015 PropertyValueMap m_values;
3016
3017 QtIntPropertyManager *m_intPropertyManager;
3018
3019 QMap<const QtProperty *, QtProperty *> m_propertyToW;
3020 QMap<const QtProperty *, QtProperty *> m_propertyToH;
3021
3022 QMap<const QtProperty *, QtProperty *> m_wToProperty;
3023 QMap<const QtProperty *, QtProperty *> m_hToProperty;
3024};
3025
3026void QtSizePropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
3027{
3028 if (QtProperty *prop = m_wToProperty.value(property, 0)) {
3029 QSize s = m_values[prop].val;
3030 s.setWidth(value);
3031 q_ptr->setValue(prop, s);
3032 } else if (QtProperty *prop = m_hToProperty.value(property, 0)) {
3033 QSize s = m_values[prop].val;
3034 s.setHeight(value);
3035 q_ptr->setValue(prop, s);
3036 }
3037}
3038
3039void QtSizePropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
3040{
3041 if (QtProperty *pointProp = m_wToProperty.value(property, 0)) {
3042 m_propertyToW[pointProp] = 0;
3043 m_wToProperty.remove(property);
3044 } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) {
3045 m_propertyToH[pointProp] = 0;
3046 m_hToProperty.remove(property);
3047 }
3048}
3049
3050void QtSizePropertyManagerPrivate::setValue(QtProperty *property, const QSize &val)
3051{
3052 m_intPropertyManager->setValue(m_propertyToW.value(property), val.width());
3053 m_intPropertyManager->setValue(m_propertyToH.value(property), val.height());
3054}
3055
3056void QtSizePropertyManagerPrivate::setRange(QtProperty *property,
3057 const QSize &minVal, const QSize &maxVal, const QSize &val)
3058{
3059 QtProperty *wProperty = m_propertyToW.value(property);
3060 QtProperty *hProperty = m_propertyToH.value(property);
3061 m_intPropertyManager->setRange(wProperty, minVal.width(), maxVal.width());
3062 m_intPropertyManager->setValue(wProperty, val.width());
3063 m_intPropertyManager->setRange(hProperty, minVal.height(), maxVal.height());
3064 m_intPropertyManager->setValue(hProperty, val.height());
3065}
3066
3067/*!
3068 \class QtSizePropertyManager
3069 \internal
3070 \inmodule QtDesigner
3071 \since 4.4
3072
3073 \brief The QtSizePropertyManager provides and manages QSize properties.
3074
3075 A size property has nested \e width and \e height
3076 subproperties. The top-level property's value can be retrieved
3077 using the value() function, and set using the setValue() slot.
3078
3079 The subproperties are created by a QtIntPropertyManager object. This
3080 manager can be retrieved using the subIntPropertyManager() function. In
3081 order to provide editing widgets for the subproperties in a
3082 property browser widget, this manager must be associated with an
3083 editor factory.
3084
3085 A size property also has a range of valid values defined by a
3086 minimum size and a maximum size. These sizes can be retrieved
3087 using the minimum() and the maximum() functions, and set using the
3088 setMinimum() and setMaximum() slots. Alternatively, the range can
3089 be defined in one go using the setRange() slot.
3090
3091 In addition, QtSizePropertyManager provides the valueChanged() signal
3092 which is emitted whenever a property created by this manager
3093 changes, and the rangeChanged() signal which is emitted whenever
3094 such a property changes its range of valid sizes.
3095
3096 \sa QtAbstractPropertyManager, QtIntPropertyManager, QtSizeFPropertyManager
3097*/
3098
3099/*!
3100 \fn void QtSizePropertyManager::valueChanged(QtProperty *property, const QSize &value)
3101
3102 This signal is emitted whenever a property created by this manager
3103 changes its value, passing a pointer to the \a property and the new
3104 \a value as parameters.
3105
3106 \sa setValue()
3107*/
3108
3109/*!
3110 \fn void QtSizePropertyManager::rangeChanged(QtProperty *property, const QSize &minimum, const QSize &maximum)
3111
3112 This signal is emitted whenever a property created by this manager
3113 changes its range of valid sizes, passing a pointer to the \a
3114 property and the new \a minimum and \a maximum sizes.
3115
3116 \sa setRange()
3117*/
3118
3119/*!
3120 Creates a manager with the given \a parent.
3121*/
3122QtSizePropertyManager::QtSizePropertyManager(QObject *parent)
3123 : QtAbstractPropertyManager(parent), d_ptr(new QtSizePropertyManagerPrivate)
3124{
3125 d_ptr->q_ptr = this;
3126
3127 d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
3128 connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
3129 this, SLOT(slotIntChanged(QtProperty*,int)));
3130 connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
3131 this, SLOT(slotPropertyDestroyed(QtProperty*)));
3132}
3133
3134/*!
3135 Destroys this manager, and all the properties it has created.
3136*/
3137QtSizePropertyManager::~QtSizePropertyManager()
3138{
3139 clear();
3140}
3141
3142/*!
3143 Returns the manager that creates the nested \e width and \e height
3144 subproperties.
3145
3146 In order to provide editing widgets for the \e width and \e height
3147 properties in a property browser widget, this manager must be
3148 associated with an editor factory.
3149
3150 \sa QtAbstractPropertyBrowser::setFactoryForManager()
3151*/
3152QtIntPropertyManager *QtSizePropertyManager::subIntPropertyManager() const
3153{
3154 return d_ptr->m_intPropertyManager;
3155}
3156
3157/*!
3158 Returns the given \a property's value.
3159
3160 If the given \a property is not managed by this manager, this
3161 function returns an invalid size
3162
3163 \sa setValue()
3164*/
3165QSize QtSizePropertyManager::value(const QtProperty *property) const
3166{
3167 return getValue<QSize>(d_ptr->m_values, property);
3168}
3169
3170/*!
3171 Returns the given \a property's minimum size value.
3172
3173 \sa setMinimum(), maximum(), setRange()
3174*/
3175QSize QtSizePropertyManager::minimum(const QtProperty *property) const
3176{
3177 return getMinimum<QSize>(d_ptr->m_values, property);
3178}
3179
3180/*!
3181 Returns the given \a property's maximum size value.
3182
3183 \sa setMaximum(), minimum(), setRange()
3184*/
3185QSize QtSizePropertyManager::maximum(const QtProperty *property) const
3186{
3187 return getMaximum<QSize>(d_ptr->m_values, property);
3188}
3189
3190/*!
3191 \reimp
3192*/
3193QString QtSizePropertyManager::valueText(const QtProperty *property) const
3194{
3195 const QtSizePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
3196 if (it == d_ptr->m_values.constEnd())
3197 return QString();
3198 const QSize v = it.value().val;
3199 return QString(tr("%1 x %2").arg(QString::number(v.width()))
3200 .arg(QString::number(v.height())));
3201}
3202
3203/*!
3204 \fn void QtSizePropertyManager::setValue(QtProperty *property, const QSize &value)
3205
3206 Sets the value of the given \a property to \a value.
3207
3208 If the specified \a value is not valid according to the given \a
3209 property's size range, the \a value is adjusted to the nearest
3210 valid value within the size range.
3211
3212 \sa value(), setRange(), valueChanged()
3213*/
3214void QtSizePropertyManager::setValue(QtProperty *property, const QSize &val)
3215{
3216 setValueInRange<const QSize &, QtSizePropertyManagerPrivate, QtSizePropertyManager, const QSize>(this, d_ptr.data(),
3217 &QtSizePropertyManager::propertyChanged,
3218 &QtSizePropertyManager::valueChanged,
3219 property, val, &QtSizePropertyManagerPrivate::setValue);
3220}
3221
3222/*!
3223 Sets the minimum size value for the given \a property to \a minVal.
3224
3225 When setting the minimum size value, the maximum and current
3226 values are adjusted if necessary (ensuring that the size range
3227 remains valid and that the current value is within the range).
3228
3229 \sa minimum(), setRange(), rangeChanged()
3230*/
3231void QtSizePropertyManager::setMinimum(QtProperty *property, const QSize &minVal)
3232{
3233 setBorderValue<const QSize &, QtSizePropertyManagerPrivate, QtSizePropertyManager, QSize, QtSizePropertyManagerPrivate::Data>(this, d_ptr.data(),
3234 &QtSizePropertyManager::propertyChanged,
3235 &QtSizePropertyManager::valueChanged,
3236 &QtSizePropertyManager::rangeChanged,
3237 property,
3238 &QtSizePropertyManagerPrivate::Data::minimumValue,
3239 &QtSizePropertyManagerPrivate::Data::setMinimumValue,
3240 minVal, &QtSizePropertyManagerPrivate::setRange);
3241}
3242
3243/*!
3244 Sets the maximum size value for the given \a property to \a maxVal.
3245
3246 When setting the maximum size value, the minimum and current
3247 values are adjusted if necessary (ensuring that the size range
3248 remains valid and that the current value is within the range).
3249
3250 \sa maximum(), setRange(), rangeChanged()
3251*/
3252void QtSizePropertyManager::setMaximum(QtProperty *property, const QSize &maxVal)
3253{
3254 setBorderValue<const QSize &, QtSizePropertyManagerPrivate, QtSizePropertyManager, QSize, QtSizePropertyManagerPrivate::Data>(this, d_ptr.data(),
3255 &QtSizePropertyManager::propertyChanged,
3256 &QtSizePropertyManager::valueChanged,
3257 &QtSizePropertyManager::rangeChanged,
3258 property,
3259 &QtSizePropertyManagerPrivate::Data::maximumValue,
3260 &QtSizePropertyManagerPrivate::Data::setMaximumValue,
3261 maxVal, &QtSizePropertyManagerPrivate::setRange);
3262}
3263
3264/*!
3265 \fn void QtSizePropertyManager::setRange(QtProperty *property, const QSize &minimum, const QSize &maximum)
3266
3267 Sets the range of valid values.
3268
3269 This is a convenience function defining the range of valid values
3270 in one go; setting the \a minimum and \a maximum values for the
3271 given \a property with a single function call.
3272
3273 When setting a new range, the current value is adjusted if
3274 necessary (ensuring that the value remains within the range).
3275
3276 \sa setMinimum(), setMaximum(), rangeChanged()
3277*/
3278void QtSizePropertyManager::setRange(QtProperty *property, const QSize &minVal, const QSize &maxVal)
3279{
3280 setBorderValues<const QSize &, QtSizePropertyManagerPrivate, QtSizePropertyManager, QSize>(this, d_ptr.data(),
3281 &QtSizePropertyManager::propertyChanged,
3282 &QtSizePropertyManager::valueChanged,
3283 &QtSizePropertyManager::rangeChanged,
3284 property, minVal, maxVal, &QtSizePropertyManagerPrivate::setRange);
3285}
3286
3287/*!
3288 \reimp
3289*/
3290void QtSizePropertyManager::initializeProperty(QtProperty *property)
3291{
3292 d_ptr->m_values[property] = QtSizePropertyManagerPrivate::Data();
3293
3294 QtProperty *wProp = d_ptr->m_intPropertyManager->addProperty();
3295 wProp->setPropertyName(tr("Width"));
3296 d_ptr->m_intPropertyManager->setValue(wProp, 0);
3297 d_ptr->m_intPropertyManager->setMinimum(wProp, 0);
3298 d_ptr->m_propertyToW[property] = wProp;
3299 d_ptr->m_wToProperty[wProp] = property;
3300 property->addSubProperty(wProp);
3301
3302 QtProperty *hProp = d_ptr->m_intPropertyManager->addProperty();
3303 hProp->setPropertyName(tr("Height"));
3304 d_ptr->m_intPropertyManager->setValue(hProp, 0);
3305 d_ptr->m_intPropertyManager->setMinimum(hProp, 0);
3306 d_ptr->m_propertyToH[property] = hProp;
3307 d_ptr->m_hToProperty[hProp] = property;
3308 property->addSubProperty(hProp);
3309}
3310
3311/*!
3312 \reimp
3313*/
3314void QtSizePropertyManager::uninitializeProperty(QtProperty *property)
3315{
3316 QtProperty *wProp = d_ptr->m_propertyToW[property];
3317 if (wProp) {
3318 d_ptr->m_wToProperty.remove(wProp);
3319 delete wProp;
3320 }
3321 d_ptr->m_propertyToW.remove(property);
3322
3323 QtProperty *hProp = d_ptr->m_propertyToH[property];
3324 if (hProp) {
3325 d_ptr->m_hToProperty.remove(hProp);
3326 delete hProp;
3327 }
3328 d_ptr->m_propertyToH.remove(property);
3329
3330 d_ptr->m_values.remove(property);
3331}
3332
3333// QtSizeFPropertyManager
3334
3335class QtSizeFPropertyManagerPrivate
3336{
3337 QtSizeFPropertyManager *q_ptr;
3338 Q_DECLARE_PUBLIC(QtSizeFPropertyManager)
3339public:
3340
3341 void slotDoubleChanged(QtProperty *property, double value);
3342 void slotPropertyDestroyed(QtProperty *property);
3343 void setValue(QtProperty *property, const QSizeF &val);
3344 void setRange(QtProperty *property,
3345 const QSizeF &minVal, const QSizeF &maxVal, const QSizeF &val);
3346
3347 struct Data
3348 {
3349 Data() : val(QSizeF(0, 0)), minVal(QSizeF(0, 0)), maxVal(QSizeF(INT_MAX, INT_MAX)), decimals(2) {}
3350 QSizeF val;
3351 QSizeF minVal;
3352 QSizeF maxVal;
3353 int decimals;
3354 QSizeF minimumValue() const { return minVal; }
3355 QSizeF maximumValue() const { return maxVal; }
3356 void setMinimumValue(const QSizeF &newMinVal) { setSizeMinimumData(this, newMinVal); }
3357 void setMaximumValue(const QSizeF &newMaxVal) { setSizeMaximumData(this, newMaxVal); }
3358 };
3359
3360 typedef QMap<const QtProperty *, Data> PropertyValueMap;
3361 PropertyValueMap m_values;
3362
3363 QtDoublePropertyManager *m_doublePropertyManager;
3364
3365 QMap<const QtProperty *, QtProperty *> m_propertyToW;
3366 QMap<const QtProperty *, QtProperty *> m_propertyToH;
3367
3368 QMap<const QtProperty *, QtProperty *> m_wToProperty;
3369 QMap<const QtProperty *, QtProperty *> m_hToProperty;
3370};
3371
3372void QtSizeFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value)
3373{
3374 if (QtProperty *prop = m_wToProperty.value(property, 0)) {
3375 QSizeF s = m_values[prop].val;
3376 s.setWidth(value);
3377 q_ptr->setValue(prop, s);
3378 } else if (QtProperty *prop = m_hToProperty.value(property, 0)) {
3379 QSizeF s = m_values[prop].val;
3380 s.setHeight(value);
3381 q_ptr->setValue(prop, s);
3382 }
3383}
3384
3385void QtSizeFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
3386{
3387 if (QtProperty *pointProp = m_wToProperty.value(property, 0)) {
3388 m_propertyToW[pointProp] = 0;
3389 m_wToProperty.remove(property);
3390 } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) {
3391 m_propertyToH[pointProp] = 0;
3392 m_hToProperty.remove(property);
3393 }
3394}
3395
3396void QtSizeFPropertyManagerPrivate::setValue(QtProperty *property, const QSizeF &val)
3397{
3398 m_doublePropertyManager->setValue(m_propertyToW.value(property), val.width());
3399 m_doublePropertyManager->setValue(m_propertyToH.value(property), val.height());
3400}
3401
3402void QtSizeFPropertyManagerPrivate::setRange(QtProperty *property,
3403 const QSizeF &minVal, const QSizeF &maxVal, const QSizeF &val)
3404{
3405 m_doublePropertyManager->setRange(m_propertyToW[property], minVal.width(), maxVal.width());
3406 m_doublePropertyManager->setValue(m_propertyToW[property], val.width());
3407 m_doublePropertyManager->setRange(m_propertyToH[property], minVal.height(), maxVal.height());
3408 m_doublePropertyManager->setValue(m_propertyToH[property], val.height());
3409}
3410
3411/*!
3412 \class QtSizeFPropertyManager
3413 \internal
3414 \inmodule QtDesigner
3415 \since 4.4
3416
3417 \brief The QtSizeFPropertyManager provides and manages QSizeF properties.
3418
3419 A size property has nested \e width and \e height
3420 subproperties. The top-level property's value can be retrieved
3421 using the value() function, and set using the setValue() slot.
3422
3423 The subproperties are created by a QtDoublePropertyManager object. This
3424 manager can be retrieved using the subDoublePropertyManager() function. In
3425 order to provide editing widgets for the subproperties in a
3426 property browser widget, this manager must be associated with an
3427 editor factory.
3428
3429 A size property also has a range of valid values defined by a
3430 minimum size and a maximum size. These sizes can be retrieved
3431 using the minimum() and the maximum() functions, and set using the
3432 setMinimum() and setMaximum() slots. Alternatively, the range can
3433 be defined in one go using the setRange() slot.
3434
3435 In addition, QtSizeFPropertyManager provides the valueChanged() signal
3436 which is emitted whenever a property created by this manager
3437 changes, and the rangeChanged() signal which is emitted whenever
3438 such a property changes its range of valid sizes.
3439
3440 \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtSizePropertyManager
3441*/
3442
3443/*!
3444 \fn void QtSizeFPropertyManager::valueChanged(QtProperty *property, const QSizeF &value)
3445
3446 This signal is emitted whenever a property created by this manager
3447 changes its value, passing a pointer to the \a property and the new
3448 \a value as parameters.
3449
3450 \sa setValue()
3451*/
3452
3453/*!
3454 \fn void QtSizeFPropertyManager::rangeChanged(QtProperty *property, const QSizeF &minimum, const QSizeF &maximum)
3455
3456 This signal is emitted whenever a property created by this manager
3457 changes its range of valid sizes, passing a pointer to the \a
3458 property and the new \a minimum and \a maximum sizes.
3459
3460 \sa setRange()
3461*/
3462
3463/*!
3464 \fn void QtSizeFPropertyManager::decimalsChanged(QtProperty *property, int prec)
3465
3466 This signal is emitted whenever a property created by this manager
3467 changes its precision of value, passing a pointer to the
3468 \a property and the new \a prec value
3469
3470 \sa setDecimals()
3471*/
3472
3473/*!
3474 Creates a manager with the given \a parent.
3475*/
3476QtSizeFPropertyManager::QtSizeFPropertyManager(QObject *parent)
3477 : QtAbstractPropertyManager(parent), d_ptr(new QtSizeFPropertyManagerPrivate)
3478{
3479 d_ptr->q_ptr = this;
3480
3481 d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this);
3482 connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty*,double)),
3483 this, SLOT(slotDoubleChanged(QtProperty*,double)));
3484 connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
3485 this, SLOT(slotPropertyDestroyed(QtProperty*)));
3486}
3487
3488/*!
3489 Destroys this manager, and all the properties it has created.
3490*/
3491QtSizeFPropertyManager::~QtSizeFPropertyManager()
3492{
3493 clear();
3494}
3495
3496/*!
3497 Returns the manager that creates the nested \e width and \e height
3498 subproperties.
3499
3500 In order to provide editing widgets for the \e width and \e height
3501 properties in a property browser widget, this manager must be
3502 associated with an editor factory.
3503
3504 \sa QtAbstractPropertyBrowser::setFactoryForManager()
3505*/
3506QtDoublePropertyManager *QtSizeFPropertyManager::subDoublePropertyManager() const
3507{
3508 return d_ptr->m_doublePropertyManager;
3509}
3510
3511/*!
3512 Returns the given \a property's value.
3513
3514 If the given \a property is not managed by this manager, this
3515 function returns an invalid size
3516
3517 \sa setValue()
3518*/
3519QSizeF QtSizeFPropertyManager::value(const QtProperty *property) const
3520{
3521 return getValue<QSizeF>(d_ptr->m_values, property);
3522}
3523
3524/*!
3525 Returns the given \a property's precision, in decimals.
3526
3527 \sa setDecimals()
3528*/
3529int QtSizeFPropertyManager::decimals(const QtProperty *property) const
3530{
3531 return getData<int>(d_ptr->m_values, &QtSizeFPropertyManagerPrivate::Data::decimals, property, 0);
3532}
3533
3534/*!
3535 Returns the given \a property's minimum size value.
3536
3537 \sa setMinimum(), maximum(), setRange()
3538*/
3539QSizeF QtSizeFPropertyManager::minimum(const QtProperty *property) const
3540{
3541 return getMinimum<QSizeF>(d_ptr->m_values, property);
3542}
3543
3544/*!
3545 Returns the given \a property's maximum size value.
3546
3547 \sa setMaximum(), minimum(), setRange()
3548*/
3549QSizeF QtSizeFPropertyManager::maximum(const QtProperty *property) const
3550{
3551 return getMaximum<QSizeF>(d_ptr->m_values, property);
3552}
3553
3554/*!
3555 \reimp
3556*/
3557QString QtSizeFPropertyManager::valueText(const QtProperty *property) const
3558{
3559 const QtSizeFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
3560 if (it == d_ptr->m_values.constEnd())
3561 return QString();
3562 const QSizeF v = it.value().val;
3563 const int dec = it.value().decimals;
3564 return QString(tr("%1 x %2").arg(QString::number(v.width(), 'f', dec))
3565 .arg(QString::number(v.height(), 'f', dec)));
3566}
3567
3568/*!
3569 \fn void QtSizeFPropertyManager::setValue(QtProperty *property, const QSizeF &value)
3570
3571 Sets the value of the given \a property to \a value.
3572
3573 If the specified \a value is not valid according to the given \a
3574 property's size range, the \a value is adjusted to the nearest
3575 valid value within the size range.
3576
3577 \sa value(), setRange(), valueChanged()
3578*/
3579void QtSizeFPropertyManager::setValue(QtProperty *property, const QSizeF &val)
3580{
3581 setValueInRange<const QSizeF &, QtSizeFPropertyManagerPrivate, QtSizeFPropertyManager, QSizeF>(this, d_ptr.data(),
3582 &QtSizeFPropertyManager::propertyChanged,
3583 &QtSizeFPropertyManager::valueChanged,
3584 property, val, &QtSizeFPropertyManagerPrivate::setValue);
3585}
3586
3587/*!
3588 \fn void QtSizeFPropertyManager::setDecimals(QtProperty *property, int prec)
3589
3590 Sets the precision of the given \a property to \a prec.
3591
3592 The valid decimal range is 0-13. The default is 2.
3593
3594 \sa decimals()
3595*/
3596void QtSizeFPropertyManager::setDecimals(QtProperty *property, int prec)
3597{
3598 const QtSizeFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
3599 if (it == d_ptr->m_values.end())
3600 return;
3601
3602 QtSizeFPropertyManagerPrivate::Data data = it.value();
3603
3604 if (prec > 13)
3605 prec = 13;
3606 else if (prec < 0)
3607 prec = 0;
3608
3609 if (data.decimals == prec)
3610 return;
3611
3612 data.decimals = prec;
3613 d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToW[property], prec);
3614 d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToH[property], prec);
3615
3616 it.value() = data;
3617
3618 emit decimalsChanged(property, data.decimals);
3619}
3620
3621/*!
3622 Sets the minimum size value for the given \a property to \a minVal.
3623
3624 When setting the minimum size value, the maximum and current
3625 values are adjusted if necessary (ensuring that the size range
3626 remains valid and that the current value is within the range).
3627
3628 \sa minimum(), setRange(), rangeChanged()
3629*/
3630void QtSizeFPropertyManager::setMinimum(QtProperty *property, const QSizeF &minVal)
3631{
3632 setBorderValue<const QSizeF &, QtSizeFPropertyManagerPrivate, QtSizeFPropertyManager, QSizeF, QtSizeFPropertyManagerPrivate::Data>(this, d_ptr.data(),
3633 &QtSizeFPropertyManager::propertyChanged,
3634 &QtSizeFPropertyManager::valueChanged,
3635 &QtSizeFPropertyManager::rangeChanged,
3636 property,
3637 &QtSizeFPropertyManagerPrivate::Data::minimumValue,
3638 &QtSizeFPropertyManagerPrivate::Data::setMinimumValue,
3639 minVal, &QtSizeFPropertyManagerPrivate::setRange);
3640}
3641
3642/*!
3643 Sets the maximum size value for the given \a property to \a maxVal.
3644
3645 When setting the maximum size value, the minimum and current
3646 values are adjusted if necessary (ensuring that the size range
3647 remains valid and that the current value is within the range).
3648
3649 \sa maximum(), setRange(), rangeChanged()
3650*/
3651void QtSizeFPropertyManager::setMaximum(QtProperty *property, const QSizeF &maxVal)
3652{
3653 setBorderValue<const QSizeF &, QtSizeFPropertyManagerPrivate, QtSizeFPropertyManager, QSizeF, QtSizeFPropertyManagerPrivate::Data>(this, d_ptr.data(),
3654 &QtSizeFPropertyManager::propertyChanged,
3655 &QtSizeFPropertyManager::valueChanged,
3656 &QtSizeFPropertyManager::rangeChanged,
3657 property,
3658 &QtSizeFPropertyManagerPrivate::Data::maximumValue,
3659 &QtSizeFPropertyManagerPrivate::Data::setMaximumValue,
3660 maxVal, &QtSizeFPropertyManagerPrivate::setRange);
3661}
3662
3663/*!
3664 \fn void QtSizeFPropertyManager::setRange(QtProperty *property, const QSizeF &minimum, const QSizeF &maximum)
3665
3666 Sets the range of valid values.
3667
3668 This is a convenience function defining the range of valid values
3669 in one go; setting the \a minimum and \a maximum values for the
3670 given \a property with a single function call.
3671
3672 When setting a new range, the current value is adjusted if
3673 necessary (ensuring that the value remains within the range).
3674
3675 \sa setMinimum(), setMaximum(), rangeChanged()
3676*/
3677void QtSizeFPropertyManager::setRange(QtProperty *property, const QSizeF &minVal, const QSizeF &maxVal)
3678{
3679 setBorderValues<const QSizeF &, QtSizeFPropertyManagerPrivate, QtSizeFPropertyManager, QSizeF>(this, d_ptr.data(),
3680 &QtSizeFPropertyManager::propertyChanged,
3681 &QtSizeFPropertyManager::valueChanged,
3682 &QtSizeFPropertyManager::rangeChanged,
3683 property, minVal, maxVal, &QtSizeFPropertyManagerPrivate::setRange);
3684}
3685
3686/*!
3687 \reimp
3688*/
3689void QtSizeFPropertyManager::initializeProperty(QtProperty *property)
3690{
3691 d_ptr->m_values[property] = QtSizeFPropertyManagerPrivate::Data();
3692
3693 QtProperty *wProp = d_ptr->m_doublePropertyManager->addProperty();
3694 wProp->setPropertyName(tr("Width"));
3695 d_ptr->m_doublePropertyManager->setDecimals(wProp, decimals(property));
3696 d_ptr->m_doublePropertyManager->setValue(wProp, 0);
3697 d_ptr->m_doublePropertyManager->setMinimum(wProp, 0);
3698 d_ptr->m_propertyToW[property] = wProp;
3699 d_ptr->m_wToProperty[wProp] = property;
3700 property->addSubProperty(wProp);
3701
3702 QtProperty *hProp = d_ptr->m_doublePropertyManager->addProperty();
3703 hProp->setPropertyName(tr("Height"));
3704 d_ptr->m_doublePropertyManager->setDecimals(hProp, decimals(property));
3705 d_ptr->m_doublePropertyManager->setValue(hProp, 0);
3706 d_ptr->m_doublePropertyManager->setMinimum(hProp, 0);
3707 d_ptr->m_propertyToH[property] = hProp;
3708 d_ptr->m_hToProperty[hProp] = property;
3709 property->addSubProperty(hProp);
3710}
3711
3712/*!
3713 \reimp
3714*/
3715void QtSizeFPropertyManager::uninitializeProperty(QtProperty *property)
3716{
3717 QtProperty *wProp = d_ptr->m_propertyToW[property];
3718 if (wProp) {
3719 d_ptr->m_wToProperty.remove(wProp);
3720 delete wProp;
3721 }
3722 d_ptr->m_propertyToW.remove(property);
3723
3724 QtProperty *hProp = d_ptr->m_propertyToH[property];
3725 if (hProp) {
3726 d_ptr->m_hToProperty.remove(hProp);
3727 delete hProp;
3728 }
3729 d_ptr->m_propertyToH.remove(property);
3730
3731 d_ptr->m_values.remove(property);
3732}
3733
3734// QtRectPropertyManager
3735
3736class QtRectPropertyManagerPrivate
3737{
3738 QtRectPropertyManager *q_ptr;
3739 Q_DECLARE_PUBLIC(QtRectPropertyManager)
3740public:
3741
3742 void slotIntChanged(QtProperty *property, int value);
3743 void slotPropertyDestroyed(QtProperty *property);
3744 void setConstraint(QtProperty *property, const QRect &constraint, const QRect &val);
3745
3746 struct Data
3747 {
3748 Data() : val(0, 0, 0, 0) {}
3749 QRect val;
3750 QRect constraint;
3751 };
3752
3753 typedef QMap<const QtProperty *, Data> PropertyValueMap;
3754 PropertyValueMap m_values;
3755
3756 QtIntPropertyManager *m_intPropertyManager;
3757
3758 QMap<const QtProperty *, QtProperty *> m_propertyToX;
3759 QMap<const QtProperty *, QtProperty *> m_propertyToY;
3760 QMap<const QtProperty *, QtProperty *> m_propertyToW;
3761 QMap<const QtProperty *, QtProperty *> m_propertyToH;
3762
3763 QMap<const QtProperty *, QtProperty *> m_xToProperty;
3764 QMap<const QtProperty *, QtProperty *> m_yToProperty;
3765 QMap<const QtProperty *, QtProperty *> m_wToProperty;
3766 QMap<const QtProperty *, QtProperty *> m_hToProperty;
3767};
3768
3769void QtRectPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
3770{
3771 if (QtProperty *prop = m_xToProperty.value(property, 0)) {
3772 QRect r = m_values[prop].val;
3773 r.moveLeft(value);
3774 q_ptr->setValue(prop, r);
3775 } else if (QtProperty *prop = m_yToProperty.value(property)) {
3776 QRect r = m_values[prop].val;
3777 r.moveTop(value);
3778 q_ptr->setValue(prop, r);
3779 } else if (QtProperty *prop = m_wToProperty.value(property, 0)) {
3780 Data data = m_values[prop];
3781 QRect r = data.val;
3782 r.setWidth(value);
3783 if (!data.constraint.isNull() && data.constraint.x() + data.constraint.width() < r.x() + r.width()) {
3784 r.moveLeft(data.constraint.left() + data.constraint.width() - r.width());
3785 }
3786 q_ptr->setValue(prop, r);
3787 } else if (QtProperty *prop = m_hToProperty.value(property, 0)) {
3788 Data data = m_values[prop];
3789 QRect r = data.val;
3790 r.setHeight(value);
3791 if (!data.constraint.isNull() && data.constraint.y() + data.constraint.height() < r.y() + r.height()) {
3792 r.moveTop(data.constraint.top() + data.constraint.height() - r.height());
3793 }
3794 q_ptr->setValue(prop, r);
3795 }
3796}
3797
3798void QtRectPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
3799{
3800 if (QtProperty *pointProp = m_xToProperty.value(property, 0)) {
3801 m_propertyToX[pointProp] = 0;
3802 m_xToProperty.remove(property);
3803 } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) {
3804 m_propertyToY[pointProp] = 0;
3805 m_yToProperty.remove(property);
3806 } else if (QtProperty *pointProp = m_wToProperty.value(property, 0)) {
3807 m_propertyToW[pointProp] = 0;
3808 m_wToProperty.remove(property);
3809 } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) {
3810 m_propertyToH[pointProp] = 0;
3811 m_hToProperty.remove(property);
3812 }
3813}
3814
3815void QtRectPropertyManagerPrivate::setConstraint(QtProperty *property,
3816 const QRect &constraint, const QRect &val)
3817{
3818 const bool isNull = constraint.isNull();
3819 const int left = isNull ? INT_MIN : constraint.left();
3820 const int right = isNull ? INT_MAX : constraint.left() + constraint.width();
3821 const int top = isNull ? INT_MIN : constraint.top();
3822 const int bottom = isNull ? INT_MAX : constraint.top() + constraint.height();
3823 const int width = isNull ? INT_MAX : constraint.width();
3824 const int height = isNull ? INT_MAX : constraint.height();
3825
3826 m_intPropertyManager->setRange(m_propertyToX[property], left, right);
3827 m_intPropertyManager->setRange(m_propertyToY[property], top, bottom);
3828 m_intPropertyManager->setRange(m_propertyToW[property], 0, width);
3829 m_intPropertyManager->setRange(m_propertyToH[property], 0, height);
3830
3831 m_intPropertyManager->setValue(m_propertyToX[property], val.x());
3832 m_intPropertyManager->setValue(m_propertyToY[property], val.y());
3833 m_intPropertyManager->setValue(m_propertyToW[property], val.width());
3834 m_intPropertyManager->setValue(m_propertyToH[property], val.height());
3835}
3836
3837/*!
3838 \class QtRectPropertyManager
3839 \internal
3840 \inmodule QtDesigner
3841 \since 4.4
3842
3843 \brief The QtRectPropertyManager provides and manages QRect properties.
3844
3845 A rectangle property has nested \e x, \e y, \e width and \e height
3846 subproperties. The top-level property's value can be retrieved
3847 using the value() function, and set using the setValue() slot.
3848
3849 The subproperties are created by a QtIntPropertyManager object. This
3850 manager can be retrieved using the subIntPropertyManager() function. In
3851 order to provide editing widgets for the subproperties in a
3852 property browser widget, this manager must be associated with an
3853 editor factory.
3854
3855 A rectangle property also has a constraint rectangle which can be
3856 retrieved using the constraint() function, and set using the
3857 setConstraint() slot.
3858
3859 In addition, QtRectPropertyManager provides the valueChanged() signal
3860 which is emitted whenever a property created by this manager
3861 changes, and the constraintChanged() signal which is emitted
3862 whenever such a property changes its constraint rectangle.
3863
3864 \sa QtAbstractPropertyManager, QtIntPropertyManager, QtRectFPropertyManager
3865*/
3866
3867/*!
3868 \fn void QtRectPropertyManager::valueChanged(QtProperty *property, const QRect &value)
3869
3870 This signal is emitted whenever a property created by this manager
3871 changes its value, passing a pointer to the \a property and the new
3872 \a value as parameters.
3873
3874 \sa setValue()
3875*/
3876
3877/*!
3878 \fn void QtRectPropertyManager::constraintChanged(QtProperty *property, const QRect &constraint)
3879
3880 This signal is emitted whenever property changes its constraint
3881 rectangle, passing a pointer to the \a property and the new \a
3882 constraint rectangle as parameters.
3883
3884 \sa setConstraint()
3885*/
3886
3887/*!
3888 Creates a manager with the given \a parent.
3889*/
3890QtRectPropertyManager::QtRectPropertyManager(QObject *parent)
3891 : QtAbstractPropertyManager(parent), d_ptr(new QtRectPropertyManagerPrivate)
3892{
3893 d_ptr->q_ptr = this;
3894
3895 d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
3896 connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
3897 this, SLOT(slotIntChanged(QtProperty*,int)));
3898 connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
3899 this, SLOT(slotPropertyDestroyed(QtProperty*)));
3900}
3901
3902/*!
3903 Destroys this manager, and all the properties it has created.
3904*/
3905QtRectPropertyManager::~QtRectPropertyManager()
3906{
3907 clear();
3908}
3909
3910/*!
3911 Returns the manager that creates the nested \e x, \e y, \e width
3912 and \e height subproperties.
3913
3914 In order to provide editing widgets for the mentioned
3915 subproperties in a property browser widget, this manager must be
3916 associated with an editor factory.
3917
3918 \sa QtAbstractPropertyBrowser::setFactoryForManager()
3919*/
3920QtIntPropertyManager *QtRectPropertyManager::subIntPropertyManager() const
3921{
3922 return d_ptr->m_intPropertyManager;
3923}
3924
3925/*!
3926 Returns the given \a property's value.
3927
3928 If the given \a property is not managed by this manager, this
3929 function returns an invalid rectangle.
3930
3931 \sa setValue(), constraint()
3932*/
3933QRect QtRectPropertyManager::value(const QtProperty *property) const
3934{
3935 return getValue<QRect>(d_ptr->m_values, property);
3936}
3937
3938/*!
3939 Returns the given \a property's constraining rectangle. If returned value is null QRect it means there is no constraint applied.
3940
3941 \sa value(), setConstraint()
3942*/
3943QRect QtRectPropertyManager::constraint(const QtProperty *property) const
3944{
3945 return getData<QRect>(d_ptr->m_values, &QtRectPropertyManagerPrivate::Data::constraint, property, QRect());
3946}
3947
3948/*!
3949 \reimp
3950*/
3951QString QtRectPropertyManager::valueText(const QtProperty *property) const
3952{
3953 const QtRectPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
3954 if (it == d_ptr->m_values.constEnd())
3955 return QString();
3956 const QRect v = it.value().val;
3957 return QString(tr("[(%1, %2), %3 x %4]").arg(QString::number(v.x()))
3958 .arg(QString::number(v.y()))
3959 .arg(QString::number(v.width()))
3960 .arg(QString::number(v.height())));
3961}
3962
3963/*!
3964 \fn void QtRectPropertyManager::setValue(QtProperty *property, const QRect &value)
3965
3966 Sets the value of the given \a property to \a value. Nested
3967 properties are updated automatically.
3968
3969 If the specified \a value is not inside the given \a property's
3970 constraining rectangle, the value is adjusted accordingly to fit
3971 within the constraint.
3972
3973 \sa value(), setConstraint(), valueChanged()
3974*/
3975void QtRectPropertyManager::setValue(QtProperty *property, const QRect &val)
3976{
3977 const QtRectPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
3978 if (it == d_ptr->m_values.end())
3979 return;
3980
3981 QtRectPropertyManagerPrivate::Data data = it.value();
3982
3983 QRect newRect = val.normalized();
3984 if (!data.constraint.isNull() && !data.constraint.contains(newRect)) {
3985 const QRect r1 = data.constraint;
3986 const QRect r2 = newRect;
3987 newRect.setLeft(qMax(r1.left(), r2.left()));
3988 newRect.setRight(qMin(r1.right(), r2.right()));
3989 newRect.setTop(qMax(r1.top(), r2.top()));
3990 newRect.setBottom(qMin(r1.bottom(), r2.bottom()));
3991 if (newRect.width() < 0 || newRect.height() < 0)
3992 return;
3993 }
3994
3995 if (data.val == newRect)
3996 return;
3997
3998 data.val = newRect;
3999
4000 it.value() = data;
4001 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToX[property], newRect.x());
4002 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToY[property], newRect.y());
4003 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToW[property], newRect.width());
4004 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToH[property], newRect.height());
4005
4006 emit propertyChanged(property);
4007 emit valueChanged(property, data.val);
4008}
4009
4010/*!
4011 Sets the given \a property's constraining rectangle to \a
4012 constraint.
4013
4014 When setting the constraint, the current value is adjusted if
4015 necessary (ensuring that the current rectangle value is inside the
4016 constraint). In order to reset the constraint pass a null QRect value.
4017
4018 \sa setValue(), constraint(), constraintChanged()
4019*/
4020void QtRectPropertyManager::setConstraint(QtProperty *property, const QRect &constraint)
4021{
4022 const QtRectPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
4023 if (it == d_ptr->m_values.end())
4024 return;
4025
4026 QtRectPropertyManagerPrivate::Data data = it.value();
4027
4028 QRect newConstraint = constraint.normalized();
4029 if (data.constraint == newConstraint)
4030 return;
4031
4032 const QRect oldVal = data.val;
4033
4034 data.constraint = newConstraint;
4035
4036 if (!data.constraint.isNull() && !data.constraint.contains(oldVal)) {
4037 QRect r1 = data.constraint;
4038 QRect r2 = data.val;
4039
4040 if (r2.width() > r1.width())
4041 r2.setWidth(r1.width());
4042 if (r2.height() > r1.height())
4043 r2.setHeight(r1.height());
4044 if (r2.left() < r1.left())
4045 r2.moveLeft(r1.left());
4046 else if (r2.right() > r1.right())
4047 r2.moveRight(r1.right());
4048 if (r2.top() < r1.top())
4049 r2.moveTop(r1.top());
4050 else if (r2.bottom() > r1.bottom())
4051 r2.moveBottom(r1.bottom());
4052
4053 data.val = r2;
4054 }
4055
4056 it.value() = data;
4057
4058 emit constraintChanged(property, data.constraint);
4059
4060 d_ptr->setConstraint(property, data.constraint, data.val);
4061
4062 if (data.val == oldVal)
4063 return;
4064
4065 emit propertyChanged(property);
4066 emit valueChanged(property, data.val);
4067}
4068
4069/*!
4070 \reimp
4071*/
4072void QtRectPropertyManager::initializeProperty(QtProperty *property)
4073{
4074 d_ptr->m_values[property] = QtRectPropertyManagerPrivate::Data();
4075
4076 QtProperty *xProp = d_ptr->m_intPropertyManager->addProperty();
4077 xProp->setPropertyName(tr("X"));
4078 d_ptr->m_intPropertyManager->setValue(xProp, 0);
4079 d_ptr->m_propertyToX[property] = xProp;
4080 d_ptr->m_xToProperty[xProp] = property;
4081 property->addSubProperty(xProp);
4082
4083 QtProperty *yProp = d_ptr->m_intPropertyManager->addProperty();
4084 yProp->setPropertyName(tr("Y"));
4085 d_ptr->m_intPropertyManager->setValue(yProp, 0);
4086 d_ptr->m_propertyToY[property] = yProp;
4087 d_ptr->m_yToProperty[yProp] = property;
4088 property->addSubProperty(yProp);
4089
4090 QtProperty *wProp = d_ptr->m_intPropertyManager->addProperty();
4091 wProp->setPropertyName(tr("Width"));
4092 d_ptr->m_intPropertyManager->setValue(wProp, 0);
4093 d_ptr->m_intPropertyManager->setMinimum(wProp, 0);
4094 d_ptr->m_propertyToW[property] = wProp;
4095 d_ptr->m_wToProperty[wProp] = property;
4096 property->addSubProperty(wProp);
4097
4098 QtProperty *hProp = d_ptr->m_intPropertyManager->addProperty();
4099 hProp->setPropertyName(tr("Height"));
4100 d_ptr->m_intPropertyManager->setValue(hProp, 0);
4101 d_ptr->m_intPropertyManager->setMinimum(hProp, 0);
4102 d_ptr->m_propertyToH[property] = hProp;
4103 d_ptr->m_hToProperty[hProp] = property;
4104 property->addSubProperty(hProp);
4105}
4106
4107/*!
4108 \reimp
4109*/
4110void QtRectPropertyManager::uninitializeProperty(QtProperty *property)
4111{
4112 QtProperty *xProp = d_ptr->m_propertyToX[property];
4113 if (xProp) {
4114 d_ptr->m_xToProperty.remove(xProp);
4115 delete xProp;
4116 }
4117 d_ptr->m_propertyToX.remove(property);
4118
4119 QtProperty *yProp = d_ptr->m_propertyToY[property];
4120 if (yProp) {
4121 d_ptr->m_yToProperty.remove(yProp);
4122 delete yProp;
4123 }
4124 d_ptr->m_propertyToY.remove(property);
4125
4126 QtProperty *wProp = d_ptr->m_propertyToW[property];
4127 if (wProp) {
4128 d_ptr->m_wToProperty.remove(wProp);
4129 delete wProp;
4130 }
4131 d_ptr->m_propertyToW.remove(property);
4132
4133 QtProperty *hProp = d_ptr->m_propertyToH[property];
4134 if (hProp) {
4135 d_ptr->m_hToProperty.remove(hProp);
4136 delete hProp;
4137 }
4138 d_ptr->m_propertyToH.remove(property);
4139
4140 d_ptr->m_values.remove(property);
4141}
4142
4143// QtRectFPropertyManager
4144
4145class QtRectFPropertyManagerPrivate
4146{
4147 QtRectFPropertyManager *q_ptr;
4148 Q_DECLARE_PUBLIC(QtRectFPropertyManager)
4149public:
4150
4151 void slotDoubleChanged(QtProperty *property, double value);
4152 void slotPropertyDestroyed(QtProperty *property);
4153 void setConstraint(QtProperty *property, const QRectF &constraint, const QRectF &val);
4154
4155 struct Data
4156 {
4157 Data() : val(0, 0, 0, 0), decimals(2) {}
4158 QRectF val;
4159 QRectF constraint;
4160 int decimals;
4161 };
4162
4163 typedef QMap<const QtProperty *, Data> PropertyValueMap;
4164 PropertyValueMap m_values;
4165
4166 QtDoublePropertyManager *m_doublePropertyManager;
4167
4168 QMap<const QtProperty *, QtProperty *> m_propertyToX;
4169 QMap<const QtProperty *, QtProperty *> m_propertyToY;
4170 QMap<const QtProperty *, QtProperty *> m_propertyToW;
4171 QMap<const QtProperty *, QtProperty *> m_propertyToH;
4172
4173 QMap<const QtProperty *, QtProperty *> m_xToProperty;
4174 QMap<const QtProperty *, QtProperty *> m_yToProperty;
4175 QMap<const QtProperty *, QtProperty *> m_wToProperty;
4176 QMap<const QtProperty *, QtProperty *> m_hToProperty;
4177};
4178
4179void QtRectFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value)
4180{
4181 if (QtProperty *prop = m_xToProperty.value(property, 0)) {
4182 QRectF r = m_values[prop].val;
4183 r.moveLeft(value);
4184 q_ptr->setValue(prop, r);
4185 } else if (QtProperty *prop = m_yToProperty.value(property, 0)) {
4186 QRectF r = m_values[prop].val;
4187 r.moveTop(value);
4188 q_ptr->setValue(prop, r);
4189 } else if (QtProperty *prop = m_wToProperty.value(property, 0)) {
4190 Data data = m_values[prop];
4191 QRectF r = data.val;
4192 r.setWidth(value);
4193 if (!data.constraint.isNull() && data.constraint.x() + data.constraint.width() < r.x() + r.width()) {
4194 r.moveLeft(data.constraint.left() + data.constraint.width() - r.width());
4195 }
4196 q_ptr->setValue(prop, r);
4197 } else if (QtProperty *prop = m_hToProperty.value(property, 0)) {
4198 Data data = m_values[prop];
4199 QRectF r = data.val;
4200 r.setHeight(value);
4201 if (!data.constraint.isNull() && data.constraint.y() + data.constraint.height() < r.y() + r.height()) {
4202 r.moveTop(data.constraint.top() + data.constraint.height() - r.height());
4203 }
4204 q_ptr->setValue(prop, r);
4205 }
4206}
4207
4208void QtRectFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
4209{
4210 if (QtProperty *pointProp = m_xToProperty.value(property, 0)) {
4211 m_propertyToX[pointProp] = 0;
4212 m_xToProperty.remove(property);
4213 } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) {
4214 m_propertyToY[pointProp] = 0;
4215 m_yToProperty.remove(property);
4216 } else if (QtProperty *pointProp = m_wToProperty.value(property, 0)) {
4217 m_propertyToW[pointProp] = 0;
4218 m_wToProperty.remove(property);
4219 } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) {
4220 m_propertyToH[pointProp] = 0;
4221 m_hToProperty.remove(property);
4222 }
4223}
4224
4225void QtRectFPropertyManagerPrivate::setConstraint(QtProperty *property,
4226 const QRectF &constraint, const QRectF &val)
4227{
4228 const bool isNull = constraint.isNull();
4229 const float left = isNull ? FLT_MIN : constraint.left();
4230 const float right = isNull ? FLT_MAX : constraint.left() + constraint.width();
4231 const float top = isNull ? FLT_MIN : constraint.top();
4232 const float bottom = isNull ? FLT_MAX : constraint.top() + constraint.height();
4233 const float width = isNull ? FLT_MAX : constraint.width();
4234 const float height = isNull ? FLT_MAX : constraint.height();
4235
4236 m_doublePropertyManager->setRange(m_propertyToX[property], left, right);
4237 m_doublePropertyManager->setRange(m_propertyToY[property], top, bottom);
4238 m_doublePropertyManager->setRange(m_propertyToW[property], 0, width);
4239 m_doublePropertyManager->setRange(m_propertyToH[property], 0, height);
4240
4241 m_doublePropertyManager->setValue(m_propertyToX[property], val.x());
4242 m_doublePropertyManager->setValue(m_propertyToY[property], val.y());
4243 m_doublePropertyManager->setValue(m_propertyToW[property], val.width());
4244 m_doublePropertyManager->setValue(m_propertyToH[property], val.height());
4245}
4246
4247/*!
4248 \class QtRectFPropertyManager
4249 \internal
4250 \inmodule QtDesigner
4251 \since 4.4
4252
4253 \brief The QtRectFPropertyManager provides and manages QRectF properties.
4254
4255 A rectangle property has nested \e x, \e y, \e width and \e height
4256 subproperties. The top-level property's value can be retrieved
4257 using the value() function, and set using the setValue() slot.
4258
4259 The subproperties are created by a QtDoublePropertyManager object. This
4260 manager can be retrieved using the subDoublePropertyManager() function. In
4261 order to provide editing widgets for the subproperties in a
4262 property browser widget, this manager must be associated with an
4263 editor factory.
4264
4265 A rectangle property also has a constraint rectangle which can be
4266 retrieved using the constraint() function, and set using the
4267 setConstraint() slot.
4268
4269 In addition, QtRectFPropertyManager provides the valueChanged() signal
4270 which is emitted whenever a property created by this manager
4271 changes, and the constraintChanged() signal which is emitted
4272 whenever such a property changes its constraint rectangle.
4273
4274 \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtRectPropertyManager
4275*/
4276
4277/*!
4278 \fn void QtRectFPropertyManager::valueChanged(QtProperty *property, const QRectF &value)
4279
4280 This signal is emitted whenever a property created by this manager
4281 changes its value, passing a pointer to the \a property and the new
4282 \a value as parameters.
4283
4284 \sa setValue()
4285*/
4286
4287/*!
4288 \fn void QtRectFPropertyManager::constraintChanged(QtProperty *property, const QRectF &constraint)
4289
4290 This signal is emitted whenever property changes its constraint
4291 rectangle, passing a pointer to the \a property and the new \a
4292 constraint rectangle as parameters.
4293
4294 \sa setConstraint()
4295*/
4296
4297/*!
4298 \fn void QtRectFPropertyManager::decimalsChanged(QtProperty *property, int prec)
4299
4300 This signal is emitted whenever a property created by this manager
4301 changes its precision of value, passing a pointer to the
4302 \a property and the new \a prec value
4303
4304 \sa setDecimals()
4305*/
4306
4307/*!
4308 Creates a manager with the given \a parent.
4309*/
4310QtRectFPropertyManager::QtRectFPropertyManager(QObject *parent)
4311 : QtAbstractPropertyManager(parent), d_ptr(new QtRectFPropertyManagerPrivate)
4312{
4313 d_ptr->q_ptr = this;
4314
4315 d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this);
4316 connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty*,double)),
4317 this, SLOT(slotDoubleChanged(QtProperty*,double)));
4318 connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
4319 this, SLOT(slotPropertyDestroyed(QtProperty*)));
4320}
4321
4322/*!
4323 Destroys this manager, and all the properties it has created.
4324*/
4325QtRectFPropertyManager::~QtRectFPropertyManager()
4326{
4327 clear();
4328}
4329
4330/*!
4331 Returns the manager that creates the nested \e x, \e y, \e width
4332 and \e height subproperties.
4333
4334 In order to provide editing widgets for the mentioned
4335 subproperties in a property browser widget, this manager must be
4336 associated with an editor factory.
4337
4338 \sa QtAbstractPropertyBrowser::setFactoryForManager()
4339*/
4340QtDoublePropertyManager *QtRectFPropertyManager::subDoublePropertyManager() const
4341{
4342 return d_ptr->m_doublePropertyManager;
4343}
4344
4345/*!
4346 Returns the given \a property's value.
4347
4348 If the given \a property is not managed by this manager, this
4349 function returns an invalid rectangle.
4350
4351 \sa setValue(), constraint()
4352*/
4353QRectF QtRectFPropertyManager::value(const QtProperty *property) const
4354{
4355 return getValue<QRectF>(d_ptr->m_values, property);
4356}
4357
4358/*!
4359 Returns the given \a property's precision, in decimals.
4360
4361 \sa setDecimals()
4362*/
4363int QtRectFPropertyManager::decimals(const QtProperty *property) const
4364{
4365 return getData<int>(d_ptr->m_values, &QtRectFPropertyManagerPrivate::Data::decimals, property, 0);
4366}
4367
4368/*!
4369 Returns the given \a property's constraining rectangle. If returned value is null QRectF it means there is no constraint applied.
4370
4371 \sa value(), setConstraint()
4372*/
4373QRectF QtRectFPropertyManager::constraint(const QtProperty *property) const
4374{
4375 return getData<QRectF>(d_ptr->m_values, &QtRectFPropertyManagerPrivate::Data::constraint, property, QRect());
4376}
4377
4378/*!
4379 \reimp
4380*/
4381QString QtRectFPropertyManager::valueText(const QtProperty *property) const
4382{
4383 const QtRectFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
4384 if (it == d_ptr->m_values.constEnd())
4385 return QString();
4386 const QRectF v = it.value().val;
4387 const int dec = it.value().decimals;
4388 return QString(tr("[(%1, %2), %3 x %4]").arg(QString::number(v.x(), 'f', dec))
4389 .arg(QString::number(v.y(), 'f', dec))
4390 .arg(QString::number(v.width(), 'f', dec))
4391 .arg(QString::number(v.height(), 'f', dec)));
4392}
4393
4394/*!
4395 \fn void QtRectFPropertyManager::setValue(QtProperty *property, const QRectF &value)
4396
4397 Sets the value of the given \a property to \a value. Nested
4398 properties are updated automatically.
4399
4400 If the specified \a value is not inside the given \a property's
4401 constraining rectangle, the value is adjusted accordingly to fit
4402 within the constraint.
4403
4404 \sa value(), setConstraint(), valueChanged()
4405*/
4406void QtRectFPropertyManager::setValue(QtProperty *property, const QRectF &val)
4407{
4408 const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
4409 if (it == d_ptr->m_values.end())
4410 return;
4411
4412 QtRectFPropertyManagerPrivate::Data data = it.value();
4413
4414 QRectF newRect = val.normalized();
4415 if (!data.constraint.isNull() && !data.constraint.contains(newRect)) {
4416 const QRectF r1 = data.constraint;
4417 const QRectF r2 = newRect;
4418 newRect.setLeft(qMax(r1.left(), r2.left()));
4419 newRect.setRight(qMin(r1.right(), r2.right()));
4420 newRect.setTop(qMax(r1.top(), r2.top()));
4421 newRect.setBottom(qMin(r1.bottom(), r2.bottom()));
4422 if (newRect.width() < 0 || newRect.height() < 0)
4423 return;
4424 }
4425
4426 if (data.val == newRect)
4427 return;
4428
4429 data.val = newRect;
4430
4431 it.value() = data;
4432 d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToX[property], newRect.x());
4433 d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToY[property], newRect.y());
4434 d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToW[property], newRect.width());
4435 d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToH[property], newRect.height());
4436
4437 emit propertyChanged(property);
4438 emit valueChanged(property, data.val);
4439}
4440
4441/*!
4442 Sets the given \a property's constraining rectangle to \a
4443 constraint.
4444
4445 When setting the constraint, the current value is adjusted if
4446 necessary (ensuring that the current rectangle value is inside the
4447 constraint). In order to reset the constraint pass a null QRectF value.
4448
4449 \sa setValue(), constraint(), constraintChanged()
4450*/
4451void QtRectFPropertyManager::setConstraint(QtProperty *property, const QRectF &constraint)
4452{
4453 const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
4454 if (it == d_ptr->m_values.end())
4455 return;
4456
4457 QtRectFPropertyManagerPrivate::Data data = it.value();
4458
4459 QRectF newConstraint = constraint.normalized();
4460 if (data.constraint == newConstraint)
4461 return;
4462
4463 const QRectF oldVal = data.val;
4464
4465 data.constraint = newConstraint;
4466
4467 if (!data.constraint.isNull() && !data.constraint.contains(oldVal)) {
4468 QRectF r1 = data.constraint;
4469 QRectF r2 = data.val;
4470
4471 if (r2.width() > r1.width())
4472 r2.setWidth(r1.width());
4473 if (r2.height() > r1.height())
4474 r2.setHeight(r1.height());
4475 if (r2.left() < r1.left())
4476 r2.moveLeft(r1.left());
4477 else if (r2.right() > r1.right())
4478 r2.moveRight(r1.right());
4479 if (r2.top() < r1.top())
4480 r2.moveTop(r1.top());
4481 else if (r2.bottom() > r1.bottom())
4482 r2.moveBottom(r1.bottom());
4483
4484 data.val = r2;
4485 }
4486
4487 it.value() = data;
4488
4489 emit constraintChanged(property, data.constraint);
4490
4491 d_ptr->setConstraint(property, data.constraint, data.val);
4492
4493 if (data.val == oldVal)
4494 return;
4495
4496 emit propertyChanged(property);
4497 emit valueChanged(property, data.val);
4498}
4499
4500/*!
4501 \fn void QtRectFPropertyManager::setDecimals(QtProperty *property, int prec)
4502
4503 Sets the precision of the given \a property to \a prec.
4504
4505 The valid decimal range is 0-13. The default is 2.
4506
4507 \sa decimals()
4508*/
4509void QtRectFPropertyManager::setDecimals(QtProperty *property, int prec)
4510{
4511 const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
4512 if (it == d_ptr->m_values.end())
4513 return;
4514
4515 QtRectFPropertyManagerPrivate::Data data = it.value();
4516
4517 if (prec > 13)
4518 prec = 13;
4519 else if (prec < 0)
4520 prec = 0;
4521
4522 if (data.decimals == prec)
4523 return;
4524
4525 data.decimals = prec;
4526 d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToX[property], prec);
4527 d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToY[property], prec);
4528 d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToW[property], prec);
4529 d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToH[property], prec);
4530
4531 it.value() = data;
4532
4533 emit decimalsChanged(property, data.decimals);
4534}
4535
4536/*!
4537 \reimp
4538*/
4539void QtRectFPropertyManager::initializeProperty(QtProperty *property)
4540{
4541 d_ptr->m_values[property] = QtRectFPropertyManagerPrivate::Data();
4542
4543 QtProperty *xProp = d_ptr->m_doublePropertyManager->addProperty();
4544 xProp->setPropertyName(tr("X"));
4545 d_ptr->m_doublePropertyManager->setDecimals(xProp, decimals(property));
4546 d_ptr->m_doublePropertyManager->setValue(xProp, 0);
4547 d_ptr->m_propertyToX[property] = xProp;
4548 d_ptr->m_xToProperty[xProp] = property;
4549 property->addSubProperty(xProp);
4550
4551 QtProperty *yProp = d_ptr->m_doublePropertyManager->addProperty();
4552 yProp->setPropertyName(tr("Y"));
4553 d_ptr->m_doublePropertyManager->setDecimals(yProp, decimals(property));
4554 d_ptr->m_doublePropertyManager->setValue(yProp, 0);
4555 d_ptr->m_propertyToY[property] = yProp;
4556 d_ptr->m_yToProperty[yProp] = property;
4557 property->addSubProperty(yProp);
4558
4559 QtProperty *wProp = d_ptr->m_doublePropertyManager->addProperty();
4560 wProp->setPropertyName(tr("Width"));
4561 d_ptr->m_doublePropertyManager->setDecimals(wProp, decimals(property));
4562 d_ptr->m_doublePropertyManager->setValue(wProp, 0);
4563 d_ptr->m_doublePropertyManager->setMinimum(wProp, 0);
4564 d_ptr->m_propertyToW[property] = wProp;
4565 d_ptr->m_wToProperty[wProp] = property;
4566 property->addSubProperty(wProp);
4567
4568 QtProperty *hProp = d_ptr->m_doublePropertyManager->addProperty();
4569 hProp->setPropertyName(tr("Height"));
4570 d_ptr->m_doublePropertyManager->setDecimals(hProp, decimals(property));
4571 d_ptr->m_doublePropertyManager->setValue(hProp, 0);
4572 d_ptr->m_doublePropertyManager->setMinimum(hProp, 0);
4573 d_ptr->m_propertyToH[property] = hProp;
4574 d_ptr->m_hToProperty[hProp] = property;
4575 property->addSubProperty(hProp);
4576}
4577
4578/*!
4579 \reimp
4580*/
4581void QtRectFPropertyManager::uninitializeProperty(QtProperty *property)
4582{
4583 QtProperty *xProp = d_ptr->m_propertyToX[property];
4584 if (xProp) {
4585 d_ptr->m_xToProperty.remove(xProp);
4586 delete xProp;
4587 }
4588 d_ptr->m_propertyToX.remove(property);
4589
4590 QtProperty *yProp = d_ptr->m_propertyToY[property];
4591 if (yProp) {
4592 d_ptr->m_yToProperty.remove(yProp);
4593 delete yProp;
4594 }
4595 d_ptr->m_propertyToY.remove(property);
4596
4597 QtProperty *wProp = d_ptr->m_propertyToW[property];
4598 if (wProp) {
4599 d_ptr->m_wToProperty.remove(wProp);
4600 delete wProp;
4601 }
4602 d_ptr->m_propertyToW.remove(property);
4603
4604 QtProperty *hProp = d_ptr->m_propertyToH[property];
4605 if (hProp) {
4606 d_ptr->m_hToProperty.remove(hProp);
4607 delete hProp;
4608 }
4609 d_ptr->m_propertyToH.remove(property);
4610
4611 d_ptr->m_values.remove(property);
4612}
4613
4614// QtEnumPropertyManager
4615
4616class QtEnumPropertyManagerPrivate
4617{
4618 QtEnumPropertyManager *q_ptr;
4619 Q_DECLARE_PUBLIC(QtEnumPropertyManager)
4620public:
4621
4622 struct Data
4623 {
4624 Data() : val(-1) {}
4625 int val;
4626 QStringList enumNames;
4627 QMap<int, QIcon> enumIcons;
4628 };
4629
4630 typedef QMap<const QtProperty *, Data> PropertyValueMap;
4631 PropertyValueMap m_values;
4632};
4633
4634/*!
4635 \class QtEnumPropertyManager
4636 \internal
4637 \inmodule QtDesigner
4638 \since 4.4
4639
4640 \brief The QtEnumPropertyManager provides and manages enum properties.
4641
4642 Each enum property has an associated list of enum names which can
4643 be retrieved using the enumNames() function, and set using the
4644 corresponding setEnumNames() function. An enum property's value is
4645 represented by an index in this list, and can be retrieved and set
4646 using the value() and setValue() slots respectively.
4647
4648 Each enum value can also have an associated icon. The mapping from
4649 values to icons can be set using the setEnumIcons() function and
4650 queried with the enumIcons() function.
4651
4652 In addition, QtEnumPropertyManager provides the valueChanged() signal
4653 which is emitted whenever a property created by this manager
4654 changes. The enumNamesChanged() or enumIconsChanged() signal is emitted
4655 whenever the list of enum names or icons is altered.
4656
4657 \sa QtAbstractPropertyManager, QtEnumEditorFactory
4658*/
4659
4660/*!
4661 \fn void QtEnumPropertyManager::valueChanged(QtProperty *property, int value)
4662
4663 This signal is emitted whenever a property created by this manager
4664 changes its value, passing a pointer to the \a property and the new
4665 \a value as parameters.
4666
4667 \sa setValue()
4668*/
4669
4670/*!
4671 \fn void QtEnumPropertyManager::enumNamesChanged(QtProperty *property, const QStringList &names)
4672
4673 This signal is emitted whenever a property created by this manager
4674 changes its enum names, passing a pointer to the \a property and
4675 the new \a names as parameters.
4676
4677 \sa setEnumNames()
4678*/
4679
4680/*!
4681 \fn void QtEnumPropertyManager::enumIconsChanged(QtProperty *property, const QMap<int, QIcon> &icons)
4682
4683 This signal is emitted whenever a property created by this manager
4684 changes its enum icons, passing a pointer to the \a property and
4685 the new mapping of values to \a icons as parameters.
4686
4687 \sa setEnumIcons()
4688*/
4689
4690/*!
4691 Creates a manager with the given \a parent.
4692*/
4693QtEnumPropertyManager::QtEnumPropertyManager(QObject *parent)
4694 : QtAbstractPropertyManager(parent), d_ptr(new QtEnumPropertyManagerPrivate)
4695{
4696 d_ptr->q_ptr = this;
4697}
4698
4699/*!
4700 Destroys this manager, and all the properties it has created.
4701*/
4702QtEnumPropertyManager::~QtEnumPropertyManager()
4703{
4704 clear();
4705}
4706
4707/*!
4708 Returns the given \a property's value which is an index in the
4709 list returned by enumNames()
4710
4711 If the given property is not managed by this manager, this
4712 function returns -1.
4713
4714 \sa enumNames(), setValue()
4715*/
4716int QtEnumPropertyManager::value(const QtProperty *property) const
4717{
4718 return getValue<int>(d_ptr->m_values, property, -1);
4719}
4720
4721/*!
4722 Returns the given \a property's list of enum names.
4723
4724 \sa value(), setEnumNames()
4725*/
4726QStringList QtEnumPropertyManager::enumNames(const QtProperty *property) const
4727{
4728 return getData<QStringList>(d_ptr->m_values, &QtEnumPropertyManagerPrivate::Data::enumNames, property, QStringList());
4729}
4730
4731/*!
4732 Returns the given \a property's map of enum values to their icons.
4733
4734 \sa value(), setEnumIcons()
4735*/
4736QMap<int, QIcon> QtEnumPropertyManager::enumIcons(const QtProperty *property) const
4737{
4738 return getData<QMap<int, QIcon> >(d_ptr->m_values, &QtEnumPropertyManagerPrivate::Data::enumIcons, property, QMap<int, QIcon>());
4739}
4740
4741/*!
4742 \reimp
4743*/
4744QString QtEnumPropertyManager::valueText(const QtProperty *property) const
4745{
4746 const QtEnumPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
4747 if (it == d_ptr->m_values.constEnd())
4748 return QString();
4749
4750 const QtEnumPropertyManagerPrivate::Data &data = it.value();
4751
4752 const int v = data.val;
4753 if (v >= 0 && v < data.enumNames.count())
4754 return data.enumNames.at(v);
4755 return QString();
4756}
4757
4758/*!
4759 \reimp
4760*/
4761QIcon QtEnumPropertyManager::valueIcon(const QtProperty *property) const
4762{
4763 const QtEnumPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
4764 if (it == d_ptr->m_values.constEnd())
4765 return QIcon();
4766
4767 const QtEnumPropertyManagerPrivate::Data &data = it.value();
4768
4769 const int v = data.val;
4770 return data.enumIcons.value(v);
4771}
4772
4773/*!
4774 \fn void QtEnumPropertyManager::setValue(QtProperty *property, int value)
4775
4776 Sets the value of the given \a property to \a value.
4777
4778 The specified \a value must be less than the size of the given \a
4779 property's enumNames() list, and larger than (or equal to) 0.
4780
4781 \sa value(), valueChanged()
4782*/
4783void QtEnumPropertyManager::setValue(QtProperty *property, int val)
4784{
4785 const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
4786 if (it == d_ptr->m_values.end())
4787 return;
4788
4789 QtEnumPropertyManagerPrivate::Data data = it.value();
4790
4791 if (val >= data.enumNames.count())
4792 return;
4793
4794 if (val < 0 && data.enumNames.count() > 0)
4795 return;
4796
4797 if (val < 0)
4798 val = -1;
4799
4800 if (data.val == val)
4801 return;
4802
4803 data.val = val;
4804
4805 it.value() = data;
4806
4807 emit propertyChanged(property);
4808 emit valueChanged(property, data.val);
4809}
4810
4811/*!
4812 Sets the given \a property's list of enum names to \a
4813 enumNames. The \a property's current value is reset to 0
4814 indicating the first item of the list.
4815
4816 If the specified \a enumNames list is empty, the \a property's
4817 current value is set to -1.
4818
4819 \sa enumNames(), enumNamesChanged()
4820*/
4821void QtEnumPropertyManager::setEnumNames(QtProperty *property, const QStringList &enumNames)
4822{
4823 const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
4824 if (it == d_ptr->m_values.end())
4825 return;
4826
4827 QtEnumPropertyManagerPrivate::Data data = it.value();
4828
4829 if (data.enumNames == enumNames)
4830 return;
4831
4832 data.enumNames = enumNames;
4833
4834 data.val = -1;
4835
4836 if (enumNames.count() > 0)
4837 data.val = 0;
4838
4839 it.value() = data;
4840
4841 emit enumNamesChanged(property, data.enumNames);
4842
4843 emit propertyChanged(property);
4844 emit valueChanged(property, data.val);
4845}
4846
4847/*!
4848 Sets the given \a property's map of enum values to their icons to \a
4849 enumIcons.
4850
4851 Each enum value can have associated icon. This association is represented with passed \a enumIcons map.
4852
4853 \sa enumNames(), enumNamesChanged()
4854*/
4855void QtEnumPropertyManager::setEnumIcons(QtProperty *property, const QMap<int, QIcon> &enumIcons)
4856{
4857 const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
4858 if (it == d_ptr->m_values.end())
4859 return;
4860
4861 it.value().enumIcons = enumIcons;
4862
4863 emit enumIconsChanged(property, it.value().enumIcons);
4864
4865 emit propertyChanged(property);
4866}
4867
4868/*!
4869 \reimp
4870*/
4871void QtEnumPropertyManager::initializeProperty(QtProperty *property)
4872{
4873 d_ptr->m_values[property] = QtEnumPropertyManagerPrivate::Data();
4874}
4875
4876/*!
4877 \reimp
4878*/
4879void QtEnumPropertyManager::uninitializeProperty(QtProperty *property)
4880{
4881 d_ptr->m_values.remove(property);
4882}
4883
4884// QtFlagPropertyManager
4885
4886class QtFlagPropertyManagerPrivate
4887{
4888 QtFlagPropertyManager *q_ptr;
4889 Q_DECLARE_PUBLIC(QtFlagPropertyManager)
4890public:
4891
4892 void slotBoolChanged(QtProperty *property, bool value);
4893 void slotPropertyDestroyed(QtProperty *property);
4894
4895 struct Data
4896 {
4897 Data() : val(-1) {}
4898 int val;
4899 QStringList flagNames;
4900 };
4901
4902 typedef QMap<const QtProperty *, Data> PropertyValueMap;
4903 PropertyValueMap m_values;
4904
4905 QtBoolPropertyManager *m_boolPropertyManager;
4906
4907 QMap<const QtProperty *, QList<QtProperty *> > m_propertyToFlags;
4908
4909 QMap<const QtProperty *, QtProperty *> m_flagToProperty;
4910};
4911
4912void QtFlagPropertyManagerPrivate::slotBoolChanged(QtProperty *property, bool value)
4913{
4914 QtProperty *prop = m_flagToProperty.value(property, 0);
4915 if (prop == 0)
4916 return;
4917
4918 QListIterator<QtProperty *> itProp(m_propertyToFlags[prop]);
4919 int level = 0;
4920 while (itProp.hasNext()) {
4921 QtProperty *p = itProp.next();
4922 if (p == property) {
4923 int v = m_values[prop].val;
4924 if (value) {
4925 v |= (1 << level);
4926 } else {
4927 v &= ~(1 << level);
4928 }
4929 q_ptr->setValue(prop, v);
4930 return;
4931 }
4932 level++;
4933 }
4934}
4935
4936void QtFlagPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
4937{
4938 QtProperty *flagProperty = m_flagToProperty.value(property, 0);
4939 if (flagProperty == 0)
4940 return;
4941
4942 m_propertyToFlags[flagProperty].replace(m_propertyToFlags[flagProperty].indexOf(property), 0);
4943 m_flagToProperty.remove(property);
4944}
4945
4946/*!
4947 \class QtFlagPropertyManager
4948 \internal
4949 \inmodule QtDesigner
4950 \since 4.4
4951
4952 \brief The QtFlagPropertyManager provides and manages flag properties.
4953
4954 Each flag property has an associated list of flag names which can
4955 be retrieved using the flagNames() function, and set using the
4956 corresponding setFlagNames() function.
4957
4958 The flag manager provides properties with nested boolean
4959 subproperties representing each flag, i.e. a flag property's value
4960 is the binary combination of the subproperties' values. A
4961 property's value can be retrieved and set using the value() and
4962 setValue() slots respectively. The combination of flags is represented
4963 by single int value - that's why it's possible to store up to
4964 32 independent flags in one flag property.
4965
4966 The subproperties are created by a QtBoolPropertyManager object. This
4967 manager can be retrieved using the subBoolPropertyManager() function. In
4968 order to provide editing widgets for the subproperties in a
4969 property browser widget, this manager must be associated with an
4970 editor factory.
4971
4972 In addition, QtFlagPropertyManager provides the valueChanged() signal
4973 which is emitted whenever a property created by this manager
4974 changes, and the flagNamesChanged() signal which is emitted
4975 whenever the list of flag names is altered.
4976
4977 \sa QtAbstractPropertyManager, QtBoolPropertyManager
4978*/
4979
4980/*!
4981 \fn void QtFlagPropertyManager::valueChanged(QtProperty *property, int value)
4982
4983 This signal is emitted whenever a property created by this manager
4984 changes its value, passing a pointer to the \a property and the new
4985 \a value as parameters.
4986
4987 \sa setValue()
4988*/
4989
4990/*!
4991 \fn void QtFlagPropertyManager::flagNamesChanged(QtProperty *property, const QStringList &names)
4992
4993 This signal is emitted whenever a property created by this manager
4994 changes its flag names, passing a pointer to the \a property and the
4995 new \a names as parameters.
4996
4997 \sa setFlagNames()
4998*/
4999
5000/*!
5001 Creates a manager with the given \a parent.
5002*/
5003QtFlagPropertyManager::QtFlagPropertyManager(QObject *parent)
5004 : QtAbstractPropertyManager(parent), d_ptr(new QtFlagPropertyManagerPrivate)
5005{
5006 d_ptr->q_ptr = this;
5007
5008 d_ptr->m_boolPropertyManager = new QtBoolPropertyManager(this);
5009 connect(d_ptr->m_boolPropertyManager, SIGNAL(valueChanged(QtProperty*,bool)),
5010 this, SLOT(slotBoolChanged(QtProperty*,bool)));
5011 connect(d_ptr->m_boolPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
5012 this, SLOT(slotPropertyDestroyed(QtProperty*)));
5013}
5014
5015/*!
5016 Destroys this manager, and all the properties it has created.
5017*/
5018QtFlagPropertyManager::~QtFlagPropertyManager()
5019{
5020 clear();
5021}
5022
5023/*!
5024 Returns the manager that produces the nested boolean subproperties
5025 representing each flag.
5026
5027 In order to provide editing widgets for the subproperties in a
5028 property browser widget, this manager must be associated with an
5029 editor factory.
5030
5031 \sa QtAbstractPropertyBrowser::setFactoryForManager()
5032*/
5033QtBoolPropertyManager *QtFlagPropertyManager::subBoolPropertyManager() const
5034{
5035 return d_ptr->m_boolPropertyManager;
5036}
5037
5038/*!
5039 Returns the given \a property's value.
5040
5041 If the given property is not managed by this manager, this
5042 function returns 0.
5043
5044 \sa flagNames(), setValue()
5045*/
5046int QtFlagPropertyManager::value(const QtProperty *property) const
5047{
5048 return getValue<int>(d_ptr->m_values, property, 0);
5049}
5050
5051/*!
5052 Returns the given \a property's list of flag names.
5053
5054 \sa value(), setFlagNames()
5055*/
5056QStringList QtFlagPropertyManager::flagNames(const QtProperty *property) const
5057{
5058 return getData<QStringList>(d_ptr->m_values, &QtFlagPropertyManagerPrivate::Data::flagNames, property, QStringList());
5059}
5060
5061/*!
5062 \reimp
5063*/
5064QString QtFlagPropertyManager::valueText(const QtProperty *property) const
5065{
5066 const QtFlagPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
5067 if (it == d_ptr->m_values.constEnd())
5068 return QString();
5069
5070 const QtFlagPropertyManagerPrivate::Data &data = it.value();
5071
5072 QString str;
5073 int level = 0;
5074 const QChar bar = QLatin1Char('|');
5075 const QStringList::const_iterator fncend = data.flagNames.constEnd();
5076 for (QStringList::const_iterator it = data.flagNames.constBegin(); it != fncend; ++it) {
5077 if (data.val & (1 << level)) {
5078 if (!str.isEmpty())
5079 str += bar;
5080 str += *it;
5081 }
5082
5083 level++;
5084 }
5085 return str;
5086}
5087
5088/*!
5089 \fn void QtFlagPropertyManager::setValue(QtProperty *property, int value)
5090
5091 Sets the value of the given \a property to \a value. Nested
5092 properties are updated automatically.
5093
5094 The specified \a value must be less than the binary combination of
5095 the property's flagNames() list size (i.e. less than 2\sup n,
5096 where \c n is the size of the list) and larger than (or equal to)
5097 0.
5098
5099 \sa value(), valueChanged()
5100*/
5101void QtFlagPropertyManager::setValue(QtProperty *property, int val)
5102{
5103 const QtFlagPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
5104 if (it == d_ptr->m_values.end())
5105 return;
5106
5107 QtFlagPropertyManagerPrivate::Data data = it.value();
5108
5109 if (data.val == val)
5110 return;
5111
5112 if (val > (1 << data.flagNames.count()) - 1)
5113 return;
5114
5115 if (val < 0)
5116 return;
5117
5118 data.val = val;
5119
5120 it.value() = data;
5121
5122 QListIterator<QtProperty *> itProp(d_ptr->m_propertyToFlags[property]);
5123 int level = 0;
5124 while (itProp.hasNext()) {
5125 QtProperty *prop = itProp.next();
5126 if (prop)
5127 d_ptr->m_boolPropertyManager->setValue(prop, val & (1 << level));
5128 level++;
5129 }
5130
5131 emit propertyChanged(property);
5132 emit valueChanged(property, data.val);
5133}
5134
5135/*!
5136 Sets the given \a property's list of flag names to \a flagNames. The
5137 property's current value is reset to 0 indicating the first item
5138 of the list.
5139
5140 \sa flagNames(), flagNamesChanged()
5141*/
5142void QtFlagPropertyManager::setFlagNames(QtProperty *property, const QStringList &flagNames)
5143{
5144 const QtFlagPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
5145 if (it == d_ptr->m_values.end())
5146 return;
5147
5148 QtFlagPropertyManagerPrivate::Data data = it.value();
5149
5150 if (data.flagNames == flagNames)
5151 return;
5152
5153 data.flagNames = flagNames;
5154 data.val = 0;
5155
5156 it.value() = data;
5157
5158 QListIterator<QtProperty *> itProp(d_ptr->m_propertyToFlags[property]);
5159 while (itProp.hasNext()) {
5160 QtProperty *prop = itProp.next();
5161 if (prop) {
5162 delete prop;
5163 d_ptr->m_flagToProperty.remove(prop);
5164 }
5165 }
5166 d_ptr->m_propertyToFlags[property].clear();
5167
5168 QStringListIterator itFlag(flagNames);
5169 while (itFlag.hasNext()) {
5170 const QString flagName = itFlag.next();
5171 QtProperty *prop = d_ptr->m_boolPropertyManager->addProperty();
5172 prop->setPropertyName(flagName);
5173 property->addSubProperty(prop);
5174 d_ptr->m_propertyToFlags[property].append(prop);
5175 d_ptr->m_flagToProperty[prop] = property;
5176 }
5177
5178 emit flagNamesChanged(property, data.flagNames);
5179
5180 emit propertyChanged(property);
5181 emit valueChanged(property, data.val);
5182}
5183
5184/*!
5185 \reimp
5186*/
5187void QtFlagPropertyManager::initializeProperty(QtProperty *property)
5188{
5189 d_ptr->m_values[property] = QtFlagPropertyManagerPrivate::Data();
5190
5191 d_ptr->m_propertyToFlags[property] = QList<QtProperty *>();
5192}
5193
5194/*!
5195 \reimp
5196*/
5197void QtFlagPropertyManager::uninitializeProperty(QtProperty *property)
5198{
5199 QListIterator<QtProperty *> itProp(d_ptr->m_propertyToFlags[property]);
5200 while (itProp.hasNext()) {
5201 QtProperty *prop = itProp.next();
5202 if (prop) {
5203 delete prop;
5204 d_ptr->m_flagToProperty.remove(prop);
5205 }
5206 }
5207 d_ptr->m_propertyToFlags.remove(property);
5208
5209 d_ptr->m_values.remove(property);
5210}
5211
5212// QtSizePolicyPropertyManager
5213
5214class QtSizePolicyPropertyManagerPrivate
5215{
5216 QtSizePolicyPropertyManager *q_ptr;
5217 Q_DECLARE_PUBLIC(QtSizePolicyPropertyManager)
5218public:
5219
5220 QtSizePolicyPropertyManagerPrivate();
5221
5222 void slotIntChanged(QtProperty *property, int value);
5223 void slotEnumChanged(QtProperty *property, int value);
5224 void slotPropertyDestroyed(QtProperty *property);
5225
5226 typedef QMap<const QtProperty *, QSizePolicy> PropertyValueMap;
5227 PropertyValueMap m_values;
5228
5229 QtIntPropertyManager *m_intPropertyManager;
5230 QtEnumPropertyManager *m_enumPropertyManager;
5231
5232 QMap<const QtProperty *, QtProperty *> m_propertyToHPolicy;
5233 QMap<const QtProperty *, QtProperty *> m_propertyToVPolicy;
5234 QMap<const QtProperty *, QtProperty *> m_propertyToHStretch;
5235 QMap<const QtProperty *, QtProperty *> m_propertyToVStretch;
5236
5237 QMap<const QtProperty *, QtProperty *> m_hPolicyToProperty;
5238 QMap<const QtProperty *, QtProperty *> m_vPolicyToProperty;
5239 QMap<const QtProperty *, QtProperty *> m_hStretchToProperty;
5240 QMap<const QtProperty *, QtProperty *> m_vStretchToProperty;
5241};
5242
5243QtSizePolicyPropertyManagerPrivate::QtSizePolicyPropertyManagerPrivate()
5244{
5245}
5246
5247void QtSizePolicyPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
5248{
5249 if (QtProperty *prop = m_hStretchToProperty.value(property, 0)) {
5250 QSizePolicy sp = m_values[prop];
5251 sp.setHorizontalStretch(value);
5252 q_ptr->setValue(prop, sp);
5253 } else if (QtProperty *prop = m_vStretchToProperty.value(property, 0)) {
5254 QSizePolicy sp = m_values[prop];
5255 sp.setVerticalStretch(value);
5256 q_ptr->setValue(prop, sp);
5257 }
5258}
5259
5260void QtSizePolicyPropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value)
5261{
5262 if (QtProperty *prop = m_hPolicyToProperty.value(property, 0)) {
5263 QSizePolicy sp = m_values[prop];
5264 sp.setHorizontalPolicy(metaEnumProvider()->indexToSizePolicy(value));
5265 q_ptr->setValue(prop, sp);
5266 } else if (QtProperty *prop = m_vPolicyToProperty.value(property, 0)) {
5267 QSizePolicy sp = m_values[prop];
5268 sp.setVerticalPolicy(metaEnumProvider()->indexToSizePolicy(value));
5269 q_ptr->setValue(prop, sp);
5270 }
5271}
5272
5273void QtSizePolicyPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
5274{
5275 if (QtProperty *pointProp = m_hStretchToProperty.value(property, 0)) {
5276 m_propertyToHStretch[pointProp] = 0;
5277 m_hStretchToProperty.remove(property);
5278 } else if (QtProperty *pointProp = m_vStretchToProperty.value(property, 0)) {
5279 m_propertyToVStretch[pointProp] = 0;
5280 m_vStretchToProperty.remove(property);
5281 } else if (QtProperty *pointProp = m_hPolicyToProperty.value(property, 0)) {
5282 m_propertyToHPolicy[pointProp] = 0;
5283 m_hPolicyToProperty.remove(property);
5284 } else if (QtProperty *pointProp = m_vPolicyToProperty.value(property, 0)) {
5285 m_propertyToVPolicy[pointProp] = 0;
5286 m_vPolicyToProperty.remove(property);
5287 }
5288}
5289
5290/*!
5291 \class QtSizePolicyPropertyManager
5292 \internal
5293 \inmodule QtDesigner
5294 \since 4.4
5295
5296 \brief The QtSizePolicyPropertyManager provides and manages QSizePolicy properties.
5297
5298 A size policy property has nested \e horizontalPolicy, \e
5299 verticalPolicy, \e horizontalStretch and \e verticalStretch
5300 subproperties. The top-level property's value can be retrieved
5301 using the value() function, and set using the setValue() slot.
5302
5303 The subproperties are created by QtIntPropertyManager and QtEnumPropertyManager
5304 objects. These managers can be retrieved using the subIntPropertyManager()
5305 and subEnumPropertyManager() functions respectively. In order to provide
5306 editing widgets for the subproperties in a property browser widget,
5307 these managers must be associated with editor factories.
5308
5309 In addition, QtSizePolicyPropertyManager provides the valueChanged()
5310 signal which is emitted whenever a property created by this
5311 manager changes.
5312
5313 \sa QtAbstractPropertyManager, QtIntPropertyManager, QtEnumPropertyManager
5314*/
5315
5316/*!
5317 \fn void QtSizePolicyPropertyManager::valueChanged(QtProperty *property, const QSizePolicy &value)
5318
5319 This signal is emitted whenever a property created by this manager
5320 changes its value, passing a pointer to the \a property and the
5321 new \a value as parameters.
5322
5323 \sa setValue()
5324*/
5325
5326/*!
5327 Creates a manager with the given \a parent.
5328*/
5329QtSizePolicyPropertyManager::QtSizePolicyPropertyManager(QObject *parent)
5330 : QtAbstractPropertyManager(parent), d_ptr(new QtSizePolicyPropertyManagerPrivate)
5331{
5332 d_ptr->q_ptr = this;
5333
5334 d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
5335 connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
5336 this, SLOT(slotIntChanged(QtProperty*,int)));
5337 d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this);
5338 connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
5339 this, SLOT(slotEnumChanged(QtProperty*,int)));
5340
5341 connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
5342 this, SLOT(slotPropertyDestroyed(QtProperty*)));
5343 connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
5344 this, SLOT(slotPropertyDestroyed(QtProperty*)));
5345}
5346
5347/*!
5348 Destroys this manager, and all the properties it has created.
5349*/
5350QtSizePolicyPropertyManager::~QtSizePolicyPropertyManager()
5351{
5352 clear();
5353}
5354
5355/*!
5356 Returns the manager that creates the nested \e horizontalStretch
5357 and \e verticalStretch subproperties.
5358
5359 In order to provide editing widgets for the mentioned subproperties
5360 in a property browser widget, this manager must be associated with
5361 an editor factory.
5362
5363 \sa QtAbstractPropertyBrowser::setFactoryForManager()
5364*/
5365QtIntPropertyManager *QtSizePolicyPropertyManager::subIntPropertyManager() const
5366{
5367 return d_ptr->m_intPropertyManager;
5368}
5369
5370/*!
5371 Returns the manager that creates the nested \e horizontalPolicy
5372 and \e verticalPolicy subproperties.
5373
5374 In order to provide editing widgets for the mentioned subproperties
5375 in a property browser widget, this manager must be associated with
5376 an editor factory.
5377
5378 \sa QtAbstractPropertyBrowser::setFactoryForManager()
5379*/
5380QtEnumPropertyManager *QtSizePolicyPropertyManager::subEnumPropertyManager() const
5381{
5382 return d_ptr->m_enumPropertyManager;
5383}
5384
5385/*!
5386 Returns the given \a property's value.
5387
5388 If the given property is not managed by this manager, this
5389 function returns the default size policy.
5390
5391 \sa setValue()
5392*/
5393QSizePolicy QtSizePolicyPropertyManager::value(const QtProperty *property) const
5394{
5395 return d_ptr->m_values.value(property, QSizePolicy());
5396}
5397
5398/*!
5399 \reimp
5400*/
5401QString QtSizePolicyPropertyManager::valueText(const QtProperty *property) const
5402{
5403 const QtSizePolicyPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
5404 if (it == d_ptr->m_values.constEnd())
5405 return QString();
5406
5407 const QSizePolicy sp = it.value();
5408 const QtMetaEnumProvider *mep = metaEnumProvider();
5409 const int hIndex = mep->sizePolicyToIndex(sp.horizontalPolicy());
5410 const int vIndex = mep->sizePolicyToIndex(sp.verticalPolicy());
5411 //! Unknown size policy on reading invalid uic3 files
5412 const QString hPolicy = hIndex != -1 ? mep->policyEnumNames().at(hIndex) : tr("<Invalid>");
5413 const QString vPolicy = vIndex != -1 ? mep->policyEnumNames().at(vIndex) : tr("<Invalid>");
5414 const QString str = tr("[%1, %2, %3, %4]").arg(hPolicy, vPolicy).arg(sp.horizontalStretch()).arg(sp.verticalStretch());
5415 return str;
5416}
5417
5418/*!
5419 \fn void QtSizePolicyPropertyManager::setValue(QtProperty *property, const QSizePolicy &value)
5420
5421 Sets the value of the given \a property to \a value. Nested
5422 properties are updated automatically.
5423
5424 \sa value(), valueChanged()
5425*/
5426void QtSizePolicyPropertyManager::setValue(QtProperty *property, const QSizePolicy &val)
5427{
5428 const QtSizePolicyPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
5429 if (it == d_ptr->m_values.end())
5430 return;
5431
5432 if (it.value() == val)
5433 return;
5434
5435 it.value() = val;
5436
5437 d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToHPolicy[property],
5438 metaEnumProvider()->sizePolicyToIndex(val.horizontalPolicy()));
5439 d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToVPolicy[property],
5440 metaEnumProvider()->sizePolicyToIndex(val.verticalPolicy()));
5441 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToHStretch[property],
5442 val.horizontalStretch());
5443 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToVStretch[property],
5444 val.verticalStretch());
5445
5446 emit propertyChanged(property);
5447 emit valueChanged(property, val);
5448}
5449
5450/*!
5451 \reimp
5452*/
5453void QtSizePolicyPropertyManager::initializeProperty(QtProperty *property)
5454{
5455 QSizePolicy val;
5456 d_ptr->m_values[property] = val;
5457
5458 QtProperty *hPolicyProp = d_ptr->m_enumPropertyManager->addProperty();
5459 hPolicyProp->setPropertyName(tr("Horizontal Policy"));
5460 d_ptr->m_enumPropertyManager->setEnumNames(hPolicyProp, metaEnumProvider()->policyEnumNames());
5461 d_ptr->m_enumPropertyManager->setValue(hPolicyProp,
5462 metaEnumProvider()->sizePolicyToIndex(val.horizontalPolicy()));
5463 d_ptr->m_propertyToHPolicy[property] = hPolicyProp;
5464 d_ptr->m_hPolicyToProperty[hPolicyProp] = property;
5465 property->addSubProperty(hPolicyProp);
5466
5467 QtProperty *vPolicyProp = d_ptr->m_enumPropertyManager->addProperty();
5468 vPolicyProp->setPropertyName(tr("Vertical Policy"));
5469 d_ptr->m_enumPropertyManager->setEnumNames(vPolicyProp, metaEnumProvider()->policyEnumNames());
5470 d_ptr->m_enumPropertyManager->setValue(vPolicyProp,
5471 metaEnumProvider()->sizePolicyToIndex(val.verticalPolicy()));
5472 d_ptr->m_propertyToVPolicy[property] = vPolicyProp;
5473 d_ptr->m_vPolicyToProperty[vPolicyProp] = property;
5474 property->addSubProperty(vPolicyProp);
5475
5476 QtProperty *hStretchProp = d_ptr->m_intPropertyManager->addProperty();
5477 hStretchProp->setPropertyName(tr("Horizontal Stretch"));
5478 d_ptr->m_intPropertyManager->setValue(hStretchProp, val.horizontalStretch());
5479 d_ptr->m_intPropertyManager->setRange(hStretchProp, 0, 0xff);
5480 d_ptr->m_propertyToHStretch[property] = hStretchProp;
5481 d_ptr->m_hStretchToProperty[hStretchProp] = property;
5482 property->addSubProperty(hStretchProp);
5483
5484 QtProperty *vStretchProp = d_ptr->m_intPropertyManager->addProperty();
5485 vStretchProp->setPropertyName(tr("Vertical Stretch"));
5486 d_ptr->m_intPropertyManager->setValue(vStretchProp, val.verticalStretch());
5487 d_ptr->m_intPropertyManager->setRange(vStretchProp, 0, 0xff);
5488 d_ptr->m_propertyToVStretch[property] = vStretchProp;
5489 d_ptr->m_vStretchToProperty[vStretchProp] = property;
5490 property->addSubProperty(vStretchProp);
5491
5492}
5493
5494/*!
5495 \reimp
5496*/
5497void QtSizePolicyPropertyManager::uninitializeProperty(QtProperty *property)
5498{
5499 QtProperty *hPolicyProp = d_ptr->m_propertyToHPolicy[property];
5500 if (hPolicyProp) {
5501 d_ptr->m_hPolicyToProperty.remove(hPolicyProp);
5502 delete hPolicyProp;
5503 }
5504 d_ptr->m_propertyToHPolicy.remove(property);
5505
5506 QtProperty *vPolicyProp = d_ptr->m_propertyToVPolicy[property];
5507 if (vPolicyProp) {
5508 d_ptr->m_vPolicyToProperty.remove(vPolicyProp);
5509 delete vPolicyProp;
5510 }
5511 d_ptr->m_propertyToVPolicy.remove(property);
5512
5513 QtProperty *hStretchProp = d_ptr->m_propertyToHStretch[property];
5514 if (hStretchProp) {
5515 d_ptr->m_hStretchToProperty.remove(hStretchProp);
5516 delete hStretchProp;
5517 }
5518 d_ptr->m_propertyToHStretch.remove(property);
5519
5520 QtProperty *vStretchProp = d_ptr->m_propertyToVStretch[property];
5521 if (vStretchProp) {
5522 d_ptr->m_vStretchToProperty.remove(vStretchProp);
5523 delete vStretchProp;
5524 }
5525 d_ptr->m_propertyToVStretch.remove(property);
5526
5527 d_ptr->m_values.remove(property);
5528}
5529
5530// QtFontPropertyManager:
5531// QtFontPropertyManagerPrivate has a mechanism for reacting
5532// to QApplication::fontDatabaseChanged() [4.5], which is emitted
5533// when someone loads an application font. The signals are compressed
5534// using a timer with interval 0, which then causes the family
5535// enumeration manager to re-set its strings and index values
5536// for each property.
5537
5538Q_GLOBAL_STATIC(QFontDatabase, fontDatabase)
5539
5540class QtFontPropertyManagerPrivate
5541{
5542 QtFontPropertyManager *q_ptr;
5543 Q_DECLARE_PUBLIC(QtFontPropertyManager)
5544public:
5545
5546 QtFontPropertyManagerPrivate();
5547
5548 void slotIntChanged(QtProperty *property, int value);
5549 void slotEnumChanged(QtProperty *property, int value);
5550 void slotBoolChanged(QtProperty *property, bool value);
5551 void slotPropertyDestroyed(QtProperty *property);
5552 void slotFontDatabaseChanged();
5553 void slotFontDatabaseDelayedChange();
5554
5555 QStringList m_familyNames;
5556
5557 typedef QMap<const QtProperty *, QFont> PropertyValueMap;
5558 PropertyValueMap m_values;
5559
5560 QtIntPropertyManager *m_intPropertyManager;
5561 QtEnumPropertyManager *m_enumPropertyManager;
5562 QtBoolPropertyManager *m_boolPropertyManager;
5563
5564 QMap<const QtProperty *, QtProperty *> m_propertyToFamily;
5565 QMap<const QtProperty *, QtProperty *> m_propertyToPointSize;
5566 QMap<const QtProperty *, QtProperty *> m_propertyToBold;
5567 QMap<const QtProperty *, QtProperty *> m_propertyToItalic;
5568 QMap<const QtProperty *, QtProperty *> m_propertyToUnderline;
5569 QMap<const QtProperty *, QtProperty *> m_propertyToStrikeOut;
5570 QMap<const QtProperty *, QtProperty *> m_propertyToKerning;
5571
5572 QMap<const QtProperty *, QtProperty *> m_familyToProperty;
5573 QMap<const QtProperty *, QtProperty *> m_pointSizeToProperty;
5574 QMap<const QtProperty *, QtProperty *> m_boldToProperty;
5575 QMap<const QtProperty *, QtProperty *> m_italicToProperty;
5576 QMap<const QtProperty *, QtProperty *> m_underlineToProperty;
5577 QMap<const QtProperty *, QtProperty *> m_strikeOutToProperty;
5578 QMap<const QtProperty *, QtProperty *> m_kerningToProperty;
5579
5580 bool m_settingValue;
5581 QTimer *m_fontDatabaseChangeTimer;
5582};
5583
5584QtFontPropertyManagerPrivate::QtFontPropertyManagerPrivate() :
5585 m_settingValue(false),
5586 m_fontDatabaseChangeTimer(0)
5587{
5588}
5589
5590void QtFontPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
5591{
5592 if (m_settingValue)
5593 return;
5594 if (QtProperty *prop = m_pointSizeToProperty.value(property, 0)) {
5595 QFont f = m_values[prop];
5596 f.setPointSize(value);
5597 q_ptr->setValue(prop, f);
5598 }
5599}
5600
5601void QtFontPropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value)
5602{
5603 if (m_settingValue)
5604 return;
5605 if (QtProperty *prop = m_familyToProperty.value(property, 0)) {
5606 QFont f = m_values[prop];
5607 f.setFamily(m_familyNames.at(value));
5608 q_ptr->setValue(prop, f);
5609 }
5610}
5611
5612void QtFontPropertyManagerPrivate::slotBoolChanged(QtProperty *property, bool value)
5613{
5614 if (m_settingValue)
5615 return;
5616 if (QtProperty *prop = m_boldToProperty.value(property, 0)) {
5617 QFont f = m_values[prop];
5618 f.setBold(value);
5619 q_ptr->setValue(prop, f);
5620 } else if (QtProperty *prop = m_italicToProperty.value(property, 0)) {
5621 QFont f = m_values[prop];
5622 f.setItalic(value);
5623 q_ptr->setValue(prop, f);
5624 } else if (QtProperty *prop = m_underlineToProperty.value(property, 0)) {
5625 QFont f = m_values[prop];
5626 f.setUnderline(value);
5627 q_ptr->setValue(prop, f);
5628 } else if (QtProperty *prop = m_strikeOutToProperty.value(property, 0)) {
5629 QFont f = m_values[prop];
5630 f.setStrikeOut(value);
5631 q_ptr->setValue(prop, f);
5632 } else if (QtProperty *prop = m_kerningToProperty.value(property, 0)) {
5633 QFont f = m_values[prop];
5634 f.setKerning(value);
5635 q_ptr->setValue(prop, f);
5636 }
5637}
5638
5639void QtFontPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
5640{
5641 if (QtProperty *pointProp = m_pointSizeToProperty.value(property, 0)) {
5642 m_propertyToPointSize[pointProp] = 0;
5643 m_pointSizeToProperty.remove(property);
5644 } else if (QtProperty *pointProp = m_familyToProperty.value(property, 0)) {
5645 m_propertyToFamily[pointProp] = 0;
5646 m_familyToProperty.remove(property);
5647 } else if (QtProperty *pointProp = m_boldToProperty.value(property, 0)) {
5648 m_propertyToBold[pointProp] = 0;
5649 m_boldToProperty.remove(property);
5650 } else if (QtProperty *pointProp = m_italicToProperty.value(property, 0)) {
5651 m_propertyToItalic[pointProp] = 0;
5652 m_italicToProperty.remove(property);
5653 } else if (QtProperty *pointProp = m_underlineToProperty.value(property, 0)) {
5654 m_propertyToUnderline[pointProp] = 0;
5655 m_underlineToProperty.remove(property);
5656 } else if (QtProperty *pointProp = m_strikeOutToProperty.value(property, 0)) {
5657 m_propertyToStrikeOut[pointProp] = 0;
5658 m_strikeOutToProperty.remove(property);
5659 } else if (QtProperty *pointProp = m_kerningToProperty.value(property, 0)) {
5660 m_propertyToKerning[pointProp] = 0;
5661 m_kerningToProperty.remove(property);
5662 }
5663}
5664
5665void QtFontPropertyManagerPrivate::slotFontDatabaseChanged()
5666{
5667 if (!m_fontDatabaseChangeTimer) {
5668 m_fontDatabaseChangeTimer = new QTimer(q_ptr);
5669 m_fontDatabaseChangeTimer->setInterval(0);
5670 m_fontDatabaseChangeTimer->setSingleShot(true);
5671 QObject::connect(m_fontDatabaseChangeTimer, SIGNAL(timeout()), q_ptr, SLOT(slotFontDatabaseDelayedChange()));
5672 }
5673 if (!m_fontDatabaseChangeTimer->isActive())
5674 m_fontDatabaseChangeTimer->start();
5675}
5676
5677void QtFontPropertyManagerPrivate::slotFontDatabaseDelayedChange()
5678{
5679 typedef QMap<const QtProperty *, QtProperty *> PropertyPropertyMap;
5680 // rescan available font names
5681 const QStringList oldFamilies = m_familyNames;
5682 m_familyNames = fontDatabase()->families();
5683
5684 // Adapt all existing properties
5685 if (!m_propertyToFamily.empty()) {
5686 PropertyPropertyMap::const_iterator cend = m_propertyToFamily.constEnd();
5687 for (PropertyPropertyMap::const_iterator it = m_propertyToFamily.constBegin(); it != cend; ++it) {
5688 QtProperty *familyProp = it.value();
5689 const int oldIdx = m_enumPropertyManager->value(familyProp);
5690 int newIdx = m_familyNames.indexOf(oldFamilies.at(oldIdx));
5691 if (newIdx < 0)
5692 newIdx = 0;
5693 m_enumPropertyManager->setEnumNames(familyProp, m_familyNames);
5694 m_enumPropertyManager->setValue(familyProp, newIdx);
5695 }
5696 }
5697}
5698
5699/*!
5700 \class QtFontPropertyManager
5701 \internal
5702 \inmodule QtDesigner
5703 \since 4.4
5704
5705 \brief The QtFontPropertyManager provides and manages QFont properties.
5706
5707 A font property has nested \e family, \e pointSize, \e bold, \e
5708 italic, \e underline, \e strikeOut and \e kerning subproperties. The top-level
5709 property's value can be retrieved using the value() function, and
5710 set using the setValue() slot.
5711
5712 The subproperties are created by QtIntPropertyManager, QtEnumPropertyManager and
5713 QtBoolPropertyManager objects. These managers can be retrieved using the
5714 corresponding subIntPropertyManager(), subEnumPropertyManager() and
5715 subBoolPropertyManager() functions. In order to provide editing widgets
5716 for the subproperties in a property browser widget, these managers
5717 must be associated with editor factories.
5718
5719 In addition, QtFontPropertyManager provides the valueChanged() signal
5720 which is emitted whenever a property created by this manager
5721 changes.
5722
5723 \sa QtAbstractPropertyManager, QtEnumPropertyManager, QtIntPropertyManager, QtBoolPropertyManager
5724*/
5725
5726/*!
5727 \fn void QtFontPropertyManager::valueChanged(QtProperty *property, const QFont &value)
5728
5729 This signal is emitted whenever a property created by this manager
5730 changes its value, passing a pointer to the \a property and the
5731 new \a value as parameters.
5732
5733 \sa setValue()
5734*/
5735
5736/*!
5737 Creates a manager with the given \a parent.
5738*/
5739QtFontPropertyManager::QtFontPropertyManager(QObject *parent)
5740 : QtAbstractPropertyManager(parent), d_ptr(new QtFontPropertyManagerPrivate)
5741{
5742 d_ptr->q_ptr = this;
5743 QObject::connect(qApp, SIGNAL(fontDatabaseChanged()), this, SLOT(slotFontDatabaseChanged()));
5744
5745 d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
5746 connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
5747 this, SLOT(slotIntChanged(QtProperty*,int)));
5748 d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this);
5749 connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
5750 this, SLOT(slotEnumChanged(QtProperty*,int)));
5751 d_ptr->m_boolPropertyManager = new QtBoolPropertyManager(this);
5752 connect(d_ptr->m_boolPropertyManager, SIGNAL(valueChanged(QtProperty*,bool)),
5753 this, SLOT(slotBoolChanged(QtProperty*,bool)));
5754
5755 connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
5756 this, SLOT(slotPropertyDestroyed(QtProperty*)));
5757 connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
5758 this, SLOT(slotPropertyDestroyed(QtProperty*)));
5759 connect(d_ptr->m_boolPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
5760 this, SLOT(slotPropertyDestroyed(QtProperty*)));
5761}
5762
5763/*!
5764 Destroys this manager, and all the properties it has created.
5765*/
5766QtFontPropertyManager::~QtFontPropertyManager()
5767{
5768 clear();
5769}
5770
5771/*!
5772 Returns the manager that creates the \e pointSize subproperty.
5773
5774 In order to provide editing widgets for the \e pointSize property
5775 in a property browser widget, this manager must be associated
5776 with an editor factory.
5777
5778 \sa QtAbstractPropertyBrowser::setFactoryForManager()
5779*/
5780QtIntPropertyManager *QtFontPropertyManager::subIntPropertyManager() const
5781{
5782 return d_ptr->m_intPropertyManager;
5783}
5784
5785/*!
5786 Returns the manager that create the \e family subproperty.
5787
5788 In order to provide editing widgets for the \e family property
5789 in a property browser widget, this manager must be associated
5790 with an editor factory.
5791
5792 \sa QtAbstractPropertyBrowser::setFactoryForManager()
5793*/
5794QtEnumPropertyManager *QtFontPropertyManager::subEnumPropertyManager() const
5795{
5796 return d_ptr->m_enumPropertyManager;
5797}
5798
5799/*!
5800 Returns the manager that creates the \e bold, \e italic, \e underline,
5801 \e strikeOut and \e kerning subproperties.
5802
5803 In order to provide editing widgets for the mentioned properties
5804 in a property browser widget, this manager must be associated with
5805 an editor factory.
5806
5807 \sa QtAbstractPropertyBrowser::setFactoryForManager()
5808*/
5809QtBoolPropertyManager *QtFontPropertyManager::subBoolPropertyManager() const
5810{
5811 return d_ptr->m_boolPropertyManager;
5812}
5813
5814/*!
5815 Returns the given \a property's value.
5816
5817 If the given property is not managed by this manager, this
5818 function returns a font object that uses the application's default
5819 font.
5820
5821 \sa setValue()
5822*/
5823QFont QtFontPropertyManager::value(const QtProperty *property) const
5824{
5825 return d_ptr->m_values.value(property, QFont());
5826}
5827
5828/*!
5829 \reimp
5830*/
5831QString QtFontPropertyManager::valueText(const QtProperty *property) const
5832{
5833 const QtFontPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
5834 if (it == d_ptr->m_values.constEnd())
5835 return QString();
5836
5837 return QtPropertyBrowserUtils::fontValueText(it.value());
5838}
5839
5840/*!
5841 \reimp
5842*/
5843QIcon QtFontPropertyManager::valueIcon(const QtProperty *property) const
5844{
5845 const QtFontPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
5846 if (it == d_ptr->m_values.constEnd())
5847 return QIcon();
5848
5849 return QtPropertyBrowserUtils::fontValueIcon(it.value());
5850}
5851
5852/*!
5853 \fn void QtFontPropertyManager::setValue(QtProperty *property, const QFont &value)
5854
5855 Sets the value of the given \a property to \a value. Nested
5856 properties are updated automatically.
5857
5858 \sa value(), valueChanged()
5859*/
5860void QtFontPropertyManager::setValue(QtProperty *property, const QFont &val)
5861{
5862 const QtFontPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
5863 if (it == d_ptr->m_values.end())
5864 return;
5865
5866 const QFont oldVal = it.value();
5867 if (oldVal == val && oldVal.resolve() == val.resolve())
5868 return;
5869
5870 it.value() = val;
5871
5872 int idx = d_ptr->m_familyNames.indexOf(val.family());
5873 if (idx == -1)
5874 idx = 0;
5875 bool settingValue = d_ptr->m_settingValue;
5876 d_ptr->m_settingValue = true;
5877 d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToFamily[property], idx);
5878 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToPointSize[property], val.pointSize());
5879 d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToBold[property], val.bold());
5880 d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToItalic[property], val.italic());
5881 d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToUnderline[property], val.underline());
5882 d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToStrikeOut[property], val.strikeOut());
5883 d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToKerning[property], val.kerning());
5884 d_ptr->m_settingValue = settingValue;
5885
5886 emit propertyChanged(property);
5887 emit valueChanged(property, val);
5888}
5889
5890/*!
5891 \reimp
5892*/
5893void QtFontPropertyManager::initializeProperty(QtProperty *property)
5894{
5895 QFont val;
5896 d_ptr->m_values[property] = val;
5897
5898 QtProperty *familyProp = d_ptr->m_enumPropertyManager->addProperty();
5899 familyProp->setPropertyName(tr("Family"));
5900 if (d_ptr->m_familyNames.empty())
5901 d_ptr->m_familyNames = fontDatabase()->families();
5902 d_ptr->m_enumPropertyManager->setEnumNames(familyProp, d_ptr->m_familyNames);
5903 int idx = d_ptr->m_familyNames.indexOf(val.family());
5904 if (idx == -1)
5905 idx = 0;
5906 d_ptr->m_enumPropertyManager->setValue(familyProp, idx);
5907 d_ptr->m_propertyToFamily[property] = familyProp;
5908 d_ptr->m_familyToProperty[familyProp] = property;
5909 property->addSubProperty(familyProp);
5910
5911 QtProperty *pointSizeProp = d_ptr->m_intPropertyManager->addProperty();
5912 pointSizeProp->setPropertyName(tr("Point Size"));
5913 d_ptr->m_intPropertyManager->setValue(pointSizeProp, val.pointSize());
5914 d_ptr->m_intPropertyManager->setMinimum(pointSizeProp, 1);
5915 d_ptr->m_propertyToPointSize[property] = pointSizeProp;
5916 d_ptr->m_pointSizeToProperty[pointSizeProp] = property;
5917 property->addSubProperty(pointSizeProp);
5918
5919 QtProperty *boldProp = d_ptr->m_boolPropertyManager->addProperty();
5920 boldProp->setPropertyName(tr("Bold"));
5921 d_ptr->m_boolPropertyManager->setValue(boldProp, val.bold());
5922 d_ptr->m_propertyToBold[property] = boldProp;
5923 d_ptr->m_boldToProperty[boldProp] = property;
5924 property->addSubProperty(boldProp);
5925
5926 QtProperty *italicProp = d_ptr->m_boolPropertyManager->addProperty();
5927 italicProp->setPropertyName(tr("Italic"));
5928 d_ptr->m_boolPropertyManager->setValue(italicProp, val.italic());
5929 d_ptr->m_propertyToItalic[property] = italicProp;
5930 d_ptr->m_italicToProperty[italicProp] = property;
5931 property->addSubProperty(italicProp);
5932
5933 QtProperty *underlineProp = d_ptr->m_boolPropertyManager->addProperty();
5934 underlineProp->setPropertyName(tr("Underline"));
5935 d_ptr->m_boolPropertyManager->setValue(underlineProp, val.underline());
5936 d_ptr->m_propertyToUnderline[property] = underlineProp;
5937 d_ptr->m_underlineToProperty[underlineProp] = property;
5938 property->addSubProperty(underlineProp);
5939
5940 QtProperty *strikeOutProp = d_ptr->m_boolPropertyManager->addProperty();
5941 strikeOutProp->setPropertyName(tr("Strikeout"));
5942 d_ptr->m_boolPropertyManager->setValue(strikeOutProp, val.strikeOut());
5943 d_ptr->m_propertyToStrikeOut[property] = strikeOutProp;
5944 d_ptr->m_strikeOutToProperty[strikeOutProp] = property;
5945 property->addSubProperty(strikeOutProp);
5946
5947 QtProperty *kerningProp = d_ptr->m_boolPropertyManager->addProperty();
5948 kerningProp->setPropertyName(tr("Kerning"));
5949 d_ptr->m_boolPropertyManager->setValue(kerningProp, val.kerning());
5950 d_ptr->m_propertyToKerning[property] = kerningProp;
5951 d_ptr->m_kerningToProperty[kerningProp] = property;
5952 property->addSubProperty(kerningProp);
5953}
5954
5955/*!
5956 \reimp
5957*/
5958void QtFontPropertyManager::uninitializeProperty(QtProperty *property)
5959{
5960 QtProperty *familyProp = d_ptr->m_propertyToFamily[property];
5961 if (familyProp) {
5962 d_ptr->m_familyToProperty.remove(familyProp);
5963 delete familyProp;
5964 }
5965 d_ptr->m_propertyToFamily.remove(property);
5966
5967 QtProperty *pointSizeProp = d_ptr->m_propertyToPointSize[property];
5968 if (pointSizeProp) {
5969 d_ptr->m_pointSizeToProperty.remove(pointSizeProp);
5970 delete pointSizeProp;
5971 }
5972 d_ptr->m_propertyToPointSize.remove(property);
5973
5974 QtProperty *boldProp = d_ptr->m_propertyToBold[property];
5975 if (boldProp) {
5976 d_ptr->m_boldToProperty.remove(boldProp);
5977 delete boldProp;
5978 }
5979 d_ptr->m_propertyToBold.remove(property);
5980
5981 QtProperty *italicProp = d_ptr->m_propertyToItalic[property];
5982 if (italicProp) {
5983 d_ptr->m_italicToProperty.remove(italicProp);
5984 delete italicProp;
5985 }
5986 d_ptr->m_propertyToItalic.remove(property);
5987
5988 QtProperty *underlineProp = d_ptr->m_propertyToUnderline[property];
5989 if (underlineProp) {
5990 d_ptr->m_underlineToProperty.remove(underlineProp);
5991 delete underlineProp;
5992 }
5993 d_ptr->m_propertyToUnderline.remove(property);
5994
5995 QtProperty *strikeOutProp = d_ptr->m_propertyToStrikeOut[property];
5996 if (strikeOutProp) {
5997 d_ptr->m_strikeOutToProperty.remove(strikeOutProp);
5998 delete strikeOutProp;
5999 }
6000 d_ptr->m_propertyToStrikeOut.remove(property);
6001
6002 QtProperty *kerningProp = d_ptr->m_propertyToKerning[property];
6003 if (kerningProp) {
6004 d_ptr->m_kerningToProperty.remove(kerningProp);
6005 delete kerningProp;
6006 }
6007 d_ptr->m_propertyToKerning.remove(property);
6008
6009 d_ptr->m_values.remove(property);
6010}
6011
6012// QtColorPropertyManager
6013
6014class QtColorPropertyManagerPrivate
6015{
6016 QtColorPropertyManager *q_ptr;
6017 Q_DECLARE_PUBLIC(QtColorPropertyManager)
6018public:
6019
6020 void slotIntChanged(QtProperty *property, int value);
6021 void slotPropertyDestroyed(QtProperty *property);
6022
6023 typedef QMap<const QtProperty *, QColor> PropertyValueMap;
6024 PropertyValueMap m_values;
6025
6026 QtIntPropertyManager *m_intPropertyManager;
6027
6028 QMap<const QtProperty *, QtProperty *> m_propertyToR;
6029 QMap<const QtProperty *, QtProperty *> m_propertyToG;
6030 QMap<const QtProperty *, QtProperty *> m_propertyToB;
6031 QMap<const QtProperty *, QtProperty *> m_propertyToA;
6032
6033 QMap<const QtProperty *, QtProperty *> m_rToProperty;
6034 QMap<const QtProperty *, QtProperty *> m_gToProperty;
6035 QMap<const QtProperty *, QtProperty *> m_bToProperty;
6036 QMap<const QtProperty *, QtProperty *> m_aToProperty;
6037};
6038
6039void QtColorPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
6040{
6041 if (QtProperty *prop = m_rToProperty.value(property, 0)) {
6042 QColor c = m_values[prop];
6043 c.setRed(value);
6044 q_ptr->setValue(prop, c);
6045 } else if (QtProperty *prop = m_gToProperty.value(property, 0)) {
6046 QColor c = m_values[prop];
6047 c.setGreen(value);
6048 q_ptr->setValue(prop, c);
6049 } else if (QtProperty *prop = m_bToProperty.value(property, 0)) {
6050 QColor c = m_values[prop];
6051 c.setBlue(value);
6052 q_ptr->setValue(prop, c);
6053 } else if (QtProperty *prop = m_aToProperty.value(property, 0)) {
6054 QColor c = m_values[prop];
6055 c.setAlpha(value);
6056 q_ptr->setValue(prop, c);
6057 }
6058}
6059
6060void QtColorPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
6061{
6062 if (QtProperty *pointProp = m_rToProperty.value(property, 0)) {
6063 m_propertyToR[pointProp] = 0;
6064 m_rToProperty.remove(property);
6065 } else if (QtProperty *pointProp = m_gToProperty.value(property, 0)) {
6066 m_propertyToG[pointProp] = 0;
6067 m_gToProperty.remove(property);
6068 } else if (QtProperty *pointProp = m_bToProperty.value(property, 0)) {
6069 m_propertyToB[pointProp] = 0;
6070 m_bToProperty.remove(property);
6071 } else if (QtProperty *pointProp = m_aToProperty.value(property, 0)) {
6072 m_propertyToA[pointProp] = 0;
6073 m_aToProperty.remove(property);
6074 }
6075}
6076
6077/*!
6078 \class QtColorPropertyManager
6079 \internal
6080 \inmodule QtDesigner
6081 \since 4.4
6082
6083 \brief The QtColorPropertyManager provides and manages QColor properties.
6084
6085 A color property has nested \e red, \e green and \e blue
6086 subproperties. The top-level property's value can be retrieved
6087 using the value() function, and set using the setValue() slot.
6088
6089 The subproperties are created by a QtIntPropertyManager object. This
6090 manager can be retrieved using the subIntPropertyManager() function. In
6091 order to provide editing widgets for the subproperties in a
6092 property browser widget, this manager must be associated with an
6093 editor factory.
6094
6095 In addition, QtColorPropertyManager provides the valueChanged() signal
6096 which is emitted whenever a property created by this manager
6097 changes.
6098
6099 \sa QtAbstractPropertyManager, QtAbstractPropertyBrowser, QtIntPropertyManager
6100*/
6101
6102/*!
6103 \fn void QtColorPropertyManager::valueChanged(QtProperty *property, const QColor &value)
6104
6105 This signal is emitted whenever a property created by this manager
6106 changes its value, passing a pointer to the \a property and the new
6107 \a value as parameters.
6108
6109 \sa setValue()
6110*/
6111
6112/*!
6113 Creates a manager with the given \a parent.
6114*/
6115QtColorPropertyManager::QtColorPropertyManager(QObject *parent)
6116 : QtAbstractPropertyManager(parent), d_ptr(new QtColorPropertyManagerPrivate)
6117{
6118 d_ptr->q_ptr = this;
6119
6120 d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
6121 connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
6122 this, SLOT(slotIntChanged(QtProperty*,int)));
6123
6124 connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
6125 this, SLOT(slotPropertyDestroyed(QtProperty*)));
6126}
6127
6128/*!
6129 Destroys this manager, and all the properties it has created.
6130*/
6131QtColorPropertyManager::~QtColorPropertyManager()
6132{
6133 clear();
6134}
6135
6136/*!
6137 Returns the manager that produces the nested \e red, \e green and
6138 \e blue subproperties.
6139
6140 In order to provide editing widgets for the subproperties in a
6141 property browser widget, this manager must be associated with an
6142 editor factory.
6143
6144 \sa QtAbstractPropertyBrowser::setFactoryForManager()
6145*/
6146QtIntPropertyManager *QtColorPropertyManager::subIntPropertyManager() const
6147{
6148 return d_ptr->m_intPropertyManager;
6149}
6150
6151/*!
6152 Returns the given \a property's value.
6153
6154 If the given \a property is not managed by \e this manager, this
6155 function returns an invalid color.
6156
6157 \sa setValue()
6158*/
6159QColor QtColorPropertyManager::value(const QtProperty *property) const
6160{
6161 return d_ptr->m_values.value(property, QColor());
6162}
6163
6164/*!
6165 \reimp
6166*/
6167
6168QString QtColorPropertyManager::valueText(const QtProperty *property) const
6169{
6170 const QtColorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
6171 if (it == d_ptr->m_values.constEnd())
6172 return QString();
6173
6174 return QtPropertyBrowserUtils::colorValueText(it.value());
6175}
6176
6177/*!
6178 \reimp
6179*/
6180
6181QIcon QtColorPropertyManager::valueIcon(const QtProperty *property) const
6182{
6183 const QtColorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
6184 if (it == d_ptr->m_values.constEnd())
6185 return QIcon();
6186 return QtPropertyBrowserUtils::brushValueIcon(QBrush(it.value()));
6187}
6188
6189/*!
6190 \fn void QtColorPropertyManager::setValue(QtProperty *property, const QColor &value)
6191
6192 Sets the value of the given \a property to \a value. Nested
6193 properties are updated automatically.
6194
6195 \sa value(), valueChanged()
6196*/
6197void QtColorPropertyManager::setValue(QtProperty *property, const QColor &val)
6198{
6199 const QtColorPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
6200 if (it == d_ptr->m_values.end())
6201 return;
6202
6203 if (it.value() == val)
6204 return;
6205
6206 it.value() = val;
6207
6208 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToR[property], val.red());
6209 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToG[property], val.green());
6210 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToB[property], val.blue());
6211 d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToA[property], val.alpha());
6212
6213 emit propertyChanged(property);
6214 emit valueChanged(property, val);
6215}
6216
6217/*!
6218 \reimp
6219*/
6220void QtColorPropertyManager::initializeProperty(QtProperty *property)
6221{
6222 QColor val;
6223 d_ptr->m_values[property] = val;
6224
6225 QtProperty *rProp = d_ptr->m_intPropertyManager->addProperty();
6226 rProp->setPropertyName(tr("Red"));
6227 d_ptr->m_intPropertyManager->setValue(rProp, val.red());
6228 d_ptr->m_intPropertyManager->setRange(rProp, 0, 0xFF);
6229 d_ptr->m_propertyToR[property] = rProp;
6230 d_ptr->m_rToProperty[rProp] = property;
6231 property->addSubProperty(rProp);
6232
6233 QtProperty *gProp = d_ptr->m_intPropertyManager->addProperty();
6234 gProp->setPropertyName(tr("Green"));
6235 d_ptr->m_intPropertyManager->setValue(gProp, val.green());
6236 d_ptr->m_intPropertyManager->setRange(gProp, 0, 0xFF);
6237 d_ptr->m_propertyToG[property] = gProp;
6238 d_ptr->m_gToProperty[gProp] = property;
6239 property->addSubProperty(gProp);
6240
6241 QtProperty *bProp = d_ptr->m_intPropertyManager->addProperty();
6242 bProp->setPropertyName(tr("Blue"));
6243 d_ptr->m_intPropertyManager->setValue(bProp, val.blue());
6244 d_ptr->m_intPropertyManager->setRange(bProp, 0, 0xFF);
6245 d_ptr->m_propertyToB[property] = bProp;
6246 d_ptr->m_bToProperty[bProp] = property;
6247 property->addSubProperty(bProp);
6248
6249 QtProperty *aProp = d_ptr->m_intPropertyManager->addProperty();
6250 aProp->setPropertyName(tr("Alpha"));
6251 d_ptr->m_intPropertyManager->setValue(aProp, val.alpha());
6252 d_ptr->m_intPropertyManager->setRange(aProp, 0, 0xFF);
6253 d_ptr->m_propertyToA[property] = aProp;
6254 d_ptr->m_aToProperty[aProp] = property;
6255 property->addSubProperty(aProp);
6256}
6257
6258/*!
6259 \reimp
6260*/
6261void QtColorPropertyManager::uninitializeProperty(QtProperty *property)
6262{
6263 QtProperty *rProp = d_ptr->m_propertyToR[property];
6264 if (rProp) {
6265 d_ptr->m_rToProperty.remove(rProp);
6266 delete rProp;
6267 }
6268 d_ptr->m_propertyToR.remove(property);
6269
6270 QtProperty *gProp = d_ptr->m_propertyToG[property];
6271 if (gProp) {
6272 d_ptr->m_gToProperty.remove(gProp);
6273 delete gProp;
6274 }
6275 d_ptr->m_propertyToG.remove(property);
6276
6277 QtProperty *bProp = d_ptr->m_propertyToB[property];
6278 if (bProp) {
6279 d_ptr->m_bToProperty.remove(bProp);
6280 delete bProp;
6281 }
6282 d_ptr->m_propertyToB.remove(property);
6283
6284 QtProperty *aProp = d_ptr->m_propertyToA[property];
6285 if (aProp) {
6286 d_ptr->m_aToProperty.remove(aProp);
6287 delete aProp;
6288 }
6289 d_ptr->m_propertyToA.remove(property);
6290
6291 d_ptr->m_values.remove(property);
6292}
6293
6294// QtCursorPropertyManager
6295
6296// Make sure icons are removed as soon as QApplication is destroyed, otherwise,
6297// handles are leaked on X11.
6298static void clearCursorDatabase();
6299Q_GLOBAL_STATIC_WITH_INITIALIZER(QtCursorDatabase, cursorDatabase, qAddPostRoutine(clearCursorDatabase))
6300
6301static void clearCursorDatabase()
6302{
6303 cursorDatabase()->clear();
6304}
6305
6306class QtCursorPropertyManagerPrivate
6307{
6308 QtCursorPropertyManager *q_ptr;
6309 Q_DECLARE_PUBLIC(QtCursorPropertyManager)
6310public:
6311 typedef QMap<const QtProperty *, QCursor> PropertyValueMap;
6312 PropertyValueMap m_values;
6313};
6314
6315/*!
6316 \class QtCursorPropertyManager
6317 \internal
6318 \inmodule QtDesigner
6319 \since 4.4
6320
6321 \brief The QtCursorPropertyManager provides and manages QCursor properties.
6322
6323 A cursor property has a current value which can be
6324 retrieved using the value() function, and set using the setValue()
6325 slot. In addition, QtCursorPropertyManager provides the
6326 valueChanged() signal which is emitted whenever a property created
6327 by this manager changes.
6328
6329 \sa QtAbstractPropertyManager
6330*/
6331
6332/*!
6333 \fn void QtCursorPropertyManager::valueChanged(QtProperty *property, const QCursor &value)
6334
6335 This signal is emitted whenever a property created by this manager
6336 changes its value, passing a pointer to the \a property and the new
6337 \a value as parameters.
6338
6339 \sa setValue()
6340*/
6341
6342/*!
6343 Creates a manager with the given \a parent.
6344*/
6345QtCursorPropertyManager::QtCursorPropertyManager(QObject *parent)
6346 : QtAbstractPropertyManager(parent), d_ptr(new QtCursorPropertyManagerPrivate)
6347{
6348 d_ptr->q_ptr = this;
6349}
6350
6351/*!
6352 Destroys this manager, and all the properties it has created.
6353*/
6354QtCursorPropertyManager::~QtCursorPropertyManager()
6355{
6356 clear();
6357}
6358
6359/*!
6360 Returns the given \a property's value.
6361
6362 If the given \a property is not managed by this manager, this
6363 function returns a default QCursor object.
6364
6365 \sa setValue()
6366*/
6367#ifndef QT_NO_CURSOR
6368QCursor QtCursorPropertyManager::value(const QtProperty *property) const
6369{
6370 return d_ptr->m_values.value(property, QCursor());
6371}
6372#endif
6373
6374/*!
6375 \reimp
6376*/
6377QString QtCursorPropertyManager::valueText(const QtProperty *property) const
6378{
6379 const QtCursorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
6380 if (it == d_ptr->m_values.constEnd())
6381 return QString();
6382
6383 return cursorDatabase()->cursorToShapeName(it.value());
6384}
6385
6386/*!
6387 \reimp
6388*/
6389QIcon QtCursorPropertyManager::valueIcon(const QtProperty *property) const
6390{
6391 const QtCursorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
6392 if (it == d_ptr->m_values.constEnd())
6393 return QIcon();
6394
6395 return cursorDatabase()->cursorToShapeIcon(it.value());
6396}
6397
6398/*!
6399 \fn void QtCursorPropertyManager::setValue(QtProperty *property, const QCursor &value)
6400
6401 Sets the value of the given \a property to \a value.
6402
6403 \sa value(), valueChanged()
6404*/
6405void QtCursorPropertyManager::setValue(QtProperty *property, const QCursor &value)
6406{
6407#ifndef QT_NO_CURSOR
6408 const QtCursorPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
6409 if (it == d_ptr->m_values.end())
6410 return;
6411
6412 if (it.value().shape() == value.shape() && value.shape() != Qt::BitmapCursor)
6413 return;
6414
6415 it.value() = value;
6416
6417 emit propertyChanged(property);
6418 emit valueChanged(property, value);
6419#endif
6420}
6421
6422/*!
6423 \reimp
6424*/
6425void QtCursorPropertyManager::initializeProperty(QtProperty *property)
6426{
6427#ifndef QT_NO_CURSOR
6428 d_ptr->m_values[property] = QCursor();
6429#endif
6430}
6431
6432/*!
6433 \reimp
6434*/
6435void QtCursorPropertyManager::uninitializeProperty(QtProperty *property)
6436{
6437 d_ptr->m_values.remove(property);
6438}
6439
6440QT_END_NAMESPACE
6441
6442#include "moc_qtpropertymanager.cpp"
6443#include "qtpropertymanager.moc"
Note: See TracBrowser for help on using the repository browser.