Skip to content

Commit bb4ce95

Browse files
committed
qtquick: Support setting floating window flags from QML
1 parent 0d88012 commit bb4ce95

6 files changed

Lines changed: 91 additions & 2 deletions

File tree

src/KDDockWidgets.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,9 +361,9 @@ enum StackOption {
361361
Q_DECLARE_FLAGS(StackOptions, StackOption)
362362
Q_ENUM_NS(StackOptions)
363363

364-
/// @internal
364+
/// @brief Per-dock-widget flags controlling the floating window's title bar buttons and behaviour
365365
enum class FloatingWindowFlag {
366-
None = 0,
366+
NoFlags = 0,
367367
FromGlobalConfig = 1, // KDDockWidgets::Config is used instead
368368
TitleBarHasMinimizeButton = 2,
369369
TitleBarHasMaximizeButton = 4,
@@ -377,6 +377,7 @@ enum class FloatingWindowFlag {
377377
StartsMinimized = 1024
378378
};
379379
Q_DECLARE_FLAGS(FloatingWindowFlags, FloatingWindowFlag)
380+
Q_ENUM_NS(FloatingWindowFlags)
380381

381382
/// @internal
382383
enum class WindowState {

src/qtquick/DockWidgetInstantiator.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class DockWidgetInstantiator::Private
3333
QPointer<Core::DockWidget> m_dockWidget;
3434
QVector<QString> m_affinities;
3535
KDDockWidgets::DockWidgetOptions m_options = KDDockWidgets::DockWidgetOption_None;
36+
KDDockWidgets::FloatingWindowFlags m_floatingWindowFlags = KDDockWidgets::FloatingWindowFlag::FromGlobalConfig;
3637
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
3738
QVariantMap m_userData;
3839
KDBindings::ScopedConnection userDataConnection;
@@ -277,6 +278,22 @@ void DockWidgetInstantiator::setOptions(KDDockWidgets::DockWidgetOptions options
277278
}
278279
}
279280

281+
KDDockWidgets::FloatingWindowFlags DockWidgetInstantiator::floatingWindowFlags() const
282+
{
283+
return d->m_dockWidget ? d->m_dockWidget->floatingWindowFlags() : d->m_floatingWindowFlags;
284+
}
285+
286+
void DockWidgetInstantiator::setFloatingWindowFlags(KDDockWidgets::FloatingWindowFlags flags)
287+
{
288+
if (d->m_floatingWindowFlags != flags) {
289+
d->m_floatingWindowFlags = flags;
290+
if (d->m_dockWidget) {
291+
d->m_dockWidget->setFloatingWindowFlags(flags);
292+
}
293+
Q_EMIT floatingWindowFlagsChanged(flags);
294+
}
295+
}
296+
280297
KDDockWidgets::CloseReason DockWidgetInstantiator::lastCloseReason() const
281298
{
282299
return d->m_dockWidget ? d->m_dockWidget->lastCloseReason() : KDDockWidgets::CloseReason::Unspecified;
@@ -342,6 +359,7 @@ void DockWidgetInstantiator::componentComplete()
342359
d->m_dockWidget->setFloating(d->m_isFloating.value());
343360

344361
d->m_dockWidget->setAffinities(d->m_affinities);
362+
d->m_dockWidget->setFloatingWindowFlags(d->m_floatingWindowFlags);
345363

346364
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
347365
d->m_dockWidget->setUserData(d->m_userData);

src/qtquick/DockWidgetInstantiator.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class DockWidgetInstantiator : public QQuickItem
4545
Q_PROPERTY(bool isOpen READ isOpen NOTIFY isOpenChanged)
4646
Q_PROPERTY(QVector<QString> affinities READ affinities WRITE setAffinities NOTIFY affinitiesChanged)
4747
Q_PROPERTY(KDDockWidgets::DockWidgetOptions options READ options WRITE setOptions NOTIFY optionsChanged)
48+
Q_PROPERTY(KDDockWidgets::FloatingWindowFlags floatingWindowFlags READ floatingWindowFlags WRITE
49+
setFloatingWindowFlags NOTIFY floatingWindowFlagsChanged)
4850
Q_PROPERTY(KDDockWidgets::CloseReason lastCloseReason READ lastCloseReason NOTIFY lastCloseReasonChanged)
4951
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
5052
Q_PROPERTY(QVariantMap userData READ userData WRITE setUserData NOTIFY userDataChanged)
@@ -76,6 +78,9 @@ class DockWidgetInstantiator : public QQuickItem
7678
KDDockWidgets::DockWidgetOptions options() const;
7779
void setOptions(KDDockWidgets::DockWidgetOptions);
7880

81+
KDDockWidgets::FloatingWindowFlags floatingWindowFlags() const;
82+
void setFloatingWindowFlags(KDDockWidgets::FloatingWindowFlags);
83+
7984
KDDockWidgets::CloseReason lastCloseReason() const;
8085

8186
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
@@ -125,6 +130,7 @@ class DockWidgetInstantiator : public QQuickItem
125130
void closed();
126131
void guestViewChanged(QQuickItem *);
127132
void optionsChanged(KDDockWidgets::DockWidgetOptions);
133+
void floatingWindowFlagsChanged(KDDockWidgets::FloatingWindowFlags);
128134
void isFocusedChanged(bool);
129135
void isOverlayedChanged(bool);
130136
void isFloatingChanged(bool);
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
This file is part of KDDockWidgets.
3+
4+
SPDX-FileCopyrightText: 2026 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+
12+
import QtQuick 2.6
13+
import QtQuick.Controls 2.12
14+
import com.kdab.dockwidgets 2.0 as KDDW
15+
16+
ApplicationWindow {
17+
visible: true
18+
width: 1000
19+
height: 800
20+
21+
KDDW.DockingArea {
22+
anchors.fill: parent
23+
24+
uniqueName: "MyWindowName-titleBarHasMinimizeButton"
25+
26+
KDDW.DockWidget {
27+
id: dock1
28+
uniqueName: "dock1"
29+
floatingWindowFlags: KDDW.KDDockWidgets.FloatingWindowFlags.TitleBarHasMinimizeButton
30+
31+
Rectangle {
32+
anchors.fill: parent
33+
color: "blue"
34+
}
35+
}
36+
37+
Component.onCompleted: {
38+
// Never added to the layout, so it starts out floating.
39+
dock1.open();
40+
}
41+
}
42+
}

tests/qtquick/tst_qtquick.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ private Q_SLOTS:
7979
void tst_mainWindowNativeClose();
8080
void tst_setViewFactory();
8181
void tst_quickWindowCreationCallback();
82+
83+
/// Tests that DockWidget.floatingWindowFlags set from QML is honoured, using
84+
/// FloatingWindowFlag_TitleBarHasMinimizeButton as the observable case.
85+
void tst_floatingWindowFlagsFromQml();
8286
};
8387

8488

@@ -616,6 +620,23 @@ void TestQtQuick::tst_quickWindowCreationCallback()
616620
QtQuick::FloatingWindow::setQuickWindowCreationCallback(nullptr);
617621
}
618622

623+
void TestQtQuick::tst_floatingWindowFlagsFromQml()
624+
{
625+
EnsureTopLevelsDeleted e;
626+
QQmlApplicationEngine engine(":/main_titleBarHasMinimizeButton.qml");
627+
628+
auto dock1 = DockRegistry::self()->dockByName("dock1");
629+
QVERIFY(dock1);
630+
631+
QVERIFY(dock1->floatingWindowFlags() & FloatingWindowFlag::TitleBarHasMinimizeButton);
632+
633+
QVERIFY(dock1->isFloating());
634+
auto fw = dock1->floatingWindow();
635+
QVERIFY(fw);
636+
637+
QVERIFY(fw->titleBar()->supportsMinimizeButton());
638+
}
639+
619640
int main(int argc, char *argv[])
620641
{
621642
#ifdef KDDW_HAS_SPDLOG

tests/test_resources.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@
2323
<file>MyRectangle.qml</file>
2424
<file>main_tst_focusBetweenTabs.qml</file>
2525
<file>MyRectangle2.qml</file>
26+
<file>main_titleBarHasMinimizeButton.qml</file>
2627
</qresource>
2728
</RCC>

0 commit comments

Comments
 (0)