Salome HOME
Merge branch 'master' of newgeom:newgeom
[modules/shaper.git] / src / XGUI / XGUI_DocumentDataModel.h
1
2 #ifndef XGUI_DocumentDataModel_H
3 #define XGUI_DocumentDataModel_H
4
5 #include "XGUI.h"
6 #include "XGUI_Constants.h"
7
8 #include <QAbstractItemModel>
9 #include <Events_Listener.h>
10
11 #include <QList>
12
13 class ModelAPI_Document;
14 class XGUI_PartModel;
15 class XGUI_TopDataModel;
16
17 /**\class XGUI_DocumentDataModel
18  * \ingroup GUI
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.
21  */
22 class XGUI_EXPORT XGUI_DocumentDataModel : public QAbstractItemModel, public Events_Listener
23 {
24   Q_OBJECT
25 public:
26
27
28   XGUI_DocumentDataModel(QObject* theParent);
29   virtual ~XGUI_DocumentDataModel();
30
31   // Event Listener method
32   virtual void processEvent(const Events_Message* theMessage);
33
34
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;
38
39   virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const;
40   virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const;
41
42   virtual QModelIndex index(int theRow, int theColumn, 
43                             const QModelIndex &parent = QModelIndex()) const;
44
45   virtual QModelIndex parent(const QModelIndex& theIndex) const;
46
47   virtual bool hasChildren(const QModelIndex& theParent = QModelIndex()) const;
48
49   bool insertRows(int theRow, int theCount, const QModelIndex& theParent = QModelIndex());
50
51   bool removeRows(int theRow, int theCount, const QModelIndex& theParent = QModelIndex());
52
53   Qt::ItemFlags flags(const QModelIndex& theIndex) const;
54
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;
58
59   QModelIndex featureIndex(const FeaturePtr theFeature) const;
60
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;
64
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);
68
69   //! Retrurns Feature which corresponds to active part
70   FeaturePtr activePart() const;
71
72   //! Retrurns QModelIndex of active part
73   QModelIndex activePartIndex() const { return myActivePartIndex; }
74
75   //! Deactivates a Part
76   void deactivatePart();
77
78   void rebuildDataTree();
79
80 private:
81
82   enum {PartsFolder, HistoryNode};
83
84
85   //! Converts QModelIndex of this model to QModelIndex of a one of sub-models.
86   QModelIndex* toSourceModelIndex(const QModelIndex& theProxy) const;
87
88   //! Finds a pointer on QModelIndex which is equal to the given one
89   QModelIndex* findModelIndex(const QModelIndex& theIndex) const;
90
91   //! Returns pointer on QModelIndex which is equal to the given one.
92   QModelIndex* getModelIndex(const QModelIndex& theIndex) const;
93
94   //! Deletes all saved pointers on QModelIndex objects.
95   void clearModelIndexes();
96
97   //! Removes sub-model on removing a part object. Also it removes QModelIndex-es which refer to this model
98   void removeSubModel(int theModelId);
99
100   //! Returns true if the given model is a one of sub-models (of both types)
101   bool isSubModel(const QAbstractItemModel* theModel) const;
102
103   //! Returns true if the given model is a one of sub-models of Part type
104   bool isPartSubModel(const QAbstractItemModel* theModel) const;
105
106   //! Returns Parts Folder node
107   QModelIndex partFolderNode() const;
108
109   int historyOffset() const;
110
111
112   //! Data model of top part of data tree (not parts object)
113   XGUI_TopDataModel* myModel;
114
115   //! Data models for Parts data tree representation (one data model per a one part)
116   QList<XGUI_PartModel*> myPartModels;
117
118   //! Active part in part editing mode
119   XGUI_PartModel* myActivePart;
120
121   QModelIndex myActivePartIndex;
122
123   //! List of saved QModelIndexes created by sub-models
124   QList<QModelIndex*> myIndexes;
125
126 };
127
128 #endif