1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File: SUIT_TreeModel.h
21 // Author: Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
23 #ifndef SUIT_TREEMODEL_H
24 #define SUIT_TREEMODEL_H
30 #include <QAbstractItemModel>
31 #include <QSortFilterProxyModel>
32 #include <QModelIndex>
33 #include <QItemDelegate>
38 #pragma warning( disable:4251 )
41 class SUIT_DataObject;
45 class SUIT_EXPORT SUIT_DataSearcher
48 virtual SUIT_DataObject* findObject( const QString& ) const = 0;
51 class SUIT_EXPORT SUIT_AbstractModel
53 SUIT_DataSearcher* mySearcher;
58 operator const QAbstractItemModel*() const;
59 operator QAbstractItemModel*();
60 operator const QObject*() const;
62 virtual SUIT_DataObject* root() const = 0;
63 virtual void setRoot( SUIT_DataObject* ) = 0;
64 virtual SUIT_DataObject* object( const QModelIndex& = QModelIndex() ) const = 0;
65 virtual QModelIndex index( const SUIT_DataObject*, int = 0 ) const = 0;
66 virtual bool autoDeleteTree() const = 0;
67 virtual void setAutoDeleteTree( const bool ) = 0;
68 virtual bool autoUpdate() const = 0;
69 virtual void setAutoUpdate( const bool ) = 0;
70 virtual bool updateModified() const = 0;
71 virtual void setUpdateModified( const bool ) = 0;
72 virtual QAbstractItemDelegate* delegate() const = 0;
73 virtual bool customSorting( const int ) const = 0;
74 virtual bool lessThan( const QModelIndex& left, const QModelIndex& right ) const = 0;
75 virtual void forgetObject( const SUIT_DataObject* ) = 0;
77 virtual void updateTree( const QModelIndex& ) = 0;
78 virtual void updateTree( SUIT_DataObject* = 0 ) = 0;
80 virtual void registerColumn( const int group_id, const QString& name, const int custom_id ) = 0;
81 virtual void unregisterColumn( const int group_id, const QString& name ) = 0;
82 virtual void setColumnIcon( const QString& name, const QPixmap& icon ) = 0;
83 virtual QPixmap columnIcon( const QString& name ) const = 0;
84 virtual void setAppropriate( const QString& name, const Qtx::Appropriate appr ) = 0;
85 virtual Qtx::Appropriate appropriate( const QString& name ) const = 0;
86 virtual void setVisibilityState(const QString& id, Qtx::VisibilityState state, bool emitChanged = true) = 0;
87 virtual void setVisibilityStateForAll(Qtx::VisibilityState state) = 0;
88 virtual Qtx::VisibilityState visibilityState(const QString& id) const = 0;
89 virtual void setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags ) = 0;
90 virtual Qtx::HeaderViewFlags headerFlags( const QString& name ) const = 0;
91 virtual void emitClicked( SUIT_DataObject* obj, const QModelIndex& index) = 0;
93 virtual SUIT_DataSearcher* searcher() const;
94 virtual void setSearcher( SUIT_DataSearcher* );
98 class SUIT_EXPORT SUIT_TreeModel : public QAbstractItemModel, public SUIT_AbstractModel
105 typedef SUIT_DataObject* ObjPtr;
106 typedef SUIT_TreeModel::TreeItem* ItemPtr;
111 DisplayRole = Qt::DisplayRole, //!< text label
112 DecorationRole = Qt::DecorationRole, //!< icon
113 EditRole = Qt::EditRole, //!< edit mode
114 ToolTipRole = Qt::ToolTipRole, //!< tooltip
115 StatusTipRole = Qt::StatusTipRole, //!< status tip
116 WhatsThisRole = Qt::WhatsThisRole, //!< what's this info
117 FontRole = Qt::FontRole, //!< font
118 TextAlignmentRole = Qt::TextAlignmentRole, //!< text alignment
119 BackgroundRole = Qt::BackgroundRole, //!< background color
120 ForegroundRole = Qt::ForegroundRole, //!< text color
121 CheckStateRole = Qt::CheckStateRole, //!< check state
122 SizeHintRole = Qt::SizeHintRole, //!< size hint
123 BaseColorRole = Qt::UserRole, //!< (editor) background color
124 TextColorRole, //!< (editor) text color (Qt::UserRole + 1)
125 HighlightRole, //!< highlight color (Qt::UserRole + 2)
126 HighlightedTextRole, //!< highlighted text color (Qt::UserRole + 3)
127 AppropriateRole = Qtx::AppropriateRole //!< appropriate flag (Qt::UserRole + 100)
130 SUIT_TreeModel( QObject* = 0 );
131 SUIT_TreeModel( SUIT_DataObject*, QObject* = 0 );
134 SUIT_DataObject* root() const;
135 void setRoot( SUIT_DataObject* );
137 virtual QVariant data( const QModelIndex&, int = DisplayRole ) const;
138 virtual bool setData( const QModelIndex&, const QVariant&, int = EditRole );
139 virtual Qt::ItemFlags flags( const QModelIndex& ) const;
140 virtual QVariant headerData( int, Qt::Orientation, int = Qt::DisplayRole ) const;
142 virtual Qt::DropActions supportedDropActions() const;
144 virtual QModelIndex index( int, int, const QModelIndex& = QModelIndex() ) const;
145 virtual QModelIndex parent( const QModelIndex& ) const;
147 virtual int columnCount( const QModelIndex& = QModelIndex() ) const;
148 virtual int rowCount( const QModelIndex& = QModelIndex() ) const;
149 virtual void registerColumn( const int group_id, const QString& name, const int custom_id );
150 virtual void unregisterColumn( const int group_id, const QString& name );
151 virtual void setColumnIcon( const QString& name, const QPixmap& icon );
152 virtual QPixmap columnIcon( const QString& name ) const;
153 virtual void setAppropriate( const QString& name, const Qtx::Appropriate appr );
154 virtual Qtx::Appropriate appropriate( const QString& name ) const;
155 virtual void setVisibilityState(const QString& id, Qtx::VisibilityState state, bool emitChanged = true);
156 virtual void setVisibilityStateForAll(Qtx::VisibilityState state);
157 virtual Qtx::VisibilityState visibilityState(const QString& id) const;
158 virtual void setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags );
159 virtual Qtx::HeaderViewFlags headerFlags( const QString& name ) const;
160 virtual void emitClicked( SUIT_DataObject* obj, const QModelIndex& index);
163 SUIT_DataObject* object( const QModelIndex& = QModelIndex() ) const;
164 QModelIndex index( const SUIT_DataObject*, int = 0 ) const;
166 bool autoDeleteTree() const;
167 void setAutoDeleteTree( const bool );
169 bool autoUpdate() const;
170 void setAutoUpdate( const bool );
172 bool updateModified() const;
173 void setUpdateModified( const bool );
175 virtual bool customSorting( const int ) const;
176 virtual bool lessThan( const QModelIndex& left, const QModelIndex& right ) const;
177 virtual void forgetObject( const SUIT_DataObject* );
179 QAbstractItemDelegate* delegate() const;
182 virtual void updateTreeModel(SUIT_DataObject*,TreeItem*);
184 virtual QStringList mimeTypes() const;
185 virtual QMimeData* mimeData (const QModelIndexList& indexes) const;
186 virtual bool dropMimeData (const QMimeData *data, Qt::DropAction action,
187 int row, int column, const QModelIndex &parent);
190 virtual void updateTree( const QModelIndex& );
191 virtual void updateTree( SUIT_DataObject* = 0 );
195 void clicked( SUIT_DataObject*, int );
196 void dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction );
197 void renamed( SUIT_DataObject* );
202 TreeItem* rootItem() const;
203 TreeItem* treeItem( const QModelIndex& ) const;
204 TreeItem* treeItem( const SUIT_DataObject* ) const;
205 SUIT_DataObject* object( const TreeItem* ) const;
206 QString objectId( const QModelIndex& = QModelIndex() ) const;
208 TreeItem* createItem( SUIT_DataObject*, TreeItem* = 0, TreeItem* = 0 );
209 TreeItem* createItemAtPos( SUIT_DataObject*, TreeItem* = 0, int pos=0 );
210 void updateItem( TreeItem*, bool emitLayoutChanged );
211 void removeItem( TreeItem* );
214 void onInserted( SUIT_DataObject*, SUIT_DataObject* );
215 void onRemoved( SUIT_DataObject*, SUIT_DataObject* );
216 void onModified( SUIT_DataObject* );
219 typedef QMap<SUIT_DataObject*, TreeItem*> ItemMap;
225 Qtx::HeaderViewFlags myHeaderFlags;
226 Qtx::Appropriate myAppropriate;
230 typedef QMap<QString,Qtx::VisibilityState> VisibilityMap;
232 SUIT_DataObject* myRoot;
233 TreeItem* myRootItem;
235 VisibilityMap myVisibilityMap;
236 bool myAutoDeleteTree;
238 bool myUpdateModified;
239 QVector<ColumnInfo> myColumns;
241 friend class SUIT_TreeModel::TreeSync;
244 class SUIT_EXPORT SUIT_ProxyModel : public QSortFilterProxyModel, public SUIT_AbstractModel
249 SUIT_ProxyModel( QObject* = 0 );
250 SUIT_ProxyModel( SUIT_DataObject*, QObject* = 0 );
251 SUIT_ProxyModel( SUIT_AbstractModel*, QObject* = 0 );
254 SUIT_DataObject* root() const;
255 void setRoot( SUIT_DataObject* );
257 SUIT_DataObject* object( const QModelIndex& = QModelIndex() ) const;
258 QModelIndex index( const SUIT_DataObject*, int = 0 ) const;
260 bool autoDeleteTree() const;
261 void setAutoDeleteTree( const bool );
263 bool autoUpdate() const;
264 void setAutoUpdate( const bool );
266 bool updateModified() const;
267 void setUpdateModified( const bool );
269 bool isSortingEnabled() const;
270 bool customSorting( const int ) const;
272 virtual void forgetObject( const SUIT_DataObject* );
273 virtual bool lessThan( const QModelIndex&, const QModelIndex& ) const;
274 virtual void registerColumn( const int group_id, const QString& name, const int custom_id );
275 virtual void unregisterColumn( const int group_id, const QString& name );
276 virtual void setColumnIcon( const QString& name, const QPixmap& icon );
277 virtual QPixmap columnIcon( const QString& name ) const;
278 virtual void setAppropriate( const QString& name, const Qtx::Appropriate appr );
279 virtual Qtx::Appropriate appropriate( const QString& name ) const;
280 virtual void setVisibilityState(const QString& id, Qtx::VisibilityState state, bool emitChanged = true);
281 virtual void setVisibilityStateForAll(Qtx::VisibilityState state);
282 virtual Qtx::VisibilityState visibilityState(const QString& id) const;
283 virtual void setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags );
284 virtual Qtx::HeaderViewFlags headerFlags( const QString& name ) const;
285 virtual void emitClicked( SUIT_DataObject* obj, const QModelIndex& index);
287 virtual SUIT_DataSearcher* searcher() const;
288 virtual void setSearcher( SUIT_DataSearcher* );
290 QAbstractItemDelegate* delegate() const;
293 virtual void updateTree( const QModelIndex& );
294 virtual void updateTree( SUIT_DataObject* = 0 );
295 void setSortingEnabled( bool );
299 void clicked( SUIT_DataObject*, int );
300 void dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction );
301 void renamed( SUIT_DataObject* );
304 SUIT_AbstractModel* treeModel() const;
305 virtual bool filterAcceptsRow( int, const QModelIndex& ) const;
308 bool mySortingEnabled;
311 class SUIT_EXPORT SUIT_ItemDelegate : public QItemDelegate
316 SUIT_ItemDelegate( QObject* = 0 );
318 virtual void paint( QPainter*, const QStyleOptionViewItem&,
319 const QModelIndex& ) const;
321 virtual QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
325 #pragma warning( default:4251 )
328 #endif // SUIT_TREEMODEL_H