diff --git a/src/View.h b/src/View.h index bbb794c9..cbc7d727 100644 --- a/src/View.h +++ b/src/View.h @@ -174,6 +174,7 @@ public: virtual void releaseKeyboard() = 0; QScreen *screen() const; virtual void setFocus(Qt::FocusReason) = 0; + virtual void setFocusPolicy(Qt::FocusPolicy) = 0; virtual void setWindowOpacity(double) = 0; virtual void setCursor(Qt::CursorShape) = 0; virtual void setMouseTracking(bool) = 0; diff --git a/src/qtquick/views/ViewWrapper_qtquick.cpp b/src/qtquick/views/ViewWrapper_qtquick.cpp index 485e3080..27755c38 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.cpp +++ b/src/qtquick/views/ViewWrapper_qtquick.cpp @@ -217,6 +217,11 @@ void ViewWrapper_qtquick::setFocus(Qt::FocusReason reason) m_item->forceActiveFocus(reason); } +void ViewWrapper_qtquick::setFocusPolicy(Qt::FocusPolicy) +{ + qFatal("not implemented"); +} + bool ViewWrapper_qtquick::hasFocus() const { return m_item->hasActiveFocus(); diff --git a/src/qtquick/views/ViewWrapper_qtquick.h b/src/qtquick/views/ViewWrapper_qtquick.h index 9c903229..1b3b65a1 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.h +++ b/src/qtquick/views/ViewWrapper_qtquick.h @@ -52,6 +52,7 @@ public: void grabMouse() override; void releaseMouse() override; void setFocus(Qt::FocusReason) override; + void setFocusPolicy(Qt::FocusPolicy) override; QString objectName() const override; QVariant property(const char *) const override; bool isNull() const override; diff --git a/src/qtquick/views/View_qtquick.h b/src/qtquick/views/View_qtquick.h index 59494d21..59a9ef4e 100644 --- a/src/qtquick/views/View_qtquick.h +++ b/src/qtquick/views/View_qtquick.h @@ -148,9 +148,7 @@ public: void setFocus(Qt::FocusReason reason) override; Qt::FocusPolicy focusPolicy() const override; bool hasFocus() const override; - - /// TODOv2: Make these 2 virtual ? - void setFocusPolicy(Qt::FocusPolicy policy); + void setFocusPolicy(Qt::FocusPolicy) override; QString objectName() const override; void setMinimumSize(QSize sz) override; void render(QPainter *) override; diff --git a/src/qtwidgets/TestHelpers_qtwidgets.cpp b/src/qtwidgets/TestHelpers_qtwidgets.cpp index a9521cf4..a9bc6308 100644 --- a/src/qtwidgets/TestHelpers_qtwidgets.cpp +++ b/src/qtwidgets/TestHelpers_qtwidgets.cpp @@ -25,6 +25,7 @@ using namespace KDDockWidgets; namespace KDDockWidgets { class TestView_qtwidgets : public Views::View_qtwidgets { + Q_OBJECT public: explicit TestView_qtwidgets(Platform::CreateViewOptions opts, QWidget *parent) : Views::View_qtwidgets(nullptr, Type::None, parent) @@ -80,4 +81,6 @@ View *Platform_qtwidgets::tests_createView(CreateViewOptions opts, View *parent) return newWidget; } -#endif \ No newline at end of file +#endif + +#include "TestHelpers_qtwidgets.moc" diff --git a/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp b/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp index d3f19550..9cfaa792 100644 --- a/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp +++ b/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp @@ -358,6 +358,11 @@ Qt::FocusPolicy ViewWrapper_qtwidgets::focusPolicy() const return m_widget->focusPolicy(); } +void ViewWrapper_qtwidgets::setFocusPolicy(Qt::FocusPolicy policy) +{ + m_widget->setFocusPolicy(policy); +} + bool ViewWrapper_qtwidgets::hasFocus() const { return m_widget->hasFocus(); diff --git a/src/qtwidgets/views/ViewWrapper_qtwidgets.h b/src/qtwidgets/views/ViewWrapper_qtwidgets.h index ce5beb29..b7fa280e 100644 --- a/src/qtwidgets/views/ViewWrapper_qtwidgets.h +++ b/src/qtwidgets/views/ViewWrapper_qtwidgets.h @@ -63,6 +63,7 @@ public: void setCursor(Qt::CursorShape) override; QSize minSize() const override; Qt::FocusPolicy focusPolicy() const override; + void setFocusPolicy(Qt::FocusPolicy) override; bool hasFocus() const override; QWidget *widget() const; diff --git a/src/qtwidgets/views/View_qtwidgets.h b/src/qtwidgets/views/View_qtwidgets.h index 956d2b98..b3457a3b 100644 --- a/src/qtwidgets/views/View_qtwidgets.h +++ b/src/qtwidgets/views/View_qtwidgets.h @@ -418,7 +418,12 @@ public: void setFocus(Qt::FocusReason reason) override { - return QWidget::setFocus(reason); + QWidget::setFocus(reason); + } + + void setFocusPolicy(Qt::FocusPolicy policy) override + { + QWidget::setFocusPolicy(policy); } QString objectName() const override diff --git a/tests/tst_view.cpp b/tests/tst_view.cpp index 6a85cbe9..00b75141 100644 --- a/tests/tst_view.cpp +++ b/tests/tst_view.cpp @@ -185,7 +185,7 @@ TEST_CASE("View::closeRequested") CHECK(signalArrived); } -TEST_CASE("View::focusPolicy") +TEST_CASE("View::focusPolicy, Platform::focusedView") { auto rootView = Platform::instance()->tests_createView({}); CHECK_EQ(rootView->focusPolicy(), Qt::NoFocus); @@ -195,10 +195,23 @@ TEST_CASE("View::hasFocus") { auto rootView = Platform::instance()->tests_createView({}); rootView->show(); + rootView->activateWindow(); + CHECK(rootView->isVisible()); + Platform::instance()->tests_wait(0); CHECK(!rootView->hasFocus()); - // TODOv2: Uncomment once setFocusPolicy is implemented and implement in ViewWrapper too - // rootView->setFocus(Qt::MouseFocusReason); - // CHECK(rootView->hasFocus()); + rootView->setFocus(Qt::MouseFocusReason); + Platform::instance()->tests_wait(200); // QWidget::setFocus() requires 1 event loop iteration + CHECK(rootView->hasFocus()); + CHECK(rootView->equals(Platform::instance()->focusedView())); + + auto child1 = Platform::instance()->tests_createView({}, rootView); + CHECK(rootView->hasFocus()); + CHECK(rootView->equals(Platform::instance()->focusedView())); + child1->setVisible(true); + child1->setFocus(Qt::MouseFocusReason); + Platform::instance()->tests_wait(200); // QWidget::setFocus() requires 1 event loop iteration + CHECK(child1->hasFocus()); + CHECK(child1->equals(Platform::instance()->focusedView())); }