From f8f596ad3090738a15b676787c72994fece9bb0a Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Wed, 29 Jul 2020 23:28:05 +0100 Subject: [PATCH] qml: Layout the drop area and title bar inside the FloatingWindow We could just control geometry of the c++ title bar and geometry, but then the user wouldn't be able to style it, and users rather style things in QML than subclassing FloatingWindow and writing C++. So instance some .qml files to represent the drop area and floating window, so user can muck with. Hierarchy looks like this now: -QQuickWindow --FloatingWindowQuick (C++ QQuickItem) ---FloatingWindow.qml ----TitleBar.qml (reads state from TitleBar c++) ----DropArea.qml -----DropArea (C++ QQuickItem) ------Frame etc --- src/private/FloatingWindow_p.h | 7 ++- src/private/quick/FloatingWindowQuick.cpp | 8 ++++ src/private/quick/QWidgetAdapter_quick.cpp | 15 +++++++ src/private/quick/QWidgetAdapter_quick_p.h | 24 +--------- src/private/quick/QmlTypes.cpp | 1 + src/private/quick/qml/DropArea.qml | 18 ++++++++ src/private/quick/qml/FloatingWindow.qml | 52 ++++++++++++++++++++++ src/private/quick/qml/Frame.qml | 4 +- src/qtquick.qrc | 2 + 9 files changed, 106 insertions(+), 25 deletions(-) create mode 100644 src/private/quick/qml/DropArea.qml create mode 100644 src/private/quick/qml/FloatingWindow.qml diff --git a/src/private/FloatingWindow_p.h b/src/private/FloatingWindow_p.h index 50cbc55e..1c5ad856 100644 --- a/src/private/FloatingWindow_p.h +++ b/src/private/FloatingWindow_p.h @@ -30,10 +30,13 @@ class DropArea; class Frame; class MultiSplitter; -class DOCKS_EXPORT FloatingWindow : public QWidgetAdapter - , public Draggable +class DOCKS_EXPORT FloatingWindow + : public QWidgetAdapter + , public Draggable { Q_OBJECT + Q_PROPERTY(KDDockWidgets::TitleBar* titleBar READ titleBar CONSTANT) + Q_PROPERTY(KDDockWidgets::DropArea* dropArea READ dropArea CONSTANT) public: explicit FloatingWindow(MainWindowBase *parent = nullptr); explicit FloatingWindow(Frame *frame, MainWindowBase *parent = nullptr); diff --git a/src/private/quick/FloatingWindowQuick.cpp b/src/private/quick/FloatingWindowQuick.cpp index 3916322b..84842d84 100644 --- a/src/private/quick/FloatingWindowQuick.cpp +++ b/src/private/quick/FloatingWindowQuick.cpp @@ -40,6 +40,14 @@ void FloatingWindowQuick::init() { m_quickWindow->setResizeMode(QQuickView::SizeViewToRootObject); QWidgetAdapter::setParent(m_quickWindow->contentItem()); + + QQuickItem *visualItem = createItem(Config::self().qmlEngine(), QStringLiteral("qrc:/kddockwidgets/private/quick/qml/FloatingWindow.qml")); + Q_ASSERT(visualItem); + visualItem->setParent(this); + visualItem->setParentItem(this); + + //dropArea()->QWidgetAdapter::setParent(visualItem); + m_quickWindow->setFlags(windowFlags()); m_quickWindow->show(); m_quickWindow->setGeometry(200, 200, 800, 800); // TODO: remove diff --git a/src/private/quick/QWidgetAdapter_quick.cpp b/src/private/quick/QWidgetAdapter_quick.cpp index c599db3e..340976e1 100644 --- a/src/private/quick/QWidgetAdapter_quick.cpp +++ b/src/private/quick/QWidgetAdapter_quick.cpp @@ -24,6 +24,9 @@ #include #include #include +#include +#include +#include using namespace KDDockWidgets; @@ -211,6 +214,18 @@ Qt::WindowFlags QWidgetAdapter::windowFlags() const return m_requestedWindowFlags; } +QQuickItem *QWidgetAdapter::createItem(QQmlEngine *engine, const QString &filename) const +{ + QQmlComponent component(engine, filename); + QObject *obj = component.create(); + if (!obj) { + qWarning() << Q_FUNC_INFO << component.errorString(); + return nullptr; + } + + return qobject_cast(obj); +} + void QWidgetAdapter::setFlag(Qt::WindowType f, bool on) { if (QWindow *w = windowHandle()) { diff --git a/src/private/quick/QWidgetAdapter_quick_p.h b/src/private/quick/QWidgetAdapter_quick_p.h index 4b5332ba..7147d688 100644 --- a/src/private/quick/QWidgetAdapter_quick_p.h +++ b/src/private/quick/QWidgetAdapter_quick_p.h @@ -30,32 +30,12 @@ QT_BEGIN_NAMESPACE class QWindow; +class QQmlEngine; QT_END_NAMESPACE namespace KDDockWidgets { class FloatingWindow; -/* -class QuickItem : public QQuickItem -{ -public: - explicit QuickItem(QQuickItem *parent) - : QQuickItem(parent) - { - } - ~QuickItem() override; - - QRect geometry() const { return {}; } - void setGeometry(QRect) {} - - void releaseMouse() - { - ungrabMouse(); - } -}; -QuickItem::~QuickItem() {} -*/ - class DOCKS_EXPORT QWidgetAdapter : public QQuickItem { Q_OBJECT @@ -125,9 +105,9 @@ public: Qt::WindowFlags windowFlags() const; + QQuickItem *createItem(QQmlEngine *, const QString &filename) const; protected: void raiseAndActivate(); - virtual bool onResize(QSize newSize); virtual void onLayoutRequest(); virtual void onMousePress(); diff --git a/src/private/quick/QmlTypes.cpp b/src/private/quick/QmlTypes.cpp index 21822767..8cd159c0 100644 --- a/src/private/quick/QmlTypes.cpp +++ b/src/private/quick/QmlTypes.cpp @@ -24,4 +24,5 @@ void KDDockWidgets::registerQmlTypes() qmlRegisterType("com.kdab.dockwidgets", 1, 0, "MainWindowQuick"); qmlRegisterUncreatableType("com.kdab.dockwidgets", 1, 0, "TitleBar", QStringLiteral("Enum access only")); + qRegisterMetaType(); } diff --git a/src/private/quick/qml/DropArea.qml b/src/private/quick/qml/DropArea.qml new file mode 100644 index 00000000..e51cb639 --- /dev/null +++ b/src/private/quick/qml/DropArea.qml @@ -0,0 +1,18 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2019-2020 Klarälvdalens Datakonsult AB, a KDAB Group company + Author: Sérgio Martins + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only + + Contact KDAB at for commercial licensing options. +*/ + +import QtQuick 2.9 + +Rectangle { + id: root + property QtObject dropAreaCpp: null + color: "orange" +} diff --git a/src/private/quick/qml/FloatingWindow.qml b/src/private/quick/qml/FloatingWindow.qml new file mode 100644 index 00000000..a15c9e9e --- /dev/null +++ b/src/private/quick/qml/FloatingWindow.qml @@ -0,0 +1,52 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2019-2020 Klarälvdalens Datakonsult AB, a KDAB Group company + Author: Sérgio Martins + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only + + Contact KDAB at for commercial licensing options. +*/ + +import QtQuick 2.9 +import "." as KDDW + +Rectangle { + id: root + readonly property QtObject floatingWindowCpp: parent + readonly property QtObject titleBarCpp: floatingWindowCpp ? floatingWindowCpp.titleBar : null + readonly property QtObject dropAreaCpp: floatingWindowCpp ? floatingWindowCpp.dropArea : null + + color: "yellow" + anchors.fill: parent + + KDDW.TitleBar { + id: titleBar + height: 30 + titleBarCpp: root.titleBarCpp + + anchors { + top: parent.top + left: parent.left + right: parent.right + } + } + + KDDW.DropArea { + id: dropArea + dropAreaCpp: root.dropAreaCpp + anchors { + left: parent.left + right: parent.right + top: titleBar.bottom + bottom: parent.bottom + } + } + + onDropAreaCppChanged: { + // Parent the cpp obj to the visual obj. So the user can style it + dropAreaCpp.parent = dropArea; + dropAreaCpp.anchors.fill = dropArea; + } +} diff --git a/src/private/quick/qml/Frame.qml b/src/private/quick/qml/Frame.qml index 8d851df7..a7c21903 100644 --- a/src/private/quick/qml/Frame.qml +++ b/src/private/quick/qml/Frame.qml @@ -14,13 +14,15 @@ import QtQuick 2.9 Rectangle { id: root property QtObject frameCpp + readonly property QtObject titleBarCpp: frameCpp ? frameCpp.titleBar : null color: "cyan" anchors.fill: parent TitleBar { height: 30 - titleBarCpp: frameCpp ? frameCpp.titleBar : null + titleBarCpp: root.titleBarCpp + visible: true anchors { top: parent.top left: parent.left diff --git a/src/qtquick.qrc b/src/qtquick.qrc index fdfae72e..c1827a0a 100644 --- a/src/qtquick.qrc +++ b/src/qtquick.qrc @@ -1,5 +1,7 @@ + private/quick/qml/DropArea.qml + private/quick/qml/FloatingWindow.qml private/quick/qml/Frame.qml private/quick/qml/MainWindow.qml private/quick/qml/Separator.qml