|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the QtGui module of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 #ifndef QDOCKAREALAYOUT_P_H |
|
43 #define QDOCKAREALAYOUT_P_H |
|
44 |
|
45 // |
|
46 // W A R N I N G |
|
47 // ------------- |
|
48 // |
|
49 // This file is not part of the Qt API. It exists purely as an |
|
50 // implementation detail. This header file may change from version to |
|
51 // version without notice, or even be removed. |
|
52 // |
|
53 // We mean it. |
|
54 // |
|
55 |
|
56 #include "QtCore/qrect.h" |
|
57 #include "QtCore/qpair.h" |
|
58 #include "QtCore/qlist.h" |
|
59 #include "QtCore/qvector.h" |
|
60 #include "QtGui/qlayout.h" |
|
61 |
|
62 #ifndef QT_NO_DOCKWIDGET |
|
63 |
|
64 QT_BEGIN_NAMESPACE |
|
65 |
|
66 class QLayoutItem; |
|
67 class QWidget; |
|
68 class QLayoutItem; |
|
69 class QDockAreaLayoutInfo; |
|
70 class QPlaceHolderItem; |
|
71 class QDockWidget; |
|
72 class QMainWindow; |
|
73 class QWidgetAnimator; |
|
74 class QMainWindowLayout; |
|
75 struct QLayoutStruct; |
|
76 class QTabBar; |
|
77 |
|
78 // The classes in this file represent the tree structure that represents all the docks |
|
79 // Also see the wiki internal documentation |
|
80 // At the root of the tree is: QDockAreaLayout, which handles all 4 sides, so there is only one. |
|
81 // For each side it has one QDockAreaLayoutInfo child. (See QDockAreaLayout::docks.) |
|
82 // The QDockAreaLayoutInfo have QDockAreaLayoutItems as children (See QDockAreaLayoutInfo::item_list), |
|
83 // which then has one QDockAreaLayoutInfo as a child. (QDockAreaLayoutItem::subInfo) or |
|
84 // a widgetItem if this is a node of the tree (QDockAreaLayoutItem::widgetItem) |
|
85 // |
|
86 // A path indetifies uniquely one object in this tree, the first number beeing the side and all the following |
|
87 // indexes into the QDockAreaLayoutInfo::item_list. |
|
88 |
|
89 struct QDockAreaLayoutItem |
|
90 { |
|
91 enum ItemFlags { NoFlags = 0, GapItem = 1, KeepSize = 2 }; |
|
92 |
|
93 QDockAreaLayoutItem(QLayoutItem *_widgetItem = 0); |
|
94 QDockAreaLayoutItem(QDockAreaLayoutInfo *_subinfo); |
|
95 QDockAreaLayoutItem(QPlaceHolderItem *_placeHolderItem); |
|
96 QDockAreaLayoutItem(const QDockAreaLayoutItem &other); |
|
97 ~QDockAreaLayoutItem(); |
|
98 |
|
99 QDockAreaLayoutItem &operator = (const QDockAreaLayoutItem &other); |
|
100 |
|
101 bool skip() const; |
|
102 QSize minimumSize() const; |
|
103 QSize maximumSize() const; |
|
104 QSize sizeHint() const; |
|
105 bool expansive(Qt::Orientation o) const; |
|
106 bool hasFixedSize(Qt::Orientation o) const; |
|
107 |
|
108 QLayoutItem *widgetItem; |
|
109 QDockAreaLayoutInfo *subinfo; |
|
110 QPlaceHolderItem *placeHolderItem; |
|
111 int pos; |
|
112 int size; |
|
113 uint flags; |
|
114 }; |
|
115 |
|
116 class Q_AUTOTEST_EXPORT QPlaceHolderItem |
|
117 { |
|
118 public: |
|
119 QPlaceHolderItem() : hidden(false), window(false) {} |
|
120 QPlaceHolderItem(QWidget *w); |
|
121 |
|
122 QString objectName; |
|
123 bool hidden, window; |
|
124 QRect topLevelRect; |
|
125 }; |
|
126 |
|
127 class Q_AUTOTEST_EXPORT QDockAreaLayoutInfo |
|
128 { |
|
129 public: |
|
130 QDockAreaLayoutInfo(); |
|
131 QDockAreaLayoutInfo(int _sep, QInternal::DockPosition _dockPos, Qt::Orientation _o, |
|
132 int tbhape, QMainWindow *window); |
|
133 |
|
134 QSize minimumSize() const; |
|
135 QSize maximumSize() const; |
|
136 QSize sizeHint() const; |
|
137 QSize size() const; |
|
138 |
|
139 bool insertGap(const QList<int> &path, QLayoutItem *dockWidgetItem); |
|
140 QLayoutItem *plug(const QList<int> &path); |
|
141 QLayoutItem *unplug(const QList<int> &path); |
|
142 enum TabMode { NoTabs, AllowTabs, ForceTabs }; |
|
143 QList<int> gapIndex(const QPoint &pos, bool nestingEnabled, |
|
144 TabMode tabMode) const; |
|
145 void remove(const QList<int> &path); |
|
146 void unnest(int index); |
|
147 void split(int index, Qt::Orientation orientation, QLayoutItem *dockWidgetItem); |
|
148 void tab(int index, QLayoutItem *dockWidgetItem); |
|
149 QDockAreaLayoutItem &item(const QList<int> &path); |
|
150 QDockAreaLayoutInfo *info(const QList<int> &path); |
|
151 QDockAreaLayoutInfo *info(QWidget *widget); |
|
152 |
|
153 enum { // sentinel values used to validate state data |
|
154 SequenceMarker = 0xfc, |
|
155 TabMarker = 0xfa, |
|
156 WidgetMarker = 0xfb |
|
157 }; |
|
158 void saveState(QDataStream &stream) const; |
|
159 bool restoreState(QDataStream &stream, QList<QDockWidget*> &widgets, bool testing); |
|
160 |
|
161 void fitItems(); |
|
162 bool expansive(Qt::Orientation o) const; |
|
163 int changeSize(int index, int size, bool below); |
|
164 QRect itemRect(int index) const; |
|
165 QRect itemRect(const QList<int> &path) const; |
|
166 QRect separatorRect(int index) const; |
|
167 QRect separatorRect(const QList<int> &path) const; |
|
168 |
|
169 void clear(); |
|
170 bool isEmpty() const; |
|
171 bool hasFixedSize() const; |
|
172 QList<int> findSeparator(const QPoint &pos) const; |
|
173 int next(int idx) const; |
|
174 int prev(int idx) const; |
|
175 |
|
176 QList<int> indexOf(QWidget *widget) const; |
|
177 QList<int> indexOfPlaceHolder(const QString &objectName) const; |
|
178 |
|
179 void apply(bool animate); |
|
180 |
|
181 void paintSeparators(QPainter *p, QWidget *widget, const QRegion &clip, |
|
182 const QPoint &mouse) const; |
|
183 QRegion separatorRegion() const; |
|
184 int separatorMove(int index, int delta); |
|
185 |
|
186 QLayoutItem *itemAt(int *x, int index) const; |
|
187 QLayoutItem *takeAt(int *x, int index); |
|
188 void deleteAllLayoutItems(); |
|
189 |
|
190 QMainWindowLayout *mainWindowLayout() const; |
|
191 |
|
192 int sep; |
|
193 mutable QVector<QWidget*> separatorWidgets; |
|
194 QInternal::DockPosition dockPos; |
|
195 Qt::Orientation o; |
|
196 QRect rect; |
|
197 QMainWindow *mainWindow; |
|
198 QList<QDockAreaLayoutItem> item_list; |
|
199 |
|
200 void updateSeparatorWidgets() const; |
|
201 QSet<QWidget*> usedSeparatorWidgets() const; |
|
202 |
|
203 #ifndef QT_NO_TABBAR |
|
204 quintptr currentTabId() const; |
|
205 void setCurrentTab(QWidget *widget); |
|
206 void setCurrentTabId(quintptr id); |
|
207 QRect tabContentRect() const; |
|
208 bool tabbed; |
|
209 QTabBar *tabBar; |
|
210 QSize tabBarMin, tabBarHint; |
|
211 int tabBarShape; |
|
212 bool tabBarVisible; |
|
213 |
|
214 void updateTabBar() const; |
|
215 void setTabBarShape(int shape); |
|
216 QSize tabBarMinimumSize() const; |
|
217 QSize tabBarSizeHint() const; |
|
218 |
|
219 QSet<QTabBar*> usedTabBars() const; |
|
220 #endif // QT_NO_TABBAR |
|
221 }; |
|
222 |
|
223 class Q_AUTOTEST_EXPORT QDockAreaLayout |
|
224 { |
|
225 public: |
|
226 enum { EmptyDropAreaSize = 80 }; // when a dock area is empty, how "wide" is it? |
|
227 |
|
228 Qt::DockWidgetArea corners[4]; // use a Qt::Corner for indexing |
|
229 QRect rect; |
|
230 QLayoutItem *centralWidgetItem; |
|
231 QMainWindow *mainWindow; |
|
232 QRect centralWidgetRect; |
|
233 QDockAreaLayout(QMainWindow *win); |
|
234 QDockAreaLayoutInfo docks[4]; |
|
235 int sep; // separator extent |
|
236 mutable QVector<QWidget*> separatorWidgets; |
|
237 |
|
238 bool isValid() const; |
|
239 |
|
240 enum { DockWidgetStateMarker = 0xfd }; |
|
241 void saveState(QDataStream &stream) const; |
|
242 bool restoreState(QDataStream &stream, const QList<QDockWidget*> &widgets, bool testing = false); |
|
243 |
|
244 QList<int> indexOfPlaceHolder(const QString &objectName) const; |
|
245 QList<int> indexOf(QWidget *dockWidget) const; |
|
246 QList<int> gapIndex(const QPoint &pos) const; |
|
247 QList<int> findSeparator(const QPoint &pos) const; |
|
248 |
|
249 QDockAreaLayoutItem &item(const QList<int> &path); |
|
250 QDockAreaLayoutInfo *info(const QList<int> &path); |
|
251 const QDockAreaLayoutInfo *info(const QList<int> &path) const; |
|
252 QDockAreaLayoutInfo *info(QWidget *widget); |
|
253 QRect itemRect(const QList<int> &path) const; |
|
254 QRect separatorRect(int index) const; |
|
255 QRect separatorRect(const QList<int> &path) const; |
|
256 |
|
257 bool insertGap(const QList<int> &path, QLayoutItem *dockWidgetItem); |
|
258 QLayoutItem *plug(const QList<int> &path); |
|
259 QLayoutItem *unplug(const QList<int> &path); |
|
260 void remove(const QList<int> &path); |
|
261 |
|
262 void fitLayout(); |
|
263 |
|
264 void clear(); |
|
265 |
|
266 QSize sizeHint() const; |
|
267 QSize minimumSize() const; |
|
268 |
|
269 void addDockWidget(QInternal::DockPosition pos, QDockWidget *dockWidget, Qt::Orientation orientation); |
|
270 bool restoreDockWidget(QDockWidget *dockWidget); |
|
271 void splitDockWidget(QDockWidget *after, QDockWidget *dockWidget, |
|
272 Qt::Orientation orientation); |
|
273 void tabifyDockWidget(QDockWidget *first, QDockWidget *second); |
|
274 |
|
275 void apply(bool animate); |
|
276 |
|
277 void paintSeparators(QPainter *p, QWidget *widget, const QRegion &clip, |
|
278 const QPoint &mouse) const; |
|
279 QRegion separatorRegion() const; |
|
280 int separatorMove(const QList<int> &separator, const QPoint &origin, const QPoint &dest); |
|
281 void updateSeparatorWidgets() const; |
|
282 |
|
283 QLayoutItem *itemAt(int *x, int index) const; |
|
284 QLayoutItem *takeAt(int *x, int index); |
|
285 void deleteAllLayoutItems(); |
|
286 |
|
287 void getGrid(QVector<QLayoutStruct> *ver_struct_list, |
|
288 QVector<QLayoutStruct> *hor_struct_list); |
|
289 void setGrid(QVector<QLayoutStruct> *ver_struct_list, |
|
290 QVector<QLayoutStruct> *hor_struct_list); |
|
291 |
|
292 QRect gapRect(const QList<int> &path) const; |
|
293 |
|
294 void keepSize(QDockWidget *w); |
|
295 |
|
296 QSet<QTabBar*> usedTabBars() const; |
|
297 QSet<QWidget*> usedSeparatorWidgets() const; |
|
298 }; |
|
299 |
|
300 QT_END_NAMESPACE |
|
301 |
|
302 #endif // QT_NO_QDOCKWIDGET |
|
303 |
|
304 #endif // QDOCKAREALAYOUT_P_H |