File: TreeModel_ModelBase.hxx

package info (click to toggle)
opencascade 7.9.2%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 301,924 kB
  • sloc: cpp: 1,523,264; tcl: 10,159; cs: 5,173; java: 1,554; sh: 1,342; ansic: 827; xml: 699; makefile: 30; javascript: 22
file content (246 lines) | stat: -rw-r--r-- 11,298 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.

#ifndef TreeModel_ModelBase_H
#define TreeModel_ModelBase_H

#include <Standard.hxx>
#include <inspector/TreeModel_ItemBase.hxx>
#include <inspector/TreeModel_HeaderSection.hxx>

#include <NCollection_List.hxx>

#include <Standard_WarningsDisable.hxx>
#include <QAbstractItemModel>
#include <QExplicitlySharedDataPointer>
#include <QMap>
#include <QModelIndex>
#include <QVariant>
#include <QVector>
#include <Standard_WarningsRestore.hxx>

class TreeModel_VisibilityState;

//! \class TreeModel_ModelBase
//! \brief Implementation of the tree item based model of QAbstractItemModel.
//! The TreeModel_ModelBase class defines the abstract model realization through the base item
//! architecture. By the model index creation, a base item is created and attached to the index.
//! Each item contains an iformation about the item parent, position in the parent and
//! the item's children. So, it is possible to get the model index relation from the item.
class TreeModel_ModelBase : public QAbstractItemModel
{
public:
  //! Constructor
  //! \param theParent the parent object
  Standard_EXPORT TreeModel_ModelBase(QObject* theParent = 0);

  //! Destructor
  virtual ~TreeModel_ModelBase() {}

  //! Creates model columns and root items.
  //! Default columns are: [0] - Name, [1] - Visibility, [2] - Row
  Standard_EXPORT virtual void InitColumns();

  //! Returns the item shared pointer by the model index
  //! if it is in the index internal pointer
  //! @param theIndex a model index
  Standard_EXPORT static TreeModel_ItemBasePtr GetItemByIndex(const QModelIndex& theIndex);

  //! Resets the model items content. Calls the same method of the root item.
  //! It leads to reset of all child/sub child items.
  Standard_EXPORT virtual void Reset();

  //! Returns the model root item.
  //! It is realized for OCAFBrowser
  TreeModel_ItemBasePtr RootItem(const int theColumn) const { return myRootItems[theColumn]; }

  //! Emits the layoutChanged signal from outside of this class
  Standard_EXPORT void EmitLayoutChanged();

  //! Emits the dataChanged signal from outside of this class
  Standard_EXPORT void EmitDataChanged(const QModelIndex&  theTopLeft,
                                       const QModelIndex&  theBottomRight,
                                       const QVector<int>& theRoles    = QVector<int>(),
                                       const bool          isResetItem = true);

  //! Sets state whether visibility column (0) is used in the model
  //! \param theState state
  void SetUseVisibilityColumn(const bool theState) { m_pUseVisibilityColumn = theState; }

  //! Returns state whether visibility column (0) is used in the model
  //! \param theState state
  bool IsUseVisibilityColumn() const { return m_pUseVisibilityColumn; }

  //! Fills visibility state checker
  //! \param theController the checker interface
  void SetVisibilityState(TreeModel_VisibilityState* theController)
  {
    myVisibilityState = theController;
  }

  //! Returns visibility state checker
  //! \return the checker interface
  TreeModel_VisibilityState* GetVisibilityState() const { return myVisibilityState; }

  //! Returns true if the tree view model contains highlighted items. This highlight is set
  //! manually.
  bool HasHighlighted() { return !myHighlightedIndices.isEmpty(); }

  //! Sets items of the indices highlighted in the model.
  //! \param theIndices a list of tree model indices
  void SetHighlighted(const QModelIndexList& theIndices = QModelIndexList())
  {
    myHighlightedIndices = theIndices;
  }

  //! Returns the index of the item in the model specified by the given row, column and parent
  //! index. Saves an internal pointer at the createIndex. This pointer is a shared pointer to the
  //! class, that realizes a base item interface. If the parent is invalid, a root item is used,
  //! otherwise a new item is created by the pointer item saved the parent model index \param theRow
  //! the index row position \param theColummn the index column position \param theParent the parent
  //! index \return the model index
  Standard_EXPORT virtual QModelIndex index(int                theRow,
                                            int                theColumn,
                                            const QModelIndex& theParent = QModelIndex()) const
    Standard_OVERRIDE;

  //! Returns the data stored under the given role for the item referred to by the index.
  //! \param theIndex a model index
  //! \param theRole an enumeration value of role for data obtaining
  Standard_EXPORT virtual QVariant data(const QModelIndex& theIndex,
                                        int theRole = Qt::DisplayRole) const Standard_OVERRIDE;

  //! Returns the parent index by the child index. Founds the item, saved in the index;
  //! obtains the parent item by the item. Create a new index by the item and containing it.
  //! \param theIndex a model index
  Standard_EXPORT virtual QModelIndex parent(const QModelIndex& theIndex) const Standard_OVERRIDE;

  //! Returns the item flags for the given index. The base class implementation returns a
  //! combination of flags that enables the item (ItemIsEnabled) and allows it to be selected
  //! (ItemIsSelectable) \param theIndex the model index \return Qt flag combination
  Standard_EXPORT virtual Qt::ItemFlags flags(const QModelIndex& theIndex) const Standard_OVERRIDE;

  //! Returns the header data for the given role and section in the header with the specified
  //! orientation. \param theSection the header section. For horizontal headers - column number, for
  //! vertical headers - row number. \param theOrientation a header orientation \param theRole a
  //! data role \return the header data
  Standard_EXPORT virtual QVariant headerData(int             theSection,
                                              Qt::Orientation theOrientation,
                                              int             theRole = Qt::DisplayRole) const
    Standard_OVERRIDE;

  //! Returns the number of rows under the given parent. When the parent is valid it means that
  //! rowCount is returning the number of children of parent. \param theParent a parent model index
  //! \return the number of rows
  Standard_EXPORT virtual int rowCount(const QModelIndex& theParent = QModelIndex()) const
    Standard_OVERRIDE;

  //! Returns header item, that can be modified
  //! \param theColumnId a column index
  //! \return header section value
  TreeModel_HeaderSection* ChangeHeaderItem(const int theColumnId)
  {
    return &myHeaderValues[theColumnId];
  }

  //! Returns count of columns in the model
  //! \param theParent an index of the parent item
  //! \return integer value
  virtual int columnCount(const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
  {
    (void)theParent;
    return myHeaderValues.size();
  }

  //! Returns default value of the visibility column
  //! \return integer value
  static int ColumnVisibilityWidth() { return 20; }

  //! Returns selected items in the cell of given orientation.
  //! \param theIndices a container of selected indices
  //! \param theCellId column index if orientation is horizontal, row index otherwise
  //! \param theOrientation an orientation to apply the cell index
  //! \return model indices from the list
  Standard_EXPORT static QModelIndexList Selected(
    const QModelIndexList& theIndices,
    const int              theCellId,
    const Qt::Orientation  theOrientation = Qt::Horizontal);

  //! Returns single selected item in the cell of given orientation. If the orientation is
  //! Horizontal, in the cell id column, one row should be selected. \param theIndices a container
  //! of selected indices \param theCellId column index if orientation is horizontal, row index
  //! otherwise \param theOrientation an orientation to apply the cell index \return model index
  //! from the list
  Standard_EXPORT static QModelIndex SingleSelected(
    const QModelIndexList& theIndices,
    const int              theCellId,
    const Qt::Orientation  theOrientation = Qt::Horizontal);

  //! Returns selected tree model items for indices.
  //! \param theIndices a container of selected indices
  //! \return model items from the list
  Standard_EXPORT static QList<TreeModel_ItemBasePtr> SelectedItems(
    const QModelIndexList& theIndices);

  //! Returns presentations of sub items
  //! \param theIndices a container of selected indices
  //! \thePresentations[out]  container of presentations
  Standard_EXPORT static void SubItemsPresentations(
    const QModelIndexList&                        theIndices,
    NCollection_List<Handle(Standard_Transient)>& thePresentations);

protected:
  //! Creates root item
  //! \param theColumnId index of a column
  virtual TreeModel_ItemBasePtr createRootItem(const int theColumnId) = 0;

  //! Sets header properties item.
  //! \param theColumnId a column index
  //! \param theSection a section value
  Standard_EXPORT void setHeaderItem(const int                      theColumnId,
                                     const TreeModel_HeaderSection& theSection);

  //! Converts the item shared pointer to void* type
  //! \param theItem
  //!  \return an item pointer
  Standard_EXPORT static void* getIndexValue(const TreeModel_ItemBasePtr& theItem);

  //! Returns presentations of sub items. Recursive method to get presentations of all children
  //! \param theItem an item to get own presentations and presentations of children
  //! \thePresentations[out]  container of presentations found
  static void subItemsPresentations(const TreeModel_ItemBasePtr&                  theItem,
                                    NCollection_List<Handle(Standard_Transient)>& thePresentations);

private:
  //! Creates root item
  //! \param theColumnId index of a column
  Standard_EXPORT void createRoot(const int theColumnId);

protected:
  QMap<int, TreeModel_ItemBasePtr>
    myRootItems; //!< container of root items, for each column own root item
  QMap<int, TreeModel_HeaderSection> myHeaderValues; //!< header values
  //!< model subclass. The model is fulfilled by this item content

  bool m_pUseVisibilityColumn; //!< the state whether column=0 is reserved for Visibility state
  TreeModel_VisibilityState* myVisibilityState; //!< the interface of item visibility
  QIcon                      myVisibleIcon;     //!< icon of visible state
  QIcon                      myInvisibleIcon;   //!< icon of invisible state

  QModelIndexList
    myHighlightedIndices; //!< tree model indices that should be visualized as highlighted
};

#endif