diff --git a/src/MainWindowBase.cpp b/src/MainWindowBase.cpp index 52c1e6df..86ff7c0d 100644 --- a/src/MainWindowBase.cpp +++ b/src/MainWindowBase.cpp @@ -493,9 +493,7 @@ void MainWindowBase::overlayOnSideBar(DockWidgetBase *dw) frame->addWidget(dw); d->updateOverlayGeometry(dw->d->lastPositions().lastOverlayedGeometry(sb->location()).size()); - auto resizeHandler = new WidgetResizeHandler(true, frame); - resizeHandler->setAllowedResizeSides(d->allowedResizeSides(sb->location())); - + frame->setAllowedResizeSides(d->allowedResizeSides(sb->location())); frame->QWidgetAdapter::show(); Q_EMIT dw->isOverlayedChanged(true); diff --git a/src/private/Frame.cpp b/src/private/Frame.cpp index f0513c33..022d98d5 100644 --- a/src/private/Frame.cpp +++ b/src/private/Frame.cpp @@ -29,6 +29,7 @@ #include "TabWidget_p.h" #include "TitleBar_p.h" #include "Utils_p.h" +#include "WidgetResizeHandler_p.h" #include #include @@ -75,6 +76,9 @@ Frame::~Frame() if (m_layoutItem) m_layoutItem->unref(); + delete m_resizeHandler; + m_resizeHandler = nullptr; + DockRegistry::self()->unregisterFrame(this); // Run some disconnects() too, so we don't receive signals during destruction: @@ -747,3 +751,15 @@ bool Frame::anyDockWidgetsHas(DockWidgetBase::LayoutSaverOption option) const return dw->layoutSaverOptions() & option; }); } + +void Frame::setAllowedResizeSides(CursorPositions sides) +{ + if (sides) { + delete m_resizeHandler; + m_resizeHandler = new WidgetResizeHandler(true, this); + m_resizeHandler->setAllowedResizeSides(sides); + } else { + delete m_resizeHandler; + m_resizeHandler = nullptr; + } +} diff --git a/src/private/Frame_p.h b/src/private/Frame_p.h index 2f79f14d..f6dd350f 100644 --- a/src/private/Frame_p.h +++ b/src/private/Frame_p.h @@ -39,6 +39,7 @@ class TabWidget; class DockWidgetBase; class FloatingWindow; class MainWindowBase; +class WidgetResizeHandler; /** * @brief A DockWidget wrapper that adds a QTabWidget and a TitleBar @@ -250,6 +251,10 @@ public: ///@brief Returns whether at least one dock widget has the specified layout saver option set bool anyDockWidgetsHas(DockWidgetBase::LayoutSaverOption) const; + /// @brief Usually we do resize via the native window manager, but if a widget is docked like + /// in MDI mode, or in overlayed mode then we allow the user to resize with mouse + void setAllowedResizeSides(CursorPositions sides); + Q_SIGNALS: void currentDockWidgetChanged(KDDockWidgets::DockWidgetBase *); void numDockWidgetsChanged(); @@ -319,6 +324,7 @@ private: void setLayoutWidget(LayoutWidget *); LayoutWidget *m_layoutWidget = nullptr; + WidgetResizeHandler *m_resizeHandler = nullptr; FrameOptions m_options = FrameOption_None; QPointer m_layoutItem; bool m_updatingTitleBar = false;