| /**************************************************************************** |
| ** |
| ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). |
| ** All rights reserved. |
| ** Contact: Nokia Corporation (qt-info@nokia.com) |
| ** |
| ** This file is part of the Qt Designer of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:LGPL$ |
| ** GNU Lesser General Public License Usage |
| ** 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, Nokia gives you certain additional |
| ** rights. These rights are described in the Nokia 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. |
| ** |
| ** Other Usage |
| ** Alternatively, this file may be used in accordance with the terms and |
| ** conditions contained in a signed written agreement between you and Nokia. |
| ** |
| ** |
| ** |
| ** |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| // |
| // W A R N I N G |
| // ------------- |
| // |
| // This file is not part of the Qt API. It exists for the convenience |
| // of Qt Designer. This header |
| // file may change from version to version without notice, or even be removed. |
| // |
| // We mean it. |
| // |
| |
| #ifndef QDESIGNER_PROPERTYCOMMAND_H |
| #define QDESIGNER_PROPERTYCOMMAND_H |
| |
| #include "qdesigner_formwindowcommand_p.h" |
| |
| #include <QtCore/QVariant> |
| #include <QtCore/QList> |
| #include <QtCore/QPair> |
| #include <QtCore/QSharedPointer> |
| |
| QT_BEGIN_NAMESPACE |
| |
| class QDesignerFormWindowInterface; |
| class QDesignerPropertySheetExtension; |
| |
| namespace qdesigner_internal { |
| |
| class QDesignerIntegration; |
| |
| enum SpecialProperty { |
| SP_None, SP_ObjectName, SP_LayoutName, SP_SpacerName,SP_WindowTitle, |
| SP_MinimumSize, SP_MaximumSize, SP_Geometry, SP_Icon, SP_CurrentTabName, SP_CurrentItemName, SP_CurrentPageName, |
| SP_AutoDefault, SP_Alignment, SP_Shortcut, SP_Orientation |
| }; |
| |
| //Determine special property |
| enum SpecialProperty getSpecialProperty(const QString& propertyName); |
| |
| // A helper class for applying properties to objects. |
| // Can be used for Set commands (setValue(), restoreOldValue()) or |
| // Reset Commands restoreDefaultValue(), restoreOldValue()). |
| // |
| class QDESIGNER_SHARED_EXPORT PropertyHelper { |
| Q_DISABLE_COPY(PropertyHelper) |
| public: |
| // A pair of Value and changed flag |
| typedef QPair<QVariant, bool> Value; |
| |
| enum ObjectType {OT_Object, OT_FreeAction, OT_AssociatedAction, OT_Widget}; |
| |
| PropertyHelper(QObject* object, |
| SpecialProperty specialProperty, |
| QDesignerPropertySheetExtension *sheet, |
| int index); |
| virtual ~PropertyHelper() {} |
| |
| QObject *object() const { return m_object; } |
| SpecialProperty specialProperty() const { return m_specialProperty; } |
| // set a new value. Can be overwritten to perform a transformation (see |
| // handling of Arrow key move in FormWindow class). |
| virtual Value setValue(QDesignerFormWindowInterface *fw, const QVariant &value, bool changed, unsigned subPropertyMask); |
| |
| // restore old value |
| Value restoreOldValue(QDesignerFormWindowInterface *fw); |
| // set default value |
| Value restoreDefaultValue(QDesignerFormWindowInterface *fw); |
| |
| inline QVariant oldValue() const |
| { return m_oldValue.first; } |
| |
| inline void setOldValue(const QVariant &oldValue) |
| { m_oldValue.first = oldValue; } |
| |
| // required updates for this property (bit mask) |
| enum UpdateMask { UpdatePropertyEditor=1, UpdateObjectInspector=2 }; |
| unsigned updateMask() const; |
| |
| // can be merged into one command (that is, object and name match) |
| bool canMerge(const PropertyHelper &other) const; |
| QDesignerIntegration *integration(QDesignerFormWindowInterface *fw) const; |
| |
| static void triggerActionChanged(QAction *a); |
| |
| private: |
| // Apply the value and update. Returns corrected value |
| Value applyValue(QDesignerFormWindowInterface *fw, const QVariant &oldValue, Value newValue); |
| |
| static void checkApplyWidgetValue(QDesignerFormWindowInterface *fw, QWidget* w, |
| SpecialProperty specialProperty, QVariant &v); |
| |
| void updateObject(QDesignerFormWindowInterface *fw, const QVariant &oldValue, const QVariant &newValue); |
| QVariant findDefaultValue(QDesignerFormWindowInterface *fw) const; |
| void ensureUniqueObjectName(QDesignerFormWindowInterface *fw, QObject *object) const; |
| SpecialProperty m_specialProperty; |
| |
| QPointer<QObject> m_object; |
| ObjectType m_objectType; |
| QPointer<QWidget> m_parentWidget; |
| |
| QDesignerPropertySheetExtension *m_propertySheet; |
| int m_index; |
| |
| Value m_oldValue; |
| }; |
| |
| // Base class for commands that can be applied to several widgets |
| |
| class QDESIGNER_SHARED_EXPORT PropertyListCommand : public QDesignerFormWindowCommand { |
| public: |
| typedef QList<QObject *> ObjectList; |
| |
| explicit PropertyListCommand(QDesignerFormWindowInterface *formWindow, QUndoCommand *parent = 0); |
| |
| QObject* object(int index = 0) const; |
| |
| QVariant oldValue(int index = 0) const; |
| |
| void setOldValue(const QVariant &oldValue, int index = 0); |
| |
| // Calls restoreDefaultValue() and update() |
| virtual void undo(); |
| |
| protected: |
| typedef QSharedPointer<PropertyHelper> PropertyHelperPtr; |
| typedef QList<PropertyHelperPtr> PropertyHelperList; |
| |
| // add an object |
| bool add(QObject *object, const QString &propertyName); |
| |
| // Init from a list and make sure referenceObject is added first to obtain the right property group |
| bool initList(const ObjectList &list, const QString &apropertyName, QObject *referenceObject = 0); |
| |
| // set a new value, return update mask |
| unsigned setValue(QVariant value, bool changed, unsigned subPropertyMask); |
| |
| // restore old value, return update mask |
| unsigned restoreOldValue(); |
| // set default value, return update mask |
| unsigned restoreDefaultValue(); |
| |
| // update designer |
| void update(unsigned updateMask); |
| |
| // check if lists are aequivalent for command merging (same widgets and props) |
| bool canMergeLists(const PropertyHelperList& other) const; |
| |
| PropertyHelperList& propertyHelperList() { return m_propertyHelperList; } |
| const PropertyHelperList& propertyHelperList() const { return m_propertyHelperList; } |
| |
| const QString propertyName() const; |
| SpecialProperty specialProperty() const; |
| |
| // Helper struct describing a property used for checking whether |
| // properties of different widgets are equivalent |
| struct PropertyDescription { |
| public: |
| PropertyDescription(); |
| PropertyDescription(const QString &propertyName, QDesignerPropertySheetExtension *propertySheet, int index); |
| bool equals(const PropertyDescription &p) const; |
| void debug() const; |
| |
| QString m_propertyName; |
| QString m_propertyGroup; |
| QVariant::Type m_propertyType; |
| SpecialProperty m_specialProperty; |
| }; |
| const PropertyDescription &propertyDescription() const { return m_propertyDescription; } |
| |
| protected: |
| virtual PropertyHelper *createPropertyHelper(QObject *o, SpecialProperty sp, |
| QDesignerPropertySheetExtension *sheet, int sheetIndex) const; |
| |
| private: |
| PropertyDescription m_propertyDescription; |
| PropertyHelperList m_propertyHelperList; |
| }; |
| |
| class QDESIGNER_SHARED_EXPORT SetPropertyCommand: public PropertyListCommand |
| { |
| |
| public: |
| typedef QList<QObject *> ObjectList; |
| |
| explicit SetPropertyCommand(QDesignerFormWindowInterface *formWindow, QUndoCommand *parent = 0); |
| |
| bool init(QObject *object, const QString &propertyName, const QVariant &newValue); |
| bool init(const ObjectList &list, const QString &propertyName, const QVariant &newValue, |
| QObject *referenceObject = 0, bool enableSubPropertyHandling = true); |
| |
| |
| inline QVariant newValue() const |
| { return m_newValue; } |
| |
| inline void setNewValue(const QVariant &newValue) |
| { m_newValue = newValue; } |
| |
| int id() const; |
| bool mergeWith(const QUndoCommand *other); |
| |
| virtual void redo(); |
| |
| protected: |
| virtual QVariant mergeValue(const QVariant &newValue); |
| |
| private: |
| unsigned subPropertyMask(const QVariant &newValue, QObject *referenceObject); |
| void setDescription(); |
| QVariant m_newValue; |
| unsigned m_subPropertyMask; |
| }; |
| |
| class QDESIGNER_SHARED_EXPORT ResetPropertyCommand: public PropertyListCommand |
| { |
| |
| public: |
| typedef QList<QObject *> ObjectList; |
| |
| explicit ResetPropertyCommand(QDesignerFormWindowInterface *formWindow); |
| |
| bool init(QObject *object, const QString &propertyName); |
| bool init(const ObjectList &list, const QString &propertyName, QObject *referenceObject = 0); |
| |
| virtual void redo(); |
| |
| protected: |
| virtual bool mergeWith(const QUndoCommand *) { return false; } |
| |
| private: |
| void setDescription(); |
| QString m_propertyName; |
| }; |
| |
| |
| class QDESIGNER_SHARED_EXPORT AddDynamicPropertyCommand: public QDesignerFormWindowCommand |
| { |
| |
| public: |
| explicit AddDynamicPropertyCommand(QDesignerFormWindowInterface *formWindow); |
| |
| bool init(const QList<QObject *> &selection, QObject *current, const QString &propertyName, const QVariant &value); |
| |
| virtual void redo(); |
| virtual void undo(); |
| private: |
| void setDescription(); |
| QString m_propertyName; |
| QList<QObject *> m_selection; |
| QVariant m_value; |
| }; |
| |
| class QDESIGNER_SHARED_EXPORT RemoveDynamicPropertyCommand: public QDesignerFormWindowCommand |
| { |
| |
| public: |
| explicit RemoveDynamicPropertyCommand(QDesignerFormWindowInterface *formWindow); |
| |
| bool init(const QList<QObject *> &selection, QObject *current, const QString &propertyName); |
| |
| virtual void redo(); |
| virtual void undo(); |
| private: |
| void setDescription(); |
| QString m_propertyName; |
| QMap<QObject *, QPair<QVariant, bool> > m_objectToValueAndChanged; |
| }; |
| |
| } // namespace qdesigner_internal |
| |
| QT_END_NAMESPACE |
| |
| #endif // QDESIGNER_PROPERTYCOMMAND_H |