1 // Copyright (C) 2007-2013 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.
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 );
201 TreeItem* rootItem() const;
202 TreeItem* treeItem( const QModelIndex& ) const;
203 TreeItem* treeItem( const SUIT_DataObject* ) const;
204 SUIT_DataObject* object( const TreeItem* ) const;
205 QString objectId( const QModelIndex& = QModelIndex() ) const;
207 TreeItem* createItem( SUIT_DataObject*, TreeItem* = 0, TreeItem* = 0 );
208 TreeItem* createItemAtPos( SUIT_DataObject*, TreeItem* = 0, int pos=0 );
209 void updateItem( TreeItem*, bool emitLayoutChanged );
210 void removeItem( TreeItem* );
213 void onInserted( SUIT_DataObject*, SUIT_DataObject* );
214 void onRemoved( SUIT_DataObject*, SUIT_DataObject* );
215 void onModified( SUIT_DataObject* );
218 typedef QMap<SUIT_DataObject*, TreeItem*> ItemMap;
224 Qtx::HeaderViewFlags myHeaderFlags;
225 Qtx::Appropriate myAppropriate;
229 typedef QMap<QString,Qtx::VisibilityState> VisibilityMap;
231 SUIT_DataObject* myRoot;
232 TreeItem* myRootItem;
234 VisibilityMap myVisibilityMap;
235 bool myAutoDeleteTree;
237 bool myUpdateModified;
238 QVector<ColumnInfo> myColumns;
240 friend class SUIT_TreeModel::TreeSync;
243 class SUIT_EXPORT SUIT_ProxyModel : public QSortFilterProxyModel, public SUIT_AbstractModel
248 SUIT_ProxyModel( QObject* = 0 );
249 SUIT_ProxyModel( SUIT_DataObject*, QObject* = 0 );
250 SUIT_ProxyModel( SUIT_AbstractModel*, QObject* = 0 );
253 SUIT_DataObject* root() const;
254 void setRoot( SUIT_DataObject* );
256 SUIT_DataObject* object( const QModelIndex& = QModelIndex() ) const;
257 QModelIndex index( const SUIT_DataObject*, int = 0 ) const;
259 bool autoDeleteTree() const;
260 void setAutoDeleteTree( const bool );
262 bool autoUpdate() const;
263 void setAutoUpdate( const bool );
265 bool updateModified() const;
266 void setUpdateModified( const bool );
268 bool isSortingEnabled() const;
269 bool customSorting( const int ) const;
271 virtual void forgetObject( const SUIT_DataObject* );
272 virtual bool lessThan( const QModelIndex&, const QModelIndex& ) const;
273 virtual void registerColumn( const int group_id, const QString& name, const int custom_id );
274 virtual void unregisterColumn( const int group_id, const QString& name );
275 virtual void setColumnIcon( const QString& name, const QPixmap& icon );
276 virtual QPixmap columnIcon( const QString& name ) const;
277 virtual void setAppropriate( const QString& name, const Qtx::Appropriate appr );
278 virtual Qtx::Appropriate appropriate( const QString& name ) const;
279 virtual void setVisibilityState(const QString& id, Qtx::VisibilityState state, bool emitChanged = true);
280 virtual void setVisibilityStateForAll(Qtx::VisibilityState state);
281 virtual Qtx::VisibilityState visibilityState(const QString& id) const;
282 virtual void setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags );
283 virtual Qtx::HeaderViewFlags headerFlags( const QString& name ) const;
284 virtual void emitClicked( SUIT_DataObject* obj, const QModelIndex& index);
286 virtual SUIT_DataSearcher* searcher() const;
287 virtual void setSearcher( SUIT_DataSearcher* );
289 QAbstractItemDelegate* delegate() const;
292 virtual void updateTree( const QModelIndex& );
293 virtual void updateTree( SUIT_DataObject* = 0 );
294 void setSortingEnabled( bool );
298 void clicked( SUIT_DataObject*, int );
299 void dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction );
302 SUIT_AbstractModel* treeModel() const;
303 virtual bool filterAcceptsRow( int, const QModelIndex& ) const;
306 bool mySortingEnabled;
309 class SUIT_EXPORT SUIT_ItemDelegate : public QItemDelegate
314 SUIT_ItemDelegate( QObject* = 0 );
316 virtual void paint( QPainter*, const QStyleOptionViewItem&,
317 const QModelIndex& ) const;
319 virtual QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
323 #pragma warning( default:4251 )
326 #endif // SUIT_TREEMODEL_H