| /**************************************************************************** |
| ** |
| ** 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 OBJECTINSPECTORMODEL_H |
| #define OBJECTINSPECTORMODEL_H |
| |
| #include <layoutinfo_p.h> |
| |
| #include <QtGui/QStandardItemModel> |
| #include <QtGui/QIcon> |
| #include <QtCore/QModelIndex> |
| #include <QtCore/QString> |
| #include <QtCore/QList> |
| #include <QtCore/QMultiMap> |
| #include <QtCore/QPointer> |
| |
| QT_BEGIN_NAMESPACE |
| |
| class QDesignerFormWindowInterface; |
| |
| namespace qdesigner_internal { |
| |
| // Data structure containing the fixed item type icons |
| struct ObjectInspectorIcons { |
| QIcon layoutIcons[LayoutInfo::UnknownLayout + 1]; |
| }; |
| |
| struct ModelRecursionContext; |
| |
| // Data structure representing one item of the object inspector. |
| class ObjectData { |
| public: |
| enum Type { |
| Object, |
| Action, |
| SeparatorAction, |
| ChildWidget, // A child widget |
| LayoutableContainer, // A container that can be laid out |
| LayoutWidget, // A QLayoutWidget |
| ExtensionContainer // QTabWidget and the like, container extension |
| }; |
| |
| typedef QList<QStandardItem *> StandardItemList; |
| |
| explicit ObjectData(QObject *parent, QObject *object, const ModelRecursionContext &ctx); |
| ObjectData(); |
| |
| inline Type type() const { return m_type; } |
| inline QObject *object() const { return m_object; } |
| inline QObject *parent() const { return m_parent; } |
| inline QString objectName() const { return m_objectName; } |
| |
| bool equals(const ObjectData & me) const; |
| |
| enum ChangedMask { ClassNameChanged = 1, ObjectNameChanged = 2, |
| ClassIconChanged = 4, TypeChanged = 8, |
| LayoutTypeChanged = 16}; |
| |
| unsigned compare(const ObjectData & me) const; |
| |
| // Initially set up a row |
| void setItems(const StandardItemList &row, const ObjectInspectorIcons &icons) const; |
| // Update row data according to change mask |
| void setItemsDisplayData(const StandardItemList &row, const ObjectInspectorIcons &icons, unsigned mask) const; |
| |
| private: |
| void initObject(const ModelRecursionContext &ctx); |
| void initWidget(QWidget *w, const ModelRecursionContext &ctx); |
| |
| QObject *m_parent; |
| QObject *m_object; |
| Type m_type; |
| QString m_className; |
| QString m_objectName; |
| QIcon m_classIcon; |
| LayoutInfo::Type m_managedLayoutType; |
| }; |
| |
| inline bool operator==(const ObjectData &e1, const ObjectData &e2) { return e1.equals(e2); } |
| inline bool operator!=(const ObjectData &e1, const ObjectData &e2) { return !e1.equals(e2); } |
| |
| typedef QList<ObjectData> ObjectModel; |
| |
| // QStandardItemModel for ObjectInspector. Uses ObjectData/ObjectModel |
| // internally for its updates. |
| class ObjectInspectorModel : public QStandardItemModel { |
| public: |
| typedef QList<QStandardItem *> StandardItemList; |
| enum { ObjectNameColumn, ClassNameColumn, NumColumns }; |
| |
| explicit ObjectInspectorModel(QObject *parent); |
| |
| enum UpdateResult { NoForm, Rebuilt, Updated }; |
| UpdateResult update(QDesignerFormWindowInterface *fw); |
| |
| const QModelIndexList indexesOf(QObject *o) const { return m_objectIndexMultiMap.values(o); } |
| QObject *objectAt(const QModelIndex &index) const; |
| |
| virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; |
| virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); |
| |
| private: |
| typedef QMultiMap<QObject *,QModelIndex> ObjectIndexMultiMap; |
| |
| void rebuild(const ObjectModel &newModel); |
| void updateItemContents(ObjectModel &oldModel, const ObjectModel &newModel); |
| void clearItems(); |
| StandardItemList rowAt(QModelIndex index) const; |
| |
| ObjectInspectorIcons m_icons; |
| ObjectIndexMultiMap m_objectIndexMultiMap; |
| ObjectModel m_model; |
| QPointer<QDesignerFormWindowInterface> m_formWindow; |
| }; |
| } // namespace qdesigner_internal |
| |
| #endif // OBJECTINSPECTORMODEL_H |
| |
| QT_END_NAMESPACE |