diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 58e8adcc..50f3fb42 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -172,8 +172,8 @@ SET(KDDW_FRONTEND_QTQUICK_SRCS qtquick/LayoutSaverInstantiator.h # qtquick/MainWindowInstantiator.cpp # qtquick/MainWindowInstantiator.h - # qtquick/DockWidgetInstantiator.cpp - # qtquick/DockWidgetInstantiator.h + qtquick/DockWidgetInstantiator.cpp + qtquick/DockWidgetInstantiator.h qtquick/QmlTypes.cpp qtquick/QmlTypes.h qtquick/views/DropArea_qtquick.cpp diff --git a/src/qtquick/DockWidgetInstantiator.cpp b/src/qtquick/DockWidgetInstantiator.cpp index 2a585ac1..71fb44e0 100644 --- a/src/qtquick/DockWidgetInstantiator.cpp +++ b/src/qtquick/DockWidgetInstantiator.cpp @@ -36,14 +36,27 @@ void DockWidgetInstantiator::setSource(const QString &source) Q_EMIT sourceChanged(); } -Controllers::DockWidget *DockWidgetInstantiator::dockWidget() const +Views::DockWidget_qtquick *DockWidgetInstantiator::dockWidget() const +{ + if (m_dockWidget) { + return static_cast(m_dockWidget->view()); + } + + return nullptr; +} + +KDDockWidgets::Controllers::DockWidget *DockWidgetInstantiator::controller() const { return m_dockWidget; } -TitleBar *DockWidgetInstantiator::actualTitleBar() const +QObject *DockWidgetInstantiator::actualTitleBar() const { - return m_dockWidget ? m_dockWidget->actualTitleBar() : nullptr; + if (auto dockView = dockWidget()) { + return dockView->actualTitleBarView(); + } + + return nullptr; } QString DockWidgetInstantiator::title() const @@ -79,7 +92,7 @@ void DockWidgetInstantiator::addDockWidgetAsTab(DockWidgetInstantiator *other, InitialVisibilityOption option) { if (m_dockWidget) - m_dockWidget->addDockWidgetAsTab(other ? other->dockWidget() : nullptr, option); + m_dockWidget->addDockWidgetAsTab(other ? other->controller() : nullptr, option); } void DockWidgetInstantiator::addDockWidgetAsTab(Controllers::DockWidget *other, @@ -108,8 +121,8 @@ void DockWidgetInstantiator::addDockWidgetToContainingWindow(DockWidgetInstantia { if (m_dockWidget) m_dockWidget->addDockWidgetToContainingWindow( - other ? other->dockWidget() : nullptr, location, - relativeTo ? relativeTo->dockWidget() : nullptr, InitialOption(option, initialSize)); + other ? other->controller() : nullptr, location, + relativeTo ? relativeTo->controller() : nullptr, InitialOption(option, initialSize)); } void DockWidgetInstantiator::setAsCurrentTab() @@ -178,7 +191,8 @@ void DockWidgetInstantiator::componentComplete() return; } - m_dockWidget = new Controllers::DockWidget(m_uniqueName, {}, {}, qmlEngine(this)); + // TODOv2: Pass qmlEngine(this). Instantiate the DockWidget view directly. + m_dockWidget = new Controllers::DockWidget(m_uniqueName, {}, {}); connect(m_dockWidget, &Controllers::DockWidget::titleChanged, this, &DockWidgetInstantiator::titleChanged); @@ -190,8 +204,9 @@ void DockWidgetInstantiator::componentComplete() connect(m_dockWidget, &Controllers::DockWidget::hidden, this, &DockWidgetInstantiator::hidden); connect(m_dockWidget, &Controllers::DockWidget::iconChanged, this, &DockWidgetInstantiator::iconChanged); - connect(m_dockWidget, &Controllers::DockWidget::widgetChanged, this, - &DockWidgetInstantiator::widgetChanged); + connect(m_dockWidget, &Controllers::DockWidget::guestViewChanged, this, [this] { + Q_EMIT guestViewChanged(Views::asQQuickItem(m_dockWidget->guestView().get())); + }); connect(m_dockWidget, &Controllers::DockWidget::isFocusedChanged, this, &DockWidgetInstantiator::isFocusedChanged); connect(m_dockWidget, &Controllers::DockWidget::isFocusedChanged, this, @@ -207,9 +222,10 @@ void DockWidgetInstantiator::componentComplete() if (m_sourceFilename.isEmpty()) { - m_dockWidget->setWidget(childItems.constFirst()); + m_dockWidget->setGuestView(Views::asQQuickWrapper(childItems.constFirst())); } else { - m_dockWidget->setWidget(m_sourceFilename); + auto view = this->dockWidget(); + view->setWidget(m_sourceFilename); } if (!m_title.isEmpty()) diff --git a/src/qtquick/DockWidgetInstantiator.h b/src/qtquick/DockWidgetInstantiator.h index 3b7ee938..a886fca3 100644 --- a/src/qtquick/DockWidgetInstantiator.h +++ b/src/qtquick/DockWidgetInstantiator.h @@ -12,7 +12,8 @@ #ifndef KD_DOCKWIDGET_INSTANTIATOR_P_H #define KD_DOCKWIDGET_INSTANTIATOR_P_H -#include "controllers/DockWidget.h" +#include "qtquick/views/DockWidget_qtquick.h" +#include "qtquick/views/TitleBar_qtquick.h" #include #include @@ -36,9 +37,8 @@ class DockWidgetInstantiator : public QQuickItem Q_OBJECT Q_PROPERTY(QString uniqueName READ uniqueName WRITE setUniqueName NOTIFY uniqueNameChanged) Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged) - Q_PROPERTY(KDDockWidgets::DockWidgetQuick *dockWidget READ dockWidget NOTIFY dockWidgetChanged) - Q_PROPERTY( - KDDockWidgets::TitleBar *actualTitleBar READ actualTitleBar NOTIFY actualTitleBarChanged) + Q_PROPERTY(KDDockWidgets::Views::DockWidget_qtquick *dockWidget READ dockWidget NOTIFY dockWidgetChanged) + Q_PROPERTY(QObject *actualTitleBar READ actualTitleBar NOTIFY actualTitleBarChanged) Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged) Q_PROPERTY(bool isFocused READ isFocused NOTIFY isFocusedChanged) Q_PROPERTY(bool isFloating READ isFloating WRITE setFloating NOTIFY isFloatingChanged) @@ -49,8 +49,9 @@ public: QString source() const; void setSource(const QString &); - Controllers::DockWidget *dockWidget() const; - KDDockWidgets::TitleBar *actualTitleBar() const; + KDDockWidgets::Views::DockWidget_qtquick *dockWidget() const; + KDDockWidgets::Controllers::DockWidget *controller() const; + QObject *actualTitleBar() const; QString title() const; void setTitle(const QString &title); @@ -96,7 +97,7 @@ Q_SIGNALS: void shown(); void hidden(); void iconChanged(); - void widgetChanged(QQuickItem *); + void guestViewChanged(QQuickItem *); void optionsChanged(KDDockWidgets::Controllers::DockWidget::Options); void isFocusedChanged(bool); void isOverlayedChanged(bool); diff --git a/src/qtquick/views/DockWidget_qtquick.cpp b/src/qtquick/views/DockWidget_qtquick.cpp index 7cf942c6..9eac58f7 100644 --- a/src/qtquick/views/DockWidget_qtquick.cpp +++ b/src/qtquick/views/DockWidget_qtquick.cpp @@ -17,6 +17,7 @@ #include "controllers/DockWidget_p.h" #include "controllers/Frame.h" #include "qtquick/Platform_qtquick.h" +#include "qtquick/views/TitleBar_qtquick.h" #include "qtquick/ViewFactory_qtquick.h" #include @@ -70,6 +71,10 @@ void DockWidget_qtquick::init() { // To mimic what QtWidgets does when creating a new QWidget. setVisible(false); + + auto dw = this->dockWidget(); + connect(dw, &Controllers::DockWidget::actualTitleBarChanged, + this, &DockWidget_qtquick::actualTitleBarChanged); } void DockWidget_qtquick::setWidget(const QString &qmlFilename) @@ -125,16 +130,20 @@ QSize DockWidget_qtquick::maximumSize() const return View_qtquick::maximumSize(); } -QObject *DockWidget_qtquick::actualTitleBar() const +Controllers::TitleBar *DockWidget_qtquick::actualTitleBar() const { if (Controllers::Frame *frame = this->frame()) return frame->actualTitleBar(); return nullptr; } -QObject *DockWidget_qtquick::actualTitleBarObj() const +QObject *DockWidget_qtquick::actualTitleBarView() const { - return actualTitleBar(); + if (auto tb = actualTitleBar()) { + return static_cast(tb->view()); + } + + return nullptr; } QQuickItem *DockWidget_qtquick::frameVisualItem() const diff --git a/src/qtquick/views/DockWidget_qtquick.h b/src/qtquick/views/DockWidget_qtquick.h index 0e60e18f..8051a5d9 100644 --- a/src/qtquick/views/DockWidget_qtquick.h +++ b/src/qtquick/views/DockWidget_qtquick.h @@ -43,7 +43,7 @@ namespace Views { class DOCKS_EXPORT DockWidget_qtquick : public Views::View_qtquick { Q_OBJECT - // Q_PROPERTY(QObject *actualTitleBar READ actualTitleBarObj NOTIFY actualTitleBarChanged) + Q_PROPERTY(QObject *actualTitleBar READ actualTitleBarView NOTIFY actualTitleBarChanged) public: /** * @brief constructs a new DockWidget @@ -79,12 +79,12 @@ public: QSize maximumSize() const override; /// @brief Returns the title bar - QObject *actualTitleBar() const; + Controllers::TitleBar *actualTitleBar() const; /// @brief Returns the title bar /// Qt6 requires us to include TitleBar_p.h, so instead the Q_PROPERTY uses /// QObject so we don't include private headers in public headers - QObject *actualTitleBarObj() const; + QObject *actualTitleBarView() const; /// @brief Returns the visual item which represents Frame in the screen /// Equivalent to Frame::visualItem(). @@ -102,6 +102,7 @@ Q_SIGNALS: /// @brief The geometry of the frame container this dock widget is in changed /// For example, when dragging a dockwidget void frameGeometryChanged(QRect); + void actualTitleBarChanged(); protected: bool event(QEvent *e) override;