Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qdockarealayout_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QDOCKAREALAYOUT_P_H
6#define QDOCKAREALAYOUT_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtWidgets/private/qtwidgetsglobal_p.h>
20#include <QtWidgets/private/qwidgetanimator_p.h>
21#include "QtWidgets/qlayout.h"
22#include "QtCore/qlist.h"
23#include "QtCore/qloggingcategory.h"
24#include "QtCore/qrect.h"
25
27
29
31
32class QLayoutItem;
33class QWidget;
34class QLayoutItem;
35class QDockAreaLayoutInfo;
36class QPlaceHolderItem;
37class QDockWidget;
38class QMainWindow;
39class QWidgetAnimator;
40class QMainWindowLayout;
41struct QLayoutStruct;
42class QTabBar;
43
44// The classes in this file represent the tree structure that represents all the docks
45// Also see the wiki internal documentation
46// At the root of the tree is: QDockAreaLayout, which handles all 4 sides, so there is only one.
47// For each side it has one QDockAreaLayoutInfo child. (See QDockAreaLayout::docks.)
48// The QDockAreaLayoutInfo have QDockAreaLayoutItems as children (See QDockAreaLayoutInfo::item_list),
49// which then has one QDockAreaLayoutInfo as a child. (QDockAreaLayoutItem::subInfo) or
50// a widgetItem if this is a node of the tree (QDockAreaLayoutItem::widgetItem)
51//
52// A path identifies uniquely one object in this tree, the first number being the side and all the following
53// indexes into the QDockAreaLayoutInfo::item_list.
54
55struct Q_AUTOTEST_EXPORT QDockAreaLayoutItem
56{
57 enum ItemFlags { NoFlags = 0, GapItem = 1, KeepSize = 2 };
58
59 explicit QDockAreaLayoutItem(QLayoutItem *_widgetItem = nullptr);
60 explicit QDockAreaLayoutItem(QDockAreaLayoutInfo *_subinfo);
61 explicit QDockAreaLayoutItem(QPlaceHolderItem *_placeHolderItem);
62 QDockAreaLayoutItem(const QDockAreaLayoutItem &other);
63 ~QDockAreaLayoutItem();
64
65 QDockAreaLayoutItem &operator = (const QDockAreaLayoutItem &other);
66
67 bool skip() const;
68 QSize minimumSize() const;
69 QSize maximumSize() const;
70 QSize sizeHint() const;
71 bool expansive(Qt::Orientation o) const;
72 bool hasFixedSize(Qt::Orientation o) const;
73
74 QLayoutItem *widgetItem;
75 QDockAreaLayoutInfo *subinfo;
76 QPlaceHolderItem *placeHolderItem;
77 int pos;
78 int size;
79 uint flags;
80#ifndef QT_NO_DEBUG_STREAM
81 friend Q_AUTOTEST_EXPORT QDebug operator<<(QDebug dbg, const QDockAreaLayoutItem &item);
82 friend Q_AUTOTEST_EXPORT QDebug operator<<(QDebug dbg, const QDockAreaLayoutItem *item);
83#endif
84};
85
86class Q_AUTOTEST_EXPORT QPlaceHolderItem
87{
88public:
89 QPlaceHolderItem() : hidden(false), window(false) {}
90 explicit QPlaceHolderItem(QWidget *w);
91
92 QString objectName;
93 bool hidden, window;
94 QRect topLevelRect;
95};
96
97class Q_AUTOTEST_EXPORT QDockAreaLayoutInfo
98{
99public:
100 QDockAreaLayoutInfo();
101 QDockAreaLayoutInfo(const int *_sep, QInternal::DockPosition _dockPos, Qt::Orientation _o,
102 int tbhape, QMainWindow *window);
103
104 QSize minimumSize() const;
105 QSize maximumSize() const;
106 QSize sizeHint() const;
107 QSize size() const;
108
109 bool insertGap(const QList<int> &path, QLayoutItem *dockWidgetItem);
110 QLayoutItem *plug(const QList<int> &path);
111 QLayoutItem *unplug(const QList<int> &path);
112 enum TabMode { NoTabs, AllowTabs, ForceTabs };
113 QList<int> gapIndex(const QPoint &pos, bool nestingEnabled,
114 TabMode tabMode) const;
115 void remove(const QList<int> &path);
116 void remove(QWidget *widget);
117 void unnest(int index);
118 void split(int index, Qt::Orientation orientation, QLayoutItem *dockWidgetItem);
119#if QT_CONFIG(tabbar)
120 void tab(int index, QLayoutItem *dockWidgetItem);
121#endif
122 QDockAreaLayoutItem &item(const QList<int> &path);
123 QDockAreaLayoutInfo *info(const QList<int> &path);
124 QDockAreaLayoutInfo *info(QWidget *widget);
125
126 void saveState(QDataStream &stream) const;
127 bool restoreState(QDataStream &stream, QList<QDockWidget*> &widgets, QInternal::CallMode);
128
129 void fitItems();
130 bool expansive(Qt::Orientation o) const;
131 int changeSize(int index, int size, bool below);
132 QRect itemRect(int index, bool isGap = false) const;
133 QRect itemRect(const QList<int> &path) const;
134 QRect separatorRect(int index) const;
135 QRect separatorRect(const QList<int> &path) const;
136
137 void clear();
138 bool isEmpty() const;
139 bool hasGapItem(const QList<int> &path) const;
140 bool onlyHasPlaceholders() const;
141 bool hasFixedSize() const;
142 QList<int> findSeparator(const QPoint &pos) const;
143 int next(int idx) const;
144 int prev(int idx) const;
145
146 QList<int> indexOf(const QWidget *widget) const;
147 QList<int> indexOfPlaceHolder(const QString &objectName) const;
148 std::unique_ptr<QLayoutItem> takeWidgetItem(QWidget *widget);
149
150 QDockWidget *apply(QWidgetAnimator::AnimationRule rule);
151
152 void paintSeparators(QPainter *p, QWidget *widget, const QRegion &clip,
153 const QPoint &mouse) const;
154 QRegion separatorRegion() const;
155 int separatorMove(int index, int delta);
156 int separatorMove(const QList<int> &separator, const QPoint &origin, const QPoint &dest);
157
158 QLayoutItem *itemAt(int *x, int index) const;
159 QLayoutItem *takeAt(int *x, int index);
160 void add(QWidget *widget);
161 void deleteAllLayoutItems();
162
163 QMainWindowLayout *mainWindowLayout() const;
164
165 const int *sep;
166 mutable QList<QWidget *> separatorWidgets;
167 QInternal::DockPosition dockPos;
168 Qt::Orientation o;
169 QRect rect;
170 QMainWindow *mainWindow;
171 QList<QDockAreaLayoutItem> item_list;
172#if QT_CONFIG(tabbar)
173 void updateSeparatorWidgets() const;
174 QSet<QWidget*> usedSeparatorWidgets() const;
175
176 quintptr currentTabId() const;
177 void setCurrentTab(QWidget *widget);
178 void setCurrentTabId(quintptr id);
179 QRect tabContentRect() const;
180 bool tabbed;
181 QTabBar *tabBar;
182 int tabBarShape;
183
184 void reparentWidgets(QWidget *p);
185 bool updateTabBar() const;
186 void setTabBarShape(int shape);
187 QSize tabBarMinimumSize() const;
188 QSize tabBarSizeHint() const;
189
190 QSet<QTabBar*> usedTabBars() const;
191
192 int tabIndexToListIndex(int) const;
193 void moveTab(int from, int to);
194#endif // QT_CONFIG(tabbar)
195};
196
197class Q_AUTOTEST_EXPORT QDockAreaLayout
198{
199public:
200 enum { EmptyDropAreaSize = 80 }; // when a dock area is empty, how "wide" is it?
201
202 Qt::DockWidgetArea corners[4]; // use a Qt::Corner for indexing
203 QRect rect;
204 QLayoutItem *centralWidgetItem;
205 QMainWindow *mainWindow;
206 QRect centralWidgetRect;
207 QDockAreaLayout(QMainWindow *win);
208 QDockAreaLayoutInfo docks[4];
209 int sep; // margin between a dock widget and its frame
210 bool fallbackToSizeHints; //determines if we should use the sizehint for the dock areas (true until the layout is restored or the separator is moved by user)
211 mutable QList<QWidget *> separatorWidgets;
212
213 bool isValid() const;
214
215 static QRect constrainedRect(QRect rect, QWidget *widget);
216 void saveState(QDataStream &stream) const;
217 bool restoreState(QDataStream &stream, const QList<QDockWidget*> &_dockWidgets, QInternal::CallMode callMode);
218
219 QList<int> indexOfPlaceHolder(const QString &objectName) const;
220 QList<int> indexOf(const QWidget *dockWidget) const;
221 QList<int> gapIndex(const QPoint &pos, bool disallowTabs) const;
222 QList<int> findSeparator(const QPoint &pos) const;
223
224 QDockAreaLayoutItem &item(const QList<int> &path);
225 QDockAreaLayoutInfo *info(const QList<int> &path);
226 const QDockAreaLayoutInfo *info(const QList<int> &path) const;
227 QDockAreaLayoutInfo *info(QWidget *widget);
228 QRect itemRect(const QList<int> &path) const;
229 QRect separatorRect(int index) const;
230 QRect separatorRect(const QList<int> &path) const;
231
232 bool insertGap(const QList<int> &path, QLayoutItem *dockWidgetItem);
233 QLayoutItem *plug(const QList<int> &path);
234 QLayoutItem *unplug(const QList<int> &path);
235 void remove(const QList<int> &path);
236 void removePlaceHolder(const QString &name);
237
238 void fitLayout();
239
240 void clear();
241
242 QSize sizeHint() const;
243 QSize minimumSize() const;
244 QSize minimumStableSize() const;
245 template<typename SizePMF, typename CenterPMF>
246 QSize size_helper(SizePMF sizeFn, CenterPMF centerFn) const;
247
248 void addDockWidget(QInternal::DockPosition pos, QDockWidget *dockWidget, Qt::Orientation orientation);
249 bool restoreDockWidget(QDockWidget *dockWidget);
250 void splitDockWidget(QDockWidget *after, QDockWidget *dockWidget,
251 Qt::Orientation orientation);
252#if QT_CONFIG(tabbar)
253 void tabifyDockWidget(QDockWidget *first, QDockWidget *second);
254#endif
255 void resizeDocks(const QList<QDockWidget *> &docks, const QList<int> &sizes, Qt::Orientation o);
256
257 void apply(QWidgetAnimator::AnimationRule rule);
258
259 void paintSeparators(QPainter *p, QWidget *widget, const QRegion &clip,
260 const QPoint &mouse) const;
261 QRegion separatorRegion() const;
262 int separatorMove(const QList<int> &separator, const QPoint &origin, const QPoint &dest);
263#if QT_CONFIG(tabbar)
264 void updateSeparatorWidgets() const;
265#endif // QT_CONFIG(tabbar)
266
267 QLayoutItem *itemAt(int *x, int index) const;
268 QLayoutItem *takeAt(int *x, int index);
269 void deleteAllLayoutItems();
270
271 void getGrid(QList<QLayoutStruct> *ver_struct_list, QList<QLayoutStruct> *hor_struct_list);
272 void setGrid(QList<QLayoutStruct> *ver_struct_list, QList<QLayoutStruct> *hor_struct_list);
273
274 QRect gapRect(const QList<int> &path) const;
275 QRect gapRect(QInternal::DockPosition dockPos) const;
276
277 void keepSize(QDockWidget *w);
278#if QT_CONFIG(tabbar)
279 QSet<QTabBar*> usedTabBars() const;
280 QSet<QWidget*> usedSeparatorWidgets() const;
281#endif // QT_CONFIG(tabbar)
282 void styleChangedEvent();
283};
284
285QT_END_NAMESPACE
286
287#endif // QDOCKAREALAYOUT_P_H
friend class QWidget
Definition qpainter.h:432
Combined button and popup list for selecting options.
static int grow(QLayoutStruct &ls, int delta)
static QRect dockedGeometry(QWidget *widget)
static Qt::DockWidgetArea toDockWidgetArea(QInternal::DockPosition pos)
static int realMinSize(const QDockAreaLayoutInfo &info)
static int qMax(int i1, int i2, int i3)
static int shrink(QLayoutStruct &ls, int delta)
Q_DECLARE_FLAGS(StateFlags, StateFlag)
static const int zero
static int separatorMoveHelper(QList< QLayoutStruct > &list, int index, int delta, int sep)
static QInternal::DockPosition dockPosHelper(const QRect &rect, const QPoint &_pos, Qt::Orientation o, bool nestingEnabled, QDockAreaLayoutInfo::TabMode tabMode)
static void paintSep(QPainter *p, QWidget *w, const QRect &r, Qt::Orientation o, bool mouse_over)
static int realMaxSize(const QDockAreaLayoutInfo &info)
QMainWindowLayout * qt_mainwindow_layout(const QMainWindow *window)
QT_REQUIRE_CONFIG(dockwidget)
QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcQIORing)