diff --git a/src/FrameworkWidgetFactory.cpp b/src/FrameworkWidgetFactory.cpp index 8a563640..9af5f226 100644 --- a/src/FrameworkWidgetFactory.cpp +++ b/src/FrameworkWidgetFactory.cpp @@ -24,6 +24,7 @@ #include "private/indicators/SegmentedIndicators_p.h" #include "views_qtwidgets/FloatingWindow_qtwidgets.h" +#include "views_qtwidgets/DockWidget_qtwidgets.h" #include "views_qtwidgets/Frame_qtwidgets.h" #include "views_qtwidgets/MainWindow_qtwidgets.h" #include "views_qtwidgets/View_qtwidgets.h" @@ -57,6 +58,12 @@ FrameworkWidgetFactory::~FrameworkWidgetFactory() } #ifdef KDDOCKWIDGETS_QTWIDGETS + +View *DefaultWidgetFactory::createDockWidget(Controllers::DockWidget *dw, Qt::WindowFlags flags) const +{ + return new Views::DockWidget_qtwidgets(dw, flags); +} + View *DefaultWidgetFactory::createFrame(Controllers::Frame *controller, View *parent = nullptr, FrameOptions) const { diff --git a/src/FrameworkWidgetFactory.h b/src/FrameworkWidgetFactory.h index 6a76e623..e30ebb71 100644 --- a/src/FrameworkWidgetFactory.h +++ b/src/FrameworkWidgetFactory.h @@ -78,6 +78,8 @@ public: /// by the framework. virtual ~FrameworkWidgetFactory(); + virtual View *createDockWidget(Controllers::DockWidget *, Qt::WindowFlags) const = 0; + ///@brief Called internally by the framework to create a Frame class /// Override to provide your own Frame sub-class. A frame is the /// widget that holds the titlebar and tab-widget which holds the @@ -164,6 +166,7 @@ class DOCKS_EXPORT DefaultWidgetFactory : public FrameworkWidgetFactory Q_OBJECT public: DefaultWidgetFactory() = default; + View *createDockWidget(Controllers::DockWidget *, Qt::WindowFlags) const override; View *createFrame(Controllers::Frame *, View *parent, FrameOptions options = FrameOption_None) const override; View *createTitleBar(Controllers::TitleBar *, Controllers::Frame *) const override; View *createTitleBar(Controllers::TitleBar *, Controllers::FloatingWindow *) const override; diff --git a/src/View.cpp b/src/View.cpp index 7122846d..67e1257c 100644 --- a/src/View.cpp +++ b/src/View.cpp @@ -17,6 +17,7 @@ #include "controllers/Stack.h" #include "controllers/TitleBar.h" #include "controllers/TabBar.h" +#include "controllers/MainWindow.h" #include // TODOv2 remove @@ -229,6 +230,14 @@ Controllers::DockWidget *View::asDockWidgetController() const return nullptr; } +Controllers::MainWindow *View::asMainWindowController() const +{ + if (m_controller && m_controller->is(Type::MainWindow)) + return qobject_cast(m_controller); + + return nullptr; +} + bool View::equals(const View *other) const { return other && handle() == other->handle(); diff --git a/src/View.h b/src/View.h index df5c3cd6..fb7bb4d2 100644 --- a/src/View.h +++ b/src/View.h @@ -42,6 +42,7 @@ class Frame; class Stack; class TabBar; class TitleBar; +class MainWindow; } using HANDLE = const void *; @@ -243,6 +244,7 @@ public: Controllers::TabBar *asTabBarController() const; Controllers::Stack *asStackController() const; Controllers::DockWidget *asDockWidgetController() const; + Controllers::MainWindow *asMainWindowController() const; protected: virtual void free_impl(); diff --git a/src/controllers/DockWidget.cpp b/src/controllers/DockWidget.cpp index 0a21b1c1..d7e222c2 100644 --- a/src/controllers/DockWidget.cpp +++ b/src/controllers/DockWidget.cpp @@ -26,9 +26,6 @@ #include "Config.h" #include "FrameworkWidgetFactory.h" -#include "views_qtwidgets/DockWidget_qtwidgets.h" -#include "views_qtwidgets/MainWindow_qtwidgets.h" - #include #include #include @@ -46,7 +43,7 @@ using namespace KDDockWidgets::Controllers; DockWidget::DockWidget(const QString &name, Options options, LayoutSaverOptions layoutSaverOptions) - : Controller(Type::DockWidget, new Views::DockWidget_qtwidgets(this, Qt::Tool)) + : Controller(Type::DockWidget, Config::self().frameworkWidgetFactory()->createDockWidget(this, Qt::Tool)) , d(new Private(name, options, layoutSaverOptions, this)) { d->init(); @@ -123,9 +120,8 @@ void DockWidget::addDockWidgetToContainingWindow(DockWidget *other, DockWidget *relativeTo, InitialOption initialOption) { - if (auto v = qobject_cast(view()->asQWidget()->window())) { + if (auto mainWindow = view()->window()->asMainWindowController()) { // It's inside a main window. Simply use the main window API. - auto mainWindow = v->mainWindow(); mainWindow->addDockWidget(other, location, relativeTo, initialOption); return; } diff --git a/src/views/DockWidget.h b/src/views/DockWidget.h new file mode 100644 index 00000000..c381782c --- /dev/null +++ b/src/views/DockWidget.h @@ -0,0 +1,30 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2020-2022 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. +*/ + +#pragma once + +namespace KDDockWidgets { + +namespace Controllers { +class DockWidget; +} + +namespace Views { + +/// @brief The interface that DockWidget views should implement +class DockWidget +{ +public: +}; + +} + +}