/**************************************************************************** | |
** | |
** 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 |