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
26#include <array>
27
29
31
33
34class QLayoutItem;
35class QWidget;
36class QLayoutItem;
37class QDockAreaLayoutInfo;
38class QPlaceHolderItem;
39class QDockWidget;
40class QMainWindow;
41class QWidgetAnimator;
42class QMainWindowLayout;
43struct QLayoutStruct;
44class QTabBar;
45
46// The classes in this file represent the tree structure that represents all the docks
47// Also see the wiki internal documentation
48// At the root of the tree is: QDockAreaLayout, which handles all 4 sides, so there is only one.
49// For each side it has one QDockAreaLayoutInfo child. (See QDockAreaLayout::docks.)
50// The QDockAreaLayoutInfo have QDockAreaLayoutItems as children (See QDockAreaLayoutInfo::item_list),
51// which then has one QDockAreaLayoutInfo as a child. (QDockAreaLayoutItem::subInfo) or
52// a widgetItem if this is a node of the tree (QDockAreaLayoutItem::widgetItem)
53//
54// A path identifies uniquely one object in this tree, the first number being the side and all the following
55// indexes into the QDockAreaLayoutInfo::item_list.
56
57struct Q_AUTOTEST_EXPORT QDockAreaLayoutItem
58{
59 enum ItemFlags { NoFlags = 0, GapItem = 1, KeepSize = 2 };
60
61 explicit QDockAreaLayoutItem(QLayoutItem *_widgetItem = nullptr);
62 explicit QDockAreaLayoutItem(QDockAreaLayoutInfo *_subinfo);
63 explicit QDockAreaLayoutItem(QPlaceHolderItem *_placeHolderItem);
64 QDockAreaLayoutItem(const QDockAreaLayoutItem &other);
65 ~QDockAreaLayoutItem();
66
67 QDockAreaLayoutItem &operator = (const QDockAreaLayoutItem &other);
68
69 bool skip() const;
70 QSize minimumSize() const;
71 QSize maximumSize() const;
72 QSize sizeHint() const;
73 bool expansive(Qt::Orientation o) const;
74 bool hasFixedSize(Qt::Orientation o) const;
75
76 QLayoutItem *widgetItem;
77 QDockAreaLayoutInfo *subinfo;
78 QPlaceHolderItem *placeHolderItem;
79 int pos;
80 int size;
81 uint flags;
82#ifndef QT_NO_DEBUG_STREAM
83 friend Q_AUTOTEST_EXPORT QDebug operator<<(QDebug dbg, const QDockAreaLayoutItem &item);
84 friend Q_AUTOTEST_EXPORT QDebug operator<<(QDebug dbg, const QDockAreaLayoutItem *item);
85#endif
86};
87
88class Q_AUTOTEST_EXPORT QPlaceHolderItem
89{
90public:
91 QPlaceHolderItem() : hidden(false), window(false) {}
92 explicit QPlaceHolderItem(QWidget *w);
93
94 QString objectName;
95 bool hidden, window;
96 QRect topLevelRect;
97};
98
99class Q_AUTOTEST_EXPORT QDockAreaLayoutInfo
100{
101public:
102 QDockAreaLayoutInfo();
103 QDockAreaLayoutInfo(const int *_sep, QInternal::DockPosition _dockPos, Qt::Orientation _o,
104 int tbhape, QMainWindow *window);
105
106 QSize minimumSize() const;
107 QSize maximumSize() const;
108 QSize sizeHint() const;
109 QSize size() const;
110
111 bool insertGap(const QList<int> &path, QLayoutItem *dockWidgetItem);
112 QLayoutItem *plug(const QList<int> &path);
113 QLayoutItem *unplug(const QList<int> &path);
114 enum TabMode { NoTabs, AllowTabs, ForceTabs };
115 QList<int> gapIndex(const QPoint &pos, bool nestingEnabled,
116 TabMode tabMode) const;
117 void remove(const QList<int> &path);
118 void remove(QWidget *widget);
119 void unnest(int index);
120 void split(int index, Qt::Orientation orientation, QLayoutItem *dockWidgetItem);
121#if QT_CONFIG(tabbar)
122 void tab(int index, QLayoutItem *dockWidgetItem);
123#endif
124 QDockAreaLayoutItem &item(const QList<int> &path);
125 QDockAreaLayoutInfo *info(const QList<int> &path);
126 QDockAreaLayoutInfo *info(QWidget *widget);
127
128 void saveState(QDataStream &stream) const;
129 bool restoreState(QDataStream &stream, QList<QDockWidget*> &widgets, QInternal::CallMode,
130 int depth = 0);
131
132 void fitItems();
133 bool expansive(Qt::Orientation o) const;
134 int changeSize(int index, int size, bool below);
135 QRect itemRect(int index, bool isGap = false) const;
136 QRect itemRect(const QList<int> &path) const;
137 QRect separatorRect(int index) const;
138 QRect separatorRect(const QList<int> &path) const;
139
140 void clear();
141 bool isEmpty() const;
142 bool hasGapItem(const QList<int> &path) const;
143 bool onlyHasPlaceholders() const;
144 bool hasFixedSize() const;
145 QList<int> findSeparator(const QPoint &pos) const;
146 int next(int idx) const;
147 int prev(int idx) const;
148
149 QList<int> indexOf(const QWidget *widget) const;
150 QList<int> indexOfPlaceHolder(const QString &objectName) const;
151 std::unique_ptr<QLayoutItem> takeWidgetItem(QWidget *widget);
152
153 QDockWidget *apply(QWidgetAnimator::AnimationRule rule);
154
155 void paintSeparators(QPainter *p, QWidget *widget, const QRegion &clip,
156 const QPoint &mouse) const;
157 QRegion separatorRegion() const;
158 int separatorMove(int index, int delta);
159 int separatorMove(const QList<int> &separator, const QPoint &origin, const QPoint &dest);
160
161 QLayoutItem *itemAt(int *x, int index) const;
162 QLayoutItem *takeAt(int *x, int index);
163 void add(QWidget *widget);
164 void deleteAllLayoutItems();
165
166 QMainWindowLayout *mainWindowLayout() const;
167
168 const int *sep;
169 mutable QList<QWidget *> separatorWidgets;
170 QInternal::DockPosition dockPos;
171 Qt::Orientation o;
172 QRect rect;
173 QMainWindow *mainWindow;
174 QList<QDockAreaLayoutItem> item_list;
175#if QT_CONFIG(tabbar)
176 void updateSeparatorWidgets() const;
177 QSet<QWidget*> usedSeparatorWidgets() const;
178
179 quintptr currentTabId() const;
180 void setCurrentTab(QWidget *widget);
181 void setCurrentTabId(quintptr id);
182 QRect tabContentRect() const;
183 bool tabbed;
184 QTabBar *tabBar;
185 int tabBarShape;
186
187 void reparentWidgets(QWidget *p);
188 bool updateTabBar() const;
189 void setTabBarShape(int shape);
190 QSize tabBarMinimumSize() const;
191 QSize tabBarSizeHint() const;
192
193 QSet<QTabBar*> usedTabBars() const;
194
195 int tabIndexToListIndex(int) const;
196 void moveTab(int from, int to);
197#endif // QT_CONFIG(tabbar)
198};
199
200using QDockAreaLayoutCorners = std::array<Qt::DockWidgetArea, 4>;
201
202class Q_AUTOTEST_EXPORT QDockAreaLayout
203{
204public:
205 enum { EmptyDropAreaSize = 80 }; // when a dock area is empty, how "wide" is it?
206
207 QDockAreaLayoutCorners corners; // use a Qt::Corner for indexing
208 QRect rect;
209 QLayoutItem *centralWidgetItem;
210 QMainWindow *mainWindow;
211 QRect centralWidgetRect;
212 QDockAreaLayout(QMainWindow *win);
213 std::array<QDockAreaLayoutInfo, 4> docks;
214 int sep; // margin between a dock widget and its frame
215 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)
216 mutable QList<QWidget *> separatorWidgets;
217
218 bool isValid() const;
219
220 static QRect constrainedRect(QRect rect, QWidget *widget);
221 void saveState(QDataStream &stream) const;
222 bool restoreState(QDataStream &stream, const QList<QDockWidget*> &_dockWidgets, QInternal::CallMode callMode);
223
224 QList<int> indexOfPlaceHolder(const QString &objectName) const;
225 QList<int> indexOf(const QWidget *dockWidget) const;
226 QList<int> gapIndex(const QPoint &pos, bool disallowTabs) const;
227 QList<int> findSeparator(const QPoint &pos) const;
228
229 QDockAreaLayoutItem &item(const QList<int> &path);
230 QDockAreaLayoutInfo *info(const QList<int> &path);
231 const QDockAreaLayoutInfo *info(const QList<int> &path) const;
232 QDockAreaLayoutInfo *info(QWidget *widget);
233 QRect itemRect(const QList<int> &path) const;
234 QRect separatorRect(int index) const;
235 QRect separatorRect(const QList<int> &path) const;
236
237 bool insertGap(const QList<int> &path, QLayoutItem *dockWidgetItem);
238 QLayoutItem *plug(const QList<int> &path);
239 QLayoutItem *unplug(const QList<int> &path);
240 void remove(const QList<int> &path);
241 void removePlaceHolder(const QString &name);
242
243 void fitLayout();
244
245 void clear();
246
247 QSize sizeHint() const;
248 QSize minimumSize() const;
249 QSize minimumStableSize() const;
250 template<typename SizePMF, typename CenterPMF>
251 QSize size_helper(SizePMF sizeFn, CenterPMF centerFn) const;
252
253 void addDockWidget(QInternal::DockPosition pos, QDockWidget *dockWidget, Qt::Orientation orientation);
254 bool restoreDockWidget(QDockWidget *dockWidget);
255 void splitDockWidget(QDockWidget *after, QDockWidget *dockWidget,
256 Qt::Orientation orientation);
257#if QT_CONFIG(tabbar)
258 void tabifyDockWidget(QDockWidget *first, QDockWidget *second);
259#endif
260 void resizeDocks(const QList<QDockWidget *> &docks, const QList<int> &sizes, Qt::Orientation o);
261
262 void apply(QWidgetAnimator::AnimationRule rule);
263
264 void paintSeparators(QPainter *p, QWidget *widget, const QRegion &clip,
265 const QPoint &mouse) const;
266 QRegion separatorRegion() const;
267 int separatorMove(const QList<int> &separator, const QPoint &origin, const QPoint &dest);
268#if QT_CONFIG(tabbar)
269 void updateSeparatorWidgets() const;
270#endif // QT_CONFIG(tabbar)
271
272 QLayoutItem *itemAt(int *x, int index) const;
273 QLayoutItem *takeAt(int *x, int index);
274 void deleteAllLayoutItems();
275
276 void getGrid(QList<QLayoutStruct> *ver_struct_list, QList<QLayoutStruct> *hor_struct_list);
277 void setGrid(QList<QLayoutStruct> *ver_struct_list, QList<QLayoutStruct> *hor_struct_list);
278
279 QRect gapRect(const QList<int> &path) const;
280 QRect gapRect(QInternal::DockPosition dockPos) const;
281
282 void keepSize(QDockWidget *w);
283#if QT_CONFIG(tabbar)
284 QSet<QTabBar*> usedTabBars() const;
285 QSet<QWidget*> usedSeparatorWidgets() const;
286#endif // QT_CONFIG(tabbar)
287 void styleChangedEvent();
288};
289
290QT_END_NAMESPACE
291
292#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)