+ /// Inserts count rows into the model before the given row.
+ /// Items in the new row will be children of the item represented by the parent model index.
+ /// \param theRow a start row
+ /// \param theCount a nember of rows to insert
+ /// \param theParent a parent model index
+ bool insertRows(int theRow, int theCount, const QModelIndex& theParent = QModelIndex());
+
+ /// Removes count rows starting with the given row under parent parent from the model.
+ /// \param theRow a start row
+ /// \param theCount a nember of rows to remove
+ /// \param theParent a parent model index
+ bool removeRows(int theRow, int theCount, const QModelIndex& theParent = QModelIndex());
+
+ /// Returns the item flags for the given index.
+ /// \param theIndex a model index
+ Qt::ItemFlags flags(const QModelIndex& theIndex) const;
+
+ //! Returns an object by the given Model index.
+ //! Returns 0 if the given index is not index of an object
+ ObjectPtr object(const QModelIndex& theIndex) const;
+
+ //! Returns index of the object
+ //! \param theObject object to find
+ QModelIndex objectIndex(const ObjectPtr theObject) const;
+
+ //! Returns QModelIndex which corresponds to the given part
+ //! If the object is not found then index is not valid
+ //! \param thePart a part for analysis
+ QModelIndex partIndex(const ResultPartPtr& thePart) const;
+
+ //! Activates a part data model if the index is a Part node index.
+ //! Returns true if active part changed.
+ //! \param theIndex a model index
+ bool activatedIndex(const QModelIndex& theIndex);
+
+ //! Retrurns active part
+ ResultPartPtr activePart() const;
+
+ //! Retrurns QModelIndex of active part
+ QModelIndex activePartIndex() const
+ {
+ return myActivePartIndex;
+ }
+
+ //! Deactivates a Part
+ void deactivatePart();
+
+ //! Rebuild data tree
+ void rebuildDataTree();
+
+ //! Clear internal data
+ void clear();
+
+
+ private:
+
+ enum
+ {
+ PartsFolder,
+ HistoryNode
+ };
+
+ //! Converts QModelIndex of this model to QModelIndex of a one of sub-models.
+ QModelIndex* toSourceModelIndex(const QModelIndex& theProxy) const;
+
+ //! Finds a pointer on QModelIndex which is equal to the given one
+ QModelIndex* findModelIndex(const QModelIndex& theIndex) const;
+
+ //! Returns pointer on QModelIndex which is equal to the given one.
+ QModelIndex* getModelIndex(const QModelIndex& theIndex) const;
+
+ //! Deletes all saved pointers on QModelIndex objects.
+ void clearModelIndexes();
+
+ //! Deletes all saved pointers on QModelIndex objects.
+ void clearSubModels();
+
+ //! Removes sub-model on removing a part object. Also it removes QModelIndex-es which refer to this model
+ void removeSubModel(int theModelId);
+
+ //! Returns true if the given model is a one of sub-models (of both types)
+ bool isSubModel(const QAbstractItemModel* theModel) const;
+
+ //! Returns true if the given model is a one of sub-models of Part type
+ bool isPartSubModel(const QAbstractItemModel* theModel) const;
+
+ //! Returns Parts Folder node
+ QModelIndex partFolderNode() const;
+
+ int historyOffset() const;
+
+ //! Data model of top part of data tree (not parts object)
+ XGUI_TopDataModel* myModel;
+
+ //! Data models for Parts data tree representation (one data model per a one part)
+ QList<XGUI_PartModel*> myPartModels;
+
+ //! Active part in part editing mode
+ XGUI_PartModel* myActivePart;
+
+ QModelIndex myActivePartIndex;
+
+ //! List of saved QModelIndexes created by sub-models
+ QList<QModelIndex*> myIndexes;