KDDockWidgets API Documentation 2.0
Loading...
Searching...
No Matches
Config.cpp
Go to the documentation of this file.
1/*
2 This file is part of KDDockWidgets.
3
4 SPDX-FileCopyrightText: 2019 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
5 Author: SĂ©rgio Martins <sergio.martins@kdab.com>
6
7 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
8
9 Contact KDAB at <info@kdab.com> for commercial licensing options.
10*/
11
19#include "Config.h"
20#include "core/layouting/Item_p.h"
21#include "core/DockRegistry.h"
22#include "core/DockRegistry_p.h"
23#include "core/Utils_p.h"
24#include "core/DragController_p.h"
25#include "core/ViewFactory.h"
26#include "core/Separator.h"
27#include "core/Platform.h"
28#include "core/View.h"
29#include "core/Logging_p.h"
30
31#include <iostream>
32#include <limits>
33
34using namespace KDDockWidgets::Core;
35
36namespace KDDockWidgets {
37
39{
40 if (auto platform = Platform::instance())
41 return platform->createDefaultViewFactory();
42
43 KDDW_ERROR("No Platform found. Forgot to call KDDockWidgets::initFrontend(<platform>) ?");
44 std::terminate();
45 return nullptr;
46}
47
48class Config::Private
49{
50public:
51 Private()
52 : m_viewFactory(createDefaultViewFactory())
53 {
54 }
55
56 ~Private()
57 {
58 delete m_viewFactory;
59 }
60
61 void fixFlags();
62
63 DockWidgetFactoryFunc m_dockWidgetFactoryFunc = nullptr;
64 MainWindowFactoryFunc m_mainWindowFactoryFunc = nullptr;
65 DropIndicatorAllowedFunc m_dropIndicatorAllowedFunc = nullptr;
66 DragAboutToStartFunc m_dragAboutToStartFunc = nullptr;
67 DragEndedFunc m_dragEndedFunc = nullptr;
68 ViewFactory *m_viewFactory = nullptr;
69 Flags m_flags = Flag_Default;
70 InternalFlags m_internalFlags = InternalFlag_None;
71 CustomizableWidgets m_disabledPaintEvents = CustomizableWidget_None;
72 double m_draggedWindowOpacity = std::numeric_limits<double>::quiet_NaN();
73 bool m_transparencyOnlyOverDropIndicator = false;
74 int m_mdiPopupThreshold = 250;
75 int m_startDragDistance = -1;
76 bool m_dropIndicatorsInhibited = false;
77 bool m_layoutSaverStrictMode = false;
78 bool m_onlyProgrammaticDrag = false;
79};
80
81Config::Config()
82 : d(new Private())
83{
84 d->fixFlags();
85}
86
87Config &Config::self()
88{
89 static Config config;
90 return config;
91}
92
93Config::~Config()
94{
95 delete d;
96}
97
98Config::Flags Config::flags() const
99{
100 return d->m_flags;
101}
102
103void Config::setFlags(Flags f)
104{
105 // Most flags aren't allowed to be changed at runtime.
106 // Some are. More can be supported but they need to be examined in a case-by-case
107 // basis.
108
109 static const Flags mutableFlags = Flag::Flag_AutoHideAsTabGroups;
110 const Flags changedFlags = f ^ d->m_flags;
111 const bool nonMutableFlagsChanged = (changedFlags & ~mutableFlags);
112
113 if (nonMutableFlagsChanged) {
114 auto dr = DockRegistry::self();
115 if (!dr->isEmpty(/*excludeBeingDeleted=*/true)) {
116 std::cerr
117 << "Config::setFlags: "
118 << "Only use this function at startup before creating any DockWidget or MainWindow"
119 << "; These are already created: " << dr->mainWindowsNames().size() << dr->dockWidgetNames().size()
120 << dr->floatingWindows().size() << "\n";
121 return;
122 }
123 }
124
125 d->m_flags = f;
126 d->fixFlags();
127}
128
130bool Config::hasFlag(Flag flag)
131{
132 return (Config::self().flags() & flag) == flag;
133}
134
135void Config::setDockWidgetFactoryFunc(DockWidgetFactoryFunc func)
136{
137 d->m_dockWidgetFactoryFunc = func;
138}
139
140DockWidgetFactoryFunc Config::dockWidgetFactoryFunc() const
141{
142 return d->m_dockWidgetFactoryFunc;
143}
144
145void Config::setMainWindowFactoryFunc(MainWindowFactoryFunc func)
146{
147 d->m_mainWindowFactoryFunc = func;
148}
149
150MainWindowFactoryFunc Config::mainWindowFactoryFunc() const
151{
152 return d->m_mainWindowFactoryFunc;
153}
154
155void Config::setViewFactory(ViewFactory *wf)
156{
157 assert(wf);
158 delete d->m_viewFactory;
159 d->m_viewFactory = wf;
160}
161
162ViewFactory *Config::viewFactory() const
163{
164 return d->m_viewFactory;
165}
166
167int Config::separatorThickness() const
168{
169 return Item::separatorThickness;
170}
171
172void Config::setSeparatorThickness(int value)
173{
174 if (!DockRegistry::self()->isEmpty(/*excludeBeingDeleted=*/true)) {
175 std::cerr
176 << "Config::setSeparatorThickness: Only use this function at startup before creating any DockWidget or MainWindow\n";
177 return;
178 }
179
180 if (value < 0 || value >= 100) {
181 std::cerr << "Config::setSeparatorThickness: Invalid value" << value << "\n";
182 return;
183 }
184
185 Item::separatorThickness = value;
186}
187
188void Config::setDraggedWindowOpacity(double opacity)
189{
190 d->m_draggedWindowOpacity = opacity;
191}
192
193void Config::setTransparencyOnlyOverDropIndicator(bool only)
194{
195 d->m_transparencyOnlyOverDropIndicator = only;
196}
197
198double Config::draggedWindowOpacity() const
199{
200 return d->m_draggedWindowOpacity;
201}
202
203bool Config::transparencyOnlyOverDropIndicator() const
204{
205 return d->m_transparencyOnlyOverDropIndicator;
206}
207
208void Config::setDropIndicatorAllowedFunc(DropIndicatorAllowedFunc func)
209{
210 d->m_dropIndicatorAllowedFunc = func;
211}
212
213DropIndicatorAllowedFunc Config::dropIndicatorAllowedFunc() const
214{
215 return d->m_dropIndicatorAllowedFunc;
216}
217
218void Config::setDragAboutToStartFunc(DragAboutToStartFunc func)
219{
220 d->m_dragAboutToStartFunc = func;
221}
222
223DragAboutToStartFunc Config::dragAboutToStartFunc() const
224{
225 return d->m_dragAboutToStartFunc;
226}
227
228void Config::setDragEndedFunc(DragEndedFunc func)
229{
230 d->m_dragEndedFunc = func;
231}
232
233DragEndedFunc Config::dragEndedFunc() const
234{
235 return d->m_dragEndedFunc;
236}
237
238void Config::setAbsoluteWidgetMinSize(Size size)
239{
240 if (!DockRegistry::self()->isEmpty(/*excludeBeingDeleted=*/false)) {
241 std::cerr
242 << "Config::setAbsoluteWidgetMinSize: Only use this function at startup before creating any DockWidget or MainWindow\n";
243 return;
244 }
245
246 Item::hardcodedMinimumSize = size;
247}
248
249Size Config::absoluteWidgetMinSize() const
250{
251 return Item::hardcodedMinimumSize;
252}
253
254void Config::setAbsoluteWidgetMaxSize(Size size)
255{
256 if (!DockRegistry::self()->isEmpty(/*excludeBeingDeleted=*/false)) {
257 std::cerr
258 << "Config::setAbsoluteWidgetMinSize: Only use this function at startup before creating any DockWidget or MainWindow\n";
259 return;
260 }
261
262 Item::hardcodedMaximumSize = size;
263}
264
265Size Config::absoluteWidgetMaxSize() const
266{
267 return Item::hardcodedMaximumSize;
268}
269
270Config::InternalFlags Config::internalFlags() const
271{
272 return d->m_internalFlags;
273}
274
275void Config::setInternalFlags(InternalFlags flags)
276{
277 d->m_internalFlags = flags;
278}
279
280void Config::Private::fixFlags()
281{
282 if (Platform::instance()->supportsAeroSnap()) {
283 // Unconditional now
284 m_flags |= Flag_AeroSnapWithClientDecos;
285 } else {
286 m_flags = m_flags & ~Flag_AeroSnapWithClientDecos;
287 }
288
289 // These are mutually exclusive:
290 if ((m_flags & Flag_AeroSnapWithClientDecos) && (m_flags & Flag_NativeTitleBar)) {
291 // We're either using native or client decorations, let's use native.
292 m_flags = m_flags & ~Flag_AeroSnapWithClientDecos;
293 }
294
295#if defined(Q_OS_LINUX)
296 if (KDDockWidgets::isWayland()) {
297 // Native title bar is forced on Wayland. Needed for moving the window.
298 // The inner KDDW title bar is used for DnD.
299 m_flags |= Flag_NativeTitleBar;
300 } else {
301 // On Linux, dragging the title bar of a window doesn't generate NonClientMouseEvents
302 // at least with KWin anyway. We can make this more granular and allow it for other
303 // X11 window managers
304 m_flags = m_flags & ~Flag_NativeTitleBar;
305 }
306#endif
307
308#if (!defined(KDDW_FRONTEND_QT_WINDOWS) && !defined(Q_OS_MACOS))
309 // QtQuick doesn't support AeroSnap yet. Some problem with the native events not being
310 // received...
311 m_flags = m_flags & ~Flag_AeroSnapWithClientDecos;
312#endif
313
314
315#if defined(DOCKS_DEVELOPER_MODE)
316 // We allow to disable aero-snap during development
317 if (m_internalFlags & InternalFlag_NoAeroSnap) {
318 // The only way to disable AeroSnap
319 m_flags = m_flags & ~Flag_AeroSnapWithClientDecos;
320 }
321#endif
322
323 if (m_flags & Flag_DontUseUtilityFloatingWindows) {
324 m_internalFlags |= InternalFlag_DontUseParentForFloatingWindows;
325 m_internalFlags |= InternalFlag_DontUseQtToolWindowsForFloatingWindows;
326 }
327
328 if (m_flags & Flag_ShowButtonsOnTabBarIfTitleBarHidden) {
329 // Flag_ShowButtonsOnTabBarIfTitleBarHidden doesn't make sense if used alone
330 m_flags |= Flag_HideTitleBarWhenTabsVisible;
331 }
332}
333
334void Config::setDisabledPaintEvents(CustomizableWidgets widgets)
335{
336 d->m_disabledPaintEvents = widgets;
337}
338
339Config::CustomizableWidgets Config::disabledPaintEvents() const
340{
341 return d->m_disabledPaintEvents;
342}
343
344void Config::setMDIPopupThreshold(int threshold)
345{
346 d->m_mdiPopupThreshold = threshold;
347}
348
349int Config::mdiPopupThreshold() const
350{
351 return d->m_mdiPopupThreshold;
352}
353
354void Config::setDropIndicatorsInhibited(bool inhibit) const
355{
356 if (d->m_dropIndicatorsInhibited != inhibit) {
357 d->m_dropIndicatorsInhibited = inhibit;
358 DockRegistry::self()->dptr()->dropIndicatorsInhibitedChanged.emit(inhibit);
359 }
360}
361
362bool Config::dropIndicatorsInhibited() const
363{
364 return d->m_dropIndicatorsInhibited;
365}
366
367void Config::setStartDragDistance(int pixels)
368{
369 d->m_startDragDistance = pixels;
370}
371
372int Config::startDragDistance() const
373{
374 return d->m_startDragDistance;
375}
376
377void Config::printDebug()
378{
379 std::cerr << "Flags: " << d->m_flags << d->m_internalFlags << "\n";
380}
381
382void Config::setLayoutSaverStrictMode(bool is)
383{
384 d->m_layoutSaverStrictMode = is;
385}
386
387bool Config::layoutSaverUsesStrictMode() const
388{
389 return d->m_layoutSaverStrictMode;
390}
391
392void Config::setOnlyProgrammaticDrag(bool only)
393{
394 d->m_onlyProgrammaticDrag = only;
395}
396
397bool Config::onlyProgrammaticDrag() const
398{
399 return d->m_onlyProgrammaticDrag;
400}
401
402}
Application-wide config to tune certain behaviours of the framework.
Singleton to allow to choose certain behaviours of the framework.
Definition Config.h:64
@ InternalFlag_None
The default.
Definition Config.h:156
@ CustomizableWidget_None
None.
Definition Config.h:138
Flag
Flag enum to tune certain behaviours, the defaults are Flag_Default.
Definition Config.h:77
@ Flag_Default
The defaults.
Definition Config.h:132
static Platform * instance()
Returns the platform singleton.
A factory class for allowing the user to customize some internal views. This is optional,...
Class to abstract QAction, so code still works with QtQuick and Flutter.
void(* DragEndedFunc)()
Definition Config.h:38
static ViewFactory * createDefaultViewFactory()
Definition Config.cpp:38
bool(* DropIndicatorAllowedFunc)(DropLocation location, const Vector< Core::DockWidget * > &source, const Vector< Core::DockWidget * > &target, Core::DropArea *dropArea)
Function to allow more granularity to disallow where widgets are dropped.
Definition Config.h:52
KDDockWidgets::Core::DockWidget *(* DockWidgetFactoryFunc)(const QString &name)
Definition Config.h:35
bool(* DragAboutToStartFunc)(Core::Draggable *draggable)
Definition Config.h:37
KDDockWidgets::Core::MainWindow *(* MainWindowFactoryFunc)(const QString &name, KDDockWidgets::MainWindowOptions)
Definition Config.h:36

© Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
KDDockWidgets
Advanced Dock Widget Framework for Qt
https://www.kdab.com/development-resources/qt-tools/kddockwidgets/
Generated by doxygen 1.9.8