diff --git a/src/FocusScope.cpp b/src/FocusScope.cpp index 401fc0e9..48b2159f 100644 --- a/src/FocusScope.cpp +++ b/src/FocusScope.cpp @@ -34,9 +34,9 @@ using namespace KDDockWidgets; class FocusScope::Private : public QObject // clazy:exclude=missing-qobject-macro (breaks unity build with earlier cmake due to including .moc here.) { public: - Private(FocusScope *qq, Views::View_qtwidgets *thisWidget) + Private(FocusScope *qq, View *thisView) : q(qq) - , m_thisWidget(thisWidget) + , m_thisView(thisView) { connect(qApp, &QGuiApplication::focusObjectChanged, this, &Private::onFocusObjectChanged); @@ -68,7 +68,7 @@ public: bool isInFocusScope(WidgetType *) const; FocusScope *const q; - Views::View_qtwidgets *const m_thisWidget; + View *const m_thisView = nullptr; bool m_isFocused = false; bool m_inCtor = true; QPointer m_lastFocusedInScope; @@ -78,8 +78,8 @@ FocusScope::Private::~Private() { } -FocusScope::FocusScope(Views::View_qtwidgets *thisWidget) - : d(new Private(this, thisWidget)) +FocusScope::FocusScope(View *thisView) + : d(new Private(this, thisView)) { } @@ -106,7 +106,7 @@ void FocusScope::focus(Qt::FocusReason reason) // very useful. d->m_lastFocusedInScope->setFocus(reason); } else { - if (auto frame = qobject_cast(d->m_thisWidget)) { + if (auto frame = d->m_thisView->asFrameController()) { if (auto dw = frame->currentDockWidget()) { if (auto guest = dw->widget()) { if (guest->focusPolicy() != Qt::NoFocus) @@ -115,7 +115,7 @@ void FocusScope::focus(Qt::FocusReason reason) } } else { // Not a use case right now - d->m_thisWidget->setFocus(reason); + d->m_thisView->setFocus(reason); } } } @@ -132,7 +132,7 @@ void FocusScope::Private::setIsFocused(bool is) void FocusScope::Private::onFocusObjectChanged(QObject *obj) { - auto widget = qobject_cast(obj); + auto widget = qobject_cast(obj); if (!widget) { setIsFocused(false); return; @@ -152,7 +152,7 @@ bool FocusScope::Private::isInFocusScope(WidgetType *widget) const { WidgetType *p = widget; while (p) { - if (p == m_thisWidget) + if (p == m_thisView->handle()) return true; p = p->parentWidget(); diff --git a/src/FocusScope.h b/src/FocusScope.h index 519f622e..0471d95c 100644 --- a/src/FocusScope.h +++ b/src/FocusScope.h @@ -30,7 +30,7 @@ class DOCKS_EXPORT FocusScope Q_DISABLE_COPY(FocusScope) public: ///@brief constructor - explicit FocusScope(Views::View_qtwidgets *thisWidget); + explicit FocusScope(View *thisView); virtual ~FocusScope(); ///@brief Returns true if this FocusScope is focused. diff --git a/src/View.h b/src/View.h index fb7bb4d2..767d275a 100644 --- a/src/View.h +++ b/src/View.h @@ -158,6 +158,7 @@ public: virtual void grabMouse() = 0; virtual void releaseMouse() = 0; virtual QScreen *screen() const = 0; + virtual void setFocus(Qt::FocusReason) = 0; // TODOv2: Check if these two should be in the controller or on view virtual void onLayoutRequest() diff --git a/src/controllers/DockWidget.cpp b/src/controllers/DockWidget.cpp index d7e222c2..8d529fac 100644 --- a/src/controllers/DockWidget.cpp +++ b/src/controllers/DockWidget.cpp @@ -26,6 +26,8 @@ #include "Config.h" #include "FrameworkWidgetFactory.h" +#include "views_qtwidgets/MainWindow_qtwidgets.h" + #include #include #include diff --git a/src/controllers/DockWidget_p.h b/src/controllers/DockWidget_p.h index a6e08063..03ac62b8 100644 --- a/src/controllers/DockWidget_p.h +++ b/src/controllers/DockWidget_p.h @@ -18,8 +18,6 @@ #include "controllers/FloatingWindow.h" #include "controllers/SideBar.h" -#include "views_qtwidgets/MainWindow_qtwidgets.h" - #include #include #include @@ -65,15 +63,15 @@ public: return nullptr; // Note: Don't simply use window(), as the MainWindow might be embedded into something else - QWidgetOrQuick *p = q->view()->asQWidget()->parentWidget(); + auto p = q->view()->parentView(); while (p) { - if (auto view = qobject_cast(p)) - return view->mainWindow(); + if (auto mw = p->asMainWindowController()) + return mw; if (p->isWindow()) return nullptr; - p = p->parentWidget(); + p = p->parentView(); } return nullptr; diff --git a/src/controllers/FloatingWindow.cpp b/src/controllers/FloatingWindow.cpp index 5c9140e5..2662e204 100644 --- a/src/controllers/FloatingWindow.cpp +++ b/src/controllers/FloatingWindow.cpp @@ -530,8 +530,8 @@ LayoutSaver::FloatingWindow FloatingWindow::serialize() const fw.affinities = affinities(); fw.windowState = windowStateOverride(); - auto mainWindow = qobject_cast(view()->asQWidget()->parentWidget()); - fw.parentIndex = mainWindow ? DockRegistry::self()->mainwindows().indexOf(mainWindow->mainWindow()) + auto mainWindow = view()->parentView()->asMainWindowController(); + fw.parentIndex = mainWindow ? DockRegistry::self()->mainwindows().indexOf(mainWindow) : -1; return fw; @@ -602,8 +602,7 @@ bool FloatingWindow::isWindow() const MainWindow *FloatingWindow::mainWindow() const { - auto view = qobject_cast(parent()); - return view ? view->mainWindow() : nullptr; + return view()->parentView()->asMainWindowController(); } QMargins FloatingWindow::contentMargins() const diff --git a/src/controllers/Frame.cpp b/src/controllers/Frame.cpp index 408467ca..98bd50ff 100644 --- a/src/controllers/Frame.cpp +++ b/src/controllers/Frame.cpp @@ -34,7 +34,6 @@ #include #include -#include #define MARGIN_THRESHOLD 100 @@ -67,7 +66,7 @@ static StackOptions tabWidgetOptions(FrameOptions options) Frame::Frame(View *parent, FrameOptions options, int userType) : Controller(Type::Frame, Config::self().frameworkWidgetFactory()->createFrame(this, parent)) - , FocusScope(static_cast *>(view()->asQWidget())) // TODO + , FocusScope(view()) , m_tabWidget(new Controllers::Stack(this, tabWidgetOptions(options))) , m_titleBar(new Controllers::TitleBar(this)) , m_options(actualOptions(options)) @@ -80,7 +79,7 @@ Frame::Frame(View *parent, FrameOptions options, int userType) connect(m_tabWidget, &Controllers::Stack::currentTabChanged, this, &Frame::onCurrentTabChanged); - setLayoutWidget(qobject_cast(parent ? parent->asQWidget() : nullptr)); // TODO + setLayoutWidget(qobject_cast(parent ? parent->asQObject() : nullptr)); // TODO view()->init(); diff --git a/src/controllers/TitleBar.h b/src/controllers/TitleBar.h index 54aeeb53..5c9fcf48 100644 --- a/src/controllers/TitleBar.h +++ b/src/controllers/TitleBar.h @@ -19,14 +19,6 @@ #include #include -namespace KDDockWidgets { - -namespace Views { -class FloatingWindow_qtwidgets; -} - -} - namespace KDDockWidgets::Controllers { class Frame; @@ -133,7 +125,6 @@ protected: private: friend class ::TestDocks; - friend class Views::FloatingWindow_qtwidgets; void updateFloatButton(); void updateCloseButton(); diff --git a/src/views_qtwidgets/ViewWrapper_qtwidgets.cpp b/src/views_qtwidgets/ViewWrapper_qtwidgets.cpp index 5968441c..4acfecbe 100644 --- a/src/views_qtwidgets/ViewWrapper_qtwidgets.cpp +++ b/src/views_qtwidgets/ViewWrapper_qtwidgets.cpp @@ -238,3 +238,8 @@ QScreen *ViewWrapper_qtwidgets::screen() const { return m_widget->screen(); } + +void ViewWrapper_qtwidgets::setFocus(Qt::FocusReason reason) +{ + m_widget->setFocus(reason); +} diff --git a/src/views_qtwidgets/ViewWrapper_qtwidgets.h b/src/views_qtwidgets/ViewWrapper_qtwidgets.h index 30e0c4b7..dcb5bbf3 100644 --- a/src/views_qtwidgets/ViewWrapper_qtwidgets.h +++ b/src/views_qtwidgets/ViewWrapper_qtwidgets.h @@ -48,6 +48,7 @@ public: void grabMouse() override; void releaseMouse() override; QScreen *screen() const override; + void setFocus(Qt::FocusReason) override; private: QWidget *const m_widget; diff --git a/src/views_qtwidgets/View_qtwidgets.h b/src/views_qtwidgets/View_qtwidgets.h index a40ed61e..d2d57a02 100644 --- a/src/views_qtwidgets/View_qtwidgets.h +++ b/src/views_qtwidgets/View_qtwidgets.h @@ -352,6 +352,11 @@ public: return QWidget::screen(); } + void setFocus(Qt::FocusReason reason) override + { + return QWidget::setFocus(reason); + } + protected: bool event(QEvent *e) override {