From 4ef2ddbfec882a612be31787da1bb4e8d07fd69b Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Tue, 2 Mar 2021 21:59:57 +0000 Subject: [PATCH] Add DockRegistry::frameInMDIResize() Only emitted in a MDI layout. Emitted when one dockwidget is being resized --- src/private/DockRegistry.cpp | 22 +++++++++++++++++++++- src/private/DockRegistry_p.h | 8 ++++++++ src/private/Frame.cpp | 5 +++++ src/private/Frame_p.h | 3 +++ src/private/WidgetResizeHandler.cpp | 9 +++++++++ src/private/WidgetResizeHandler_p.h | 2 ++ 6 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/private/DockRegistry.cpp b/src/private/DockRegistry.cpp index f39b359f..d0da25bf 100644 --- a/src/private/DockRegistry.cpp +++ b/src/private/DockRegistry.cpp @@ -16,12 +16,13 @@ #include "FloatingWindow_p.h" #include "LayoutWidget_p.h" #include "Logging_p.h" +#include "MainWindowMDI.h" #include "Position_p.h" #include "QWidgetAdapter.h" #include "SideBar_p.h" #include "Utils_p.h" +#include "WidgetResizeHandler_p.h" #include "WindowBeingDragged_p.h" -#include "MainWindowMDI.h" #include #include @@ -225,6 +226,25 @@ SideBar *DockRegistry::sideBarForDockWidget(const DockWidgetBase *dw) const return nullptr; } +Frame *DockRegistry::frameInMDIResize() const +{ + for (auto mw : m_mainWindows) { + if (!mw->isMDI()) + continue; + + LayoutWidget *layout = mw->layoutWidget(); + const QList frames = layout->frames(); + for (Frame *frame : frames) { + if (WidgetResizeHandler *wrh = frame->resizeHandler()) { + if (wrh->isResizing()) + return frame; + } + } + } + + return nullptr; +} + MainWindowBase::List DockRegistry::mainWindowsWithAffinity(const QStringList &affinities) const { MainWindowBase::List result; diff --git a/src/private/DockRegistry_p.h b/src/private/DockRegistry_p.h index edd4c623..f247593d 100644 --- a/src/private/DockRegistry_p.h +++ b/src/private/DockRegistry_p.h @@ -37,6 +37,8 @@ struct WindowBeingDragged; class DOCKS_EXPORT DockRegistry : public QObject { Q_OBJECT + Q_PROPERTY( + KDDockWidgets::Frame *frameInMDIResize READ frameInMDIResize NOTIFY frameInMDIResizeChanged) public: static DockRegistry *self(); ~DockRegistry(); @@ -210,10 +212,16 @@ public: ///@brief Overload that returns the SideBar itself SideBar *sideBarForDockWidget(const DockWidgetBase *) const; + ///@brief Returns the Frame which is being resized in a MDI layout. nullptr if none + Frame *frameInMDIResize() const; + Q_SIGNALS: /// @brief emitted when a main window or a floating window change screen void windowChangedScreen(QWindow *); + /// @brief emitted when the MDI frame that's being resized changed + void frameInMDIResizeChanged(); + protected: bool eventFilter(QObject *watched, QEvent *event) override; private: diff --git a/src/private/Frame.cpp b/src/private/Frame.cpp index d2aaf530..6f1a3e45 100644 --- a/src/private/Frame.cpp +++ b/src/private/Frame.cpp @@ -792,3 +792,8 @@ int Frame::userType() const { return m_userType; } + +WidgetResizeHandler *Frame::resizeHandler() const +{ + return m_resizeHandler; +} diff --git a/src/private/Frame_p.h b/src/private/Frame_p.h index 345e2e4d..07536208 100644 --- a/src/private/Frame_p.h +++ b/src/private/Frame_p.h @@ -266,6 +266,9 @@ public: /// @brief See DockWidgetBase::userType() int userType() const; + /// @brief Returns the resize handler. Used mostly in MDI mode. + WidgetResizeHandler *resizeHandler() const; + Q_SIGNALS: void currentDockWidgetChanged(KDDockWidgets::DockWidgetBase *); void numDockWidgetsChanged(); diff --git a/src/private/WidgetResizeHandler.cpp b/src/private/WidgetResizeHandler.cpp index 68cef1c8..46020a5c 100644 --- a/src/private/WidgetResizeHandler.cpp +++ b/src/private/WidgetResizeHandler.cpp @@ -66,6 +66,11 @@ bool WidgetResizeHandler::isMDI() const return frame && frame->isMDI(); } +bool WidgetResizeHandler::isResizing() const +{ + return m_resizingInProgress; +} + int WidgetResizeHandler::widgetResizeHandlerMargin() { return 4; // pixels @@ -127,6 +132,8 @@ bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) return false; m_resizingInProgress = true; + if (isMDI()) + Q_EMIT DockRegistry::self()->frameInMDIResizeChanged(); mNewPosition = Qt5Qt6Compat::eventGlobalPos(mouseEvent); mCursorPos = cursorPos; @@ -134,6 +141,8 @@ bool WidgetResizeHandler::eventFilter(QObject *o, QEvent *e) } case QEvent::MouseButtonRelease: { m_resizingInProgress = false; + if (isMDI()) + Q_EMIT DockRegistry::self()->frameInMDIResizeChanged(); updateCursor(CursorPosition_Undefined); auto mouseEvent = static_cast(e); diff --git a/src/private/WidgetResizeHandler_p.h b/src/private/WidgetResizeHandler_p.h index 2f77ac30..cf28096f 100644 --- a/src/private/WidgetResizeHandler_p.h +++ b/src/private/WidgetResizeHandler_p.h @@ -119,6 +119,8 @@ public: bool isMDI() const; + bool isResizing() const; + static int widgetResizeHandlerMargin(); static void setupWindow(QWindow *window);