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