/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Designer of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef DESIGNERPROPERTYMANAGER_H #define DESIGNERPROPERTYMANAGER_H #include "qtvariantproperty.h" #include "brushpropertymanager.h" #include "fontpropertymanager.h" #include #include #include #include #include #include QT_BEGIN_NAMESPACE typedef QPair DesignerIntPair; typedef QList DesignerFlagList; class QDesignerFormEditorInterface; class QLineEdit; class QUrl; class QtKeySequenceEdit; namespace qdesigner_internal { class ResetWidget; class TextEditor; class PaletteEditorButton; class PixmapEditor; class StringListEditorButton; class FormWindowBase; class ResetDecorator : public QObject { Q_OBJECT public: ResetDecorator(QObject *parent = 0) : QObject(parent), m_spacing(-1) {} ~ResetDecorator(); void connectPropertyManager(QtAbstractPropertyManager *manager); QWidget *editor(QWidget *subEditor, bool resettable, QtAbstractPropertyManager *manager, QtProperty *property, QWidget *parent); void disconnectPropertyManager(QtAbstractPropertyManager *manager); void setSpacing(int spacing); signals: void resetProperty(QtProperty *property); private slots: void slotPropertyChanged(QtProperty *property); void slotEditorDestroyed(QObject *object); private: QMap > m_createdResetWidgets; QMap m_resetWidgetToProperty; int m_spacing; }; // Helper for handling sub-properties of properties inheriting PropertySheetTranslatableData // (translatable, disambiguation, comment). template class TranslatablePropertyManager { public: void initialize(QtVariantPropertyManager *m, QtProperty *property, const PropertySheetValue &value); bool uninitialize(QtProperty *property); bool destroy(QtProperty *subProperty); bool value(const QtProperty *property, QVariant *rc) const; int valueChanged(QtVariantPropertyManager *m, QtProperty *property, const QVariant &value); int setValue(QtVariantPropertyManager *m, QtProperty *property, int expectedTypeId, const QVariant &value); private: QMap m_values; QMap m_valueToComment; QMap m_valueToTranslatable; QMap m_valueToDisambiguation; QMap m_commentToValue; QMap m_translatableToValue; QMap m_disambiguationToValue; }; class DesignerPropertyManager : public QtVariantPropertyManager { Q_OBJECT public: enum ValueChangedResult { NoMatch, Unchanged, Changed }; explicit DesignerPropertyManager(QDesignerFormEditorInterface *core, QObject *parent = 0); ~DesignerPropertyManager(); virtual QStringList attributes(int propertyType) const; virtual int attributeType(int propertyType, const QString &attribute) const; virtual QVariant attributeValue(const QtProperty *property, const QString &attribute) const; virtual bool isPropertyTypeSupported(int propertyType) const; virtual QVariant value(const QtProperty *property) const; virtual int valueType(int propertyType) const; virtual QString valueText(const QtProperty *property) const; virtual QIcon valueIcon(const QtProperty *property) const; bool resetFontSubProperty(QtProperty *property); bool resetIconSubProperty(QtProperty *subProperty); void reloadResourceProperties(); static int designerFlagTypeId(); static int designerFlagListTypeId(); static int designerAlignmentTypeId(); static int designerPixmapTypeId(); static int designerIconTypeId(); static int designerStringTypeId(); static int designerStringListTypeId(); static int designerKeySequenceTypeId(); void setObject(QObject *object) { m_object = object; } public Q_SLOTS: virtual void setAttribute(QtProperty *property, const QString &attribute, const QVariant &value); virtual void setValue(QtProperty *property, const QVariant &value); Q_SIGNALS: // sourceOfChange - a subproperty (or just property) which caused a change //void valueChanged(QtProperty *property, const QVariant &value, QtProperty *sourceOfChange); void valueChanged(QtProperty *property, const QVariant &value, bool enableSubPropertyHandling); protected: virtual void initializeProperty(QtProperty *property); virtual void uninitializeProperty(QtProperty *property); private Q_SLOTS: void slotValueChanged(QtProperty *property, const QVariant &value); void slotPropertyDestroyed(QtProperty *property); private: void createIconSubProperty(QtProperty *iconProperty, QIcon::Mode mode, QIcon::State state, const QString &subName); typedef QMap PropertyBoolMap; PropertyBoolMap m_resetMap; int bitCount(int mask) const; struct FlagData { FlagData() : val(0) {} uint val; DesignerFlagList flags; QList values; }; typedef QMap PropertyFlagDataMap; PropertyFlagDataMap m_flagValues; typedef QMap > PropertyToPropertyListMap; PropertyToPropertyListMap m_propertyToFlags; QMap m_flagToProperty; int alignToIndexH(uint align) const; int alignToIndexV(uint align) const; uint indexHToAlign(int idx) const; uint indexVToAlign(int idx) const; QString indexHToString(int idx) const; QString indexVToString(int idx) const; QMap m_alignValues; typedef QMap PropertyToPropertyMap; PropertyToPropertyMap m_propertyToAlignH; PropertyToPropertyMap m_propertyToAlignV; PropertyToPropertyMap m_alignHToProperty; PropertyToPropertyMap m_alignVToProperty; QMap, QtProperty *> > m_propertyToIconSubProperties; QMap > m_iconSubPropertyToState; PropertyToPropertyMap m_iconSubPropertyToProperty; PropertyToPropertyMap m_propertyToTheme; TranslatablePropertyManager m_stringManager; TranslatablePropertyManager m_keySequenceManager; TranslatablePropertyManager m_stringListManager; struct PaletteData { QPalette val; QPalette superPalette; }; typedef QMap PropertyPaletteDataMap; PropertyPaletteDataMap m_paletteValues; QMap m_pixmapValues; QMap m_iconValues; QMap m_uintValues; QMap m_longLongValues; QMap m_uLongLongValues; QMap m_urlValues; QMap m_byteArrayValues; typedef QMap PropertyIntMap; PropertyIntMap m_stringAttributes; typedef QMap PropertyFontMap; PropertyFontMap m_stringFontAttributes; PropertyBoolMap m_stringThemeAttributes; BrushPropertyManager m_brushManager; FontPropertyManager m_fontManager; QMap m_defaultPixmaps; QMap m_defaultIcons; bool m_changingSubValue; QDesignerFormEditorInterface *m_core; QObject *m_object; QtProperty *m_sourceOfChange; }; class DesignerEditorFactory : public QtVariantEditorFactory { Q_OBJECT public: explicit DesignerEditorFactory(QDesignerFormEditorInterface *core, QObject *parent = 0); ~DesignerEditorFactory(); void setSpacing(int spacing); void setFormWindowBase(FormWindowBase *fwb); signals: void resetProperty(QtProperty *property); protected: void connectPropertyManager(QtVariantPropertyManager *manager); QWidget *createEditor(QtVariantPropertyManager *manager, QtProperty *property, QWidget *parent); void disconnectPropertyManager(QtVariantPropertyManager *manager); private slots: void slotEditorDestroyed(QObject *object); void slotAttributeChanged(QtProperty *property, const QString &attribute, const QVariant &value); void slotPropertyChanged(QtProperty *property); void slotValueChanged(QtProperty *property, const QVariant &value); void slotStringTextChanged(const QString &value); void slotKeySequenceChanged(const QKeySequence &value); void slotPaletteChanged(const QPalette &value); void slotPixmapChanged(const QString &value); void slotIconChanged(const QString &value); void slotIconThemeChanged(const QString &value); void slotUintChanged(const QString &value); void slotLongLongChanged(const QString &value); void slotULongLongChanged(const QString &value); void slotUrlChanged(const QString &value); void slotByteArrayChanged(const QString &value); void slotStringListChanged(const QStringList &value); private: TextEditor *createTextEditor(QWidget *parent, TextPropertyValidationMode vm, const QString &value); ResetDecorator *m_resetDecorator; bool m_changingPropertyValue; QDesignerFormEditorInterface *m_core; FormWindowBase *m_fwb; int m_spacing; QMap > m_stringPropertyToEditors; QMap m_editorToStringProperty; QMap > m_keySequencePropertyToEditors; QMap m_editorToKeySequenceProperty; QMap > m_palettePropertyToEditors; QMap m_editorToPaletteProperty; QMap > m_pixmapPropertyToEditors; QMap m_editorToPixmapProperty; QMap > m_iconPropertyToEditors; QMap m_editorToIconProperty; QMap > m_uintPropertyToEditors; QMap m_editorToUintProperty; QMap > m_longLongPropertyToEditors; QMap m_editorToLongLongProperty; QMap > m_uLongLongPropertyToEditors; QMap m_editorToULongLongProperty; QMap > m_urlPropertyToEditors; QMap m_editorToUrlProperty; QMap > m_byteArrayPropertyToEditors; QMap m_editorToByteArrayProperty; QMap > m_stringListPropertyToEditors; QMap m_editorToStringListProperty; }; } // namespace qdesigner_internal QT_END_NAMESPACE Q_DECLARE_METATYPE(DesignerIntPair) Q_DECLARE_METATYPE(DesignerFlagList) #endif