2 #ifndef XGUI_DocumentDataModel_H
3 #define XGUI_DocumentDataModel_H
6 #include <ModuleBase_Definitions.h>
8 #include <QAbstractItemModel>
9 #include <Events_Listener.h>
13 class ModelAPI_Document;
15 class XGUI_TopDataModel;
17 /**\class XGUI_DocumentDataModel
19 * \brief This is a proxy data model for Object Browser (QTreeView).
20 * It contains several sub-models for generation of each sub-part of data tree.
22 class XGUI_EXPORT XGUI_DocumentDataModel : public QAbstractItemModel, public Events_Listener
28 XGUI_DocumentDataModel(QObject* theParent);
29 virtual ~XGUI_DocumentDataModel();
31 // Event Listener method
32 virtual void processEvent(const Events_Message* theMessage);
35 virtual QVariant data(const QModelIndex& theIndex, int theRole) const;
36 virtual QVariant headerData(int theSection, Qt::Orientation theOrient,
37 int theRole = Qt::DisplayRole) const;
39 virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const;
40 virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const;
42 virtual QModelIndex index(int theRow, int theColumn,
43 const QModelIndex &parent = QModelIndex()) const;
45 virtual QModelIndex parent(const QModelIndex& theIndex) const;
47 virtual bool hasChildren(const QModelIndex& theParent = QModelIndex()) const;
49 bool insertRows(int theRow, int theCount, const QModelIndex& theParent = QModelIndex());
51 bool removeRows(int theRow, int theCount, const QModelIndex& theParent = QModelIndex());
53 Qt::ItemFlags flags(const QModelIndex& theIndex) const;
55 //! Returns Feature object by the given Model index.
56 //! Returns 0 if the given index is not index of a feature
57 FeaturePtr feature(const QModelIndex& theIndex) const;
59 QModelIndex featureIndex(const FeaturePtr theFeature) const;
61 //! Returns QModelIndex which corresponds to the given feature if this is a part
62 //! If the feature is not found then index is not valid
63 QModelIndex partIndex(const FeaturePtr& theFeature) const;
65 //! Activates a part data model if the index is a Part node index.
66 //! Returns true if active part changed.
67 bool activatedIndex(const QModelIndex& theIndex);
69 //! Retrurns Feature which corresponds to active part
70 FeaturePtr activePart() const;
72 //! Retrurns QModelIndex of active part
73 QModelIndex activePartIndex() const { return myActivePartIndex; }
75 //! Deactivates a Part
76 void deactivatePart();
78 void rebuildDataTree();
82 enum {PartsFolder, HistoryNode};
85 //! Converts QModelIndex of this model to QModelIndex of a one of sub-models.
86 QModelIndex* toSourceModelIndex(const QModelIndex& theProxy) const;
88 //! Finds a pointer on QModelIndex which is equal to the given one
89 QModelIndex* findModelIndex(const QModelIndex& theIndex) const;
91 //! Returns pointer on QModelIndex which is equal to the given one.
92 QModelIndex* getModelIndex(const QModelIndex& theIndex) const;
94 //! Deletes all saved pointers on QModelIndex objects.
95 void clearModelIndexes();
97 //! Removes sub-model on removing a part object. Also it removes QModelIndex-es which refer to this model
98 void removeSubModel(int theModelId);
100 //! Returns true if the given model is a one of sub-models (of both types)
101 bool isSubModel(const QAbstractItemModel* theModel) const;
103 //! Returns true if the given model is a one of sub-models of Part type
104 bool isPartSubModel(const QAbstractItemModel* theModel) const;
106 //! Returns Parts Folder node
107 QModelIndex partFolderNode() const;
109 int historyOffset() const;
112 //! Data model of top part of data tree (not parts object)
113 XGUI_TopDataModel* myModel;
115 //! Data models for Parts data tree representation (one data model per a one part)
116 QList<XGUI_PartModel*> myPartModels;
118 //! Active part in part editing mode
119 XGUI_PartModel* myActivePart;
121 QModelIndex myActivePartIndex;
123 //! List of saved QModelIndexes created by sub-models
124 QList<QModelIndex*> myIndexes;