diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cad276bc..90381638 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -299,7 +299,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR IS_CLANG_BUILD) endif() if(${PROJECT_NAME}_QTQUICK) - target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::Widgets Qt${Qt_VERSION_MAJOR}::Quick Qt${Qt_VERSION_MAJOR}::QuickControls2) + target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::Widgets Qt${Qt_VERSION_MAJOR}::Quick Qt${Qt_VERSION_MAJOR}::QuickControls2 PRIVATE Qt${Qt_VERSION_MAJOR}::GuiPrivate) else() target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::Widgets PRIVATE Qt${Qt_VERSION_MAJOR}::WidgetsPrivate) endif() diff --git a/src/private/quick/QWidgetAdapter_quick.cpp b/src/private/quick/QWidgetAdapter_quick.cpp index e745cae0..3153d245 100644 --- a/src/private/quick/QWidgetAdapter_quick.cpp +++ b/src/private/quick/QWidgetAdapter_quick.cpp @@ -34,6 +34,8 @@ #include #include +#include + using namespace KDDockWidgets; namespace KDDockWidgets { @@ -181,54 +183,13 @@ void QWidgetAdapter::onMouseRelease() void QWidgetAdapter::onCloseEvent(QCloseEvent *) { } -void QWidgetAdapter::onResizeEvent(QResizeEvent *event) +void QWidgetAdapter::onResizeEvent(QResizeEvent *) { - QWindow* window = windowHandle(); - if (!window) { - return; - } - - if (isNormalWindowState(m_oldWindowState)) { - QRect geo = normalGeometry(); - - auto curState = window->windowState(); - if (isNormalWindowState(curState)) { - geo.setSize(event->size()); - } else { - geo.setSize(event->oldSize()); - } - - setNormalGeometry(geo); - } + updateNormalGeometry(); } -void QWidgetAdapter::onMoveEvent(QMoveEvent *event) +void QWidgetAdapter::onMoveEvent(QMoveEvent *) { - QWindow* window = windowHandle(); - if (!window) { - return; - } - - if (isNormalWindowState(m_oldWindowState)) { - QRect geo = normalGeometry(); - - auto windowCurrentState = window->windowState(); - if (isNormalWindowState(windowCurrentState)) { - geo.moveTopLeft(event->pos()); - } else { - geo.moveTopLeft(event->oldPos()); - } - - setNormalGeometry(geo); - } -} -void QWidgetAdapter::onWindowStateChangeEvent(QWindowStateChangeEvent *) -{ - QWindow* window = windowHandle(); - if (!window) { - return; - } - - m_oldWindowState = window->windowState(); + updateNormalGeometry(); } void QWidgetAdapter::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data) @@ -259,6 +220,27 @@ void QWidgetAdapter::itemChange(QQuickItem::ItemChange change, const QQuickItem: } } +void QWidgetAdapter::updateNormalGeometry() +{ + QWindow *window = windowHandle(); + if (!window) { + return; + } + + QRect normalGeometry; + if (const QPlatformWindow *pw = window->handle()) { + normalGeometry = pw->normalGeometry(); + } + + if (!normalGeometry.isValid() && isNormalWindowState(window->windowState())) { + normalGeometry = window->geometry(); + } + + if (normalGeometry.isValid()) { + setNormalGeometry(normalGeometry); + } +} + void QWidgetAdapter::QQUICKITEMgeometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { // Send a few events manually, since QQuickItem doesn't do it for us. @@ -795,8 +777,6 @@ bool QWidgetAdapter::eventFilter(QObject *watched, QEvent *ev) onResizeEvent(static_cast(ev)); } else if (ev->type() == QEvent::Move) { onMoveEvent(static_cast(ev)); - } else if (ev->type() == QEvent::WindowStateChange) { - onWindowStateChangeEvent(static_cast(ev)); } } diff --git a/src/private/quick/QWidgetAdapter_quick_p.h b/src/private/quick/QWidgetAdapter_quick_p.h index a175f9ff..af85298e 100644 --- a/src/private/quick/QWidgetAdapter_quick_p.h +++ b/src/private/quick/QWidgetAdapter_quick_p.h @@ -253,10 +253,11 @@ protected: virtual void onCloseEvent(QCloseEvent *); virtual void onResizeEvent(QResizeEvent *); virtual void onMoveEvent(QMoveEvent *); - virtual void onWindowStateChangeEvent(QWindowStateChangeEvent *); void itemChange(QQuickItem::ItemChange, const QQuickItem::ItemChangeData &) override; private: + void updateNormalGeometry(); + QSize m_sizeHint; QSizePolicy m_sizePolicy = QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); ; @@ -269,7 +270,6 @@ private: bool m_inSetParent = false; MouseEventRedirector *m_mouseEventRedirector = nullptr; QRect m_normalGeometry; - Qt::WindowStates m_oldWindowState = Qt::WindowState::WindowNoState; }; inline qreal logicalDpiFactor(const QQuickItem *item)