vizkit3d
qttreepropertybrowser.h
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 **
6 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 **
8 ** This file is part of a Qt Solutions component.
9 **
10 ** You may use this file under the terms of the BSD license as follows:
11 **
12 ** "Redistribution and use in source and binary forms, with or without
13 ** modification, are permitted provided that the following conditions are
14 ** met:
15 ** * Redistributions of source code must retain the above copyright
16 ** notice, this list of conditions and the following disclaimer.
17 ** * Redistributions in binary form must reproduce the above copyright
18 ** notice, this list of conditions and the following disclaimer in
19 ** the documentation and/or other materials provided with the
20 ** distribution.
21 ** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
22 ** the names of its contributors may be used to endorse or promote
23 ** products derived from this software without specific prior written
24 ** permission.
25 **
26 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
37 **
38 ****************************************************************************/
39 
40 
41 #ifndef QTTREEPROPERTYBROWSER_H
42 #define QTTREEPROPERTYBROWSER_H
43 
44 #include "qtpropertybrowser.h"
45 #include <QtGui/QTreeWidget>
46 #include <QtGui/QItemDelegate>
47 
48 #if QT_VERSION >= 0x040400
49 QT_BEGIN_NAMESPACE
50 #endif
51 
53 class QTreeWidgetItem;
55 
57 {
58  Q_OBJECT
59  Q_ENUMS(ResizeMode)
60  Q_PROPERTY(int indentation READ indentation WRITE setIndentation)
61  Q_PROPERTY(bool rootIsDecorated READ rootIsDecorated WRITE setRootIsDecorated)
62  Q_PROPERTY(bool alternatingRowColors READ alternatingRowColors WRITE setAlternatingRowColors)
63  Q_PROPERTY(bool headerVisible READ isHeaderVisible WRITE setHeaderVisible)
64  Q_PROPERTY(ResizeMode resizeMode READ resizeMode WRITE setResizeMode)
65  Q_PROPERTY(int splitterPosition READ splitterPosition WRITE setSplitterPosition)
66  Q_PROPERTY(bool propertiesWithoutValueMarked READ propertiesWithoutValueMarked WRITE setPropertiesWithoutValueMarked)
67 public:
68 
70  {
74  ResizeToContents
75  };
76 
77  QtTreePropertyBrowser(QWidget *parent = 0);
79 
80  int indentation() const;
81  void setIndentation(int i);
82 
83  bool rootIsDecorated() const;
84  void setRootIsDecorated(bool show);
85 
86  bool alternatingRowColors() const;
87  void setAlternatingRowColors(bool enable);
88 
89  bool isHeaderVisible() const;
90  void setHeaderVisible(bool visible);
91 
92  ResizeMode resizeMode() const;
93  void setResizeMode(ResizeMode mode);
94 
95  int splitterPosition() const;
96  void setSplitterPosition(int position);
97 
98  void setExpanded(QtBrowserItem *item, bool expanded);
99  bool isExpanded(QtBrowserItem *item) const;
100 
101  bool isItemVisible(QtBrowserItem *item) const;
102  void setItemVisible(QtBrowserItem *item, bool visible);
103 
104  void setBackgroundColor(QtBrowserItem *item, const QColor &color);
105  QColor backgroundColor(QtBrowserItem *item) const;
106  QColor calculatedBackgroundColor(QtBrowserItem *item) const;
107 
108  void setPropertiesWithoutValueMarked(bool mark);
109  bool propertiesWithoutValueMarked() const;
110 
111  void editItem(QtBrowserItem *item);
112 
113 Q_SIGNALS:
114 
115  void collapsed(QtBrowserItem *item);
116  void expanded(QtBrowserItem *item);
117 
118 protected:
119  virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem);
120  virtual void itemRemoved(QtBrowserItem *item);
121  virtual void itemChanged(QtBrowserItem *item);
122 
123 private:
124 
126  Q_DECLARE_PRIVATE(QtTreePropertyBrowser)
127  Q_DISABLE_COPY(QtTreePropertyBrowser)
128 
129  Q_PRIVATE_SLOT(d_func(), void slotCollapsed(const QModelIndex &))
130  Q_PRIVATE_SLOT(d_func(), void slotExpanded(const QModelIndex &))
131  Q_PRIVATE_SLOT(d_func(), void slotCurrentBrowserItemChanged(QtBrowserItem *))
132  Q_PRIVATE_SLOT(d_func(), void slotCurrentTreeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *))
133 
134 };
135 
137 {
138  QtTreePropertyBrowser *q_ptr;
139  Q_DECLARE_PUBLIC(QtTreePropertyBrowser)
140 
141 public:
142  QtTreePropertyBrowserPrivate();
143  void init(QWidget *parent);
144 
145  void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex);
146  void propertyRemoved(QtBrowserItem *index);
147  void propertyChanged(QtBrowserItem *index);
148  QWidget *createEditor(QtProperty *property, QWidget *parent) const
149  { return q_ptr->createEditor(property, parent); }
150  QtProperty *indexToProperty(const QModelIndex &index) const;
151  QTreeWidgetItem *indexToItem(const QModelIndex &index) const;
152  QtBrowserItem *indexToBrowserItem(const QModelIndex &index) const;
153  bool lastColumn(int column) const;
154  void disableItem(QTreeWidgetItem *item) const;
155  void enableItem(QTreeWidgetItem *item) const;
156  bool hasValue(QTreeWidgetItem *item) const;
157 
158  void slotCollapsed(const QModelIndex &index);
159  void slotExpanded(const QModelIndex &index);
160 
161  QColor calculatedBackgroundColor(QtBrowserItem *item) const;
162 
163  QtPropertyEditorView *treeWidget() const { return m_treeWidget; }
164  bool markPropertiesWithoutValue() const { return m_markPropertiesWithoutValue; }
165 
166  QtBrowserItem *currentItem() const;
167  void setCurrentItem(QtBrowserItem *browserItem, bool block);
168  void editItem(QtBrowserItem *browserItem);
169 
170  void slotCurrentBrowserItemChanged(QtBrowserItem *item);
171  void slotCurrentTreeItemChanged(QTreeWidgetItem *newItem, QTreeWidgetItem *);
172 
173  QTreeWidgetItem *editedItem() const;
174 
175 private:
176  void updateItem(QTreeWidgetItem *item);
177 
178  QMap<QtBrowserItem *, QTreeWidgetItem *> m_indexToItem;
179  QMap<QTreeWidgetItem *, QtBrowserItem *> m_itemToIndex;
180 
181  QMap<QtBrowserItem *, QColor> m_indexToBackgroundColor;
182 
183  QtPropertyEditorView *m_treeWidget;
184 
185  bool m_headerVisible;
187  class QtPropertyEditorDelegate *m_delegate;
188  bool m_markPropertiesWithoutValue;
189  bool m_browserChangedBlocked;
190  QIcon m_expandIcon;
191 };
192 
193 // ------------ QtPropertyEditorDelegate
194 class QtPropertyEditorDelegate : public QItemDelegate
195 {
196  Q_OBJECT
197 public:
198  QtPropertyEditorDelegate(QObject *parent = 0)
199  : QItemDelegate(parent), m_editorPrivate(0), m_editedItem(0), m_editedWidget(0), m_disablePainting(false)
200  {}
201 
203  { m_editorPrivate = editorPrivate; }
204 
205  QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
206  const QModelIndex &index) const;
207 
208  void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
209  const QModelIndex &index) const;
210 
211  void paint(QPainter *painter, const QStyleOptionViewItem &option,
212  const QModelIndex &index) const;
213 
214  QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
215 
216  void setModelData(QWidget *, QAbstractItemModel *,
217  const QModelIndex &) const {}
218 
219  void setEditorData(QWidget *, const QModelIndex &) const {}
220 
221  bool eventFilter(QObject *object, QEvent *event);
222  void closeEditor(QtProperty *property);
223 
224  QTreeWidgetItem *editedItem() const { return m_editedItem; }
225 
226 protected:
227 
228  void drawDecoration(QPainter *painter, const QStyleOptionViewItem &option,
229  const QRect &rect, const QPixmap &pixmap) const;
230  void drawDisplay(QPainter *painter, const QStyleOptionViewItem &option,
231  const QRect &rect, const QString &text) const;
232 
233 private slots:
234  void slotEditorDestroyed(QObject *object);
235 
236 private:
237  int indentation(const QModelIndex &index) const;
238 
239  typedef QMap<QWidget *, QtProperty *> EditorToPropertyMap;
240  mutable EditorToPropertyMap m_editorToProperty;
241 
242  typedef QMap<QtProperty *, QWidget *> PropertyToEditorMap;
243  mutable PropertyToEditorMap m_propertyToEditor;
244  QtTreePropertyBrowserPrivate *m_editorPrivate;
245  mutable QTreeWidgetItem *m_editedItem;
246  mutable QWidget *m_editedWidget;
247  mutable bool m_disablePainting;
248 };
249 
250 // ------------ QtPropertyEditorView
251 class QtPropertyEditorView : public QTreeWidget
252 {
253  Q_OBJECT
254 public:
255  QtPropertyEditorView(QWidget *parent = 0);
256 
258  { m_editorPrivate = editorPrivate; }
259 
260  QTreeWidgetItem *indexToItem(const QModelIndex &index) const
261  { return itemFromIndex(index); }
262 
263 protected:
264  void keyPressEvent(QKeyEvent *event);
265  void mousePressEvent(QMouseEvent *event);
266  void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
267 
268 private:
269  QtTreePropertyBrowserPrivate *m_editorPrivate;
270 };
271 
272 #if QT_VERSION >= 0x040400
273 QT_END_NAMESPACE
274 #endif
275 
276 #endif
QtPropertyEditorView * treeWidget() const
Definition: qttreepropertybrowser.h:163
QtAbstractPropertyBrowser provides a base class for implementing property browsers.
Definition: qtpropertybrowser.h:357
void setEditorData(QWidget *, const QModelIndex &) const
Definition: qttreepropertybrowser.h:219
QtBrowserItem * currentItem() const
Definition: qtpropertybrowser.cpp:1915
void setCurrentItem(QtBrowserItem *)
Definition: qtpropertybrowser.cpp:1925
void setEditorPrivate(QtTreePropertyBrowserPrivate *editorPrivate)
Definition: qttreepropertybrowser.h:257
The QtBrowserItem class represents a property in a property browser instance.
Definition: qtpropertybrowser.h:309
virtual void itemRemoved(QtBrowserItem *item)=0
Definition: qttreepropertybrowser.h:71
The QtTreePropertyBrowser class provides QTreeWidget based property browser.
Definition: qttreepropertybrowser.h:56
void setEditorPrivate(QtTreePropertyBrowserPrivate *editorPrivate)
Definition: qttreepropertybrowser.h:202
Definition: qttreepropertybrowser.h:136
virtual void itemChanged(QtBrowserItem *item)=0
virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem)=0
Definition: qttreepropertybrowser.h:251
bool markPropertiesWithoutValue() const
Definition: qttreepropertybrowser.h:164
QtPropertyEditorDelegate(QObject *parent=0)
Definition: qttreepropertybrowser.h:198
QTreeWidgetItem * indexToItem(const QModelIndex &index) const
Definition: qttreepropertybrowser.h:260
#define QT_QTPROPERTYBROWSER_EXPORT
Definition: qtpropertybrowser.h:66
ResizeMode
Definition: qttreepropertybrowser.h:69
Definition: qttreepropertybrowser.h:194
Definition: qttreepropertybrowser.h:73
The QtProperty class encapsulates an instance of a property.
Definition: qtpropertybrowser.h:74
QWidget * createEditor(QtProperty *property, QWidget *parent) const
Definition: qttreepropertybrowser.h:148
QTreeWidgetItem * editedItem() const
Definition: qttreepropertybrowser.h:224
virtual QWidget * createEditor(QtProperty *property, QWidget *parent)
Definition: qtpropertybrowser.cpp:1840
Definition: qttreepropertybrowser.h:72
void setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &) const
Definition: qttreepropertybrowser.h:216