diff --git a/src/DockWidgetBase.cpp b/src/DockWidgetBase.cpp index 9823b61a..39e30595 100644 --- a/src/DockWidgetBase.cpp +++ b/src/DockWidgetBase.cpp @@ -1040,3 +1040,17 @@ void DockWidgetBase::Private::saveLastFloatingGeometry() lastPosition()->setLastFloatingGeometry(q->window()->geometry()); } } + +void DockWidgetBase::setFloatingWindowFlags(FloatingWindowFlags flags) +{ + if (auto fw = floatingWindow()) { + qWarning() << Q_FUNC_INFO << "Call this function only before having a floating window"; + } else { + d->m_flags = flags; + } +} + +KDDockWidgets::FloatingWindowFlags DockWidgetBase::floatingWindowFlags() const +{ + return d->m_flags; +} diff --git a/src/DockWidgetBase.h b/src/DockWidgetBase.h index d64930c8..aaa95333 100644 --- a/src/DockWidgetBase.h +++ b/src/DockWidgetBase.h @@ -460,6 +460,15 @@ public: /// This only applies when using MainWindowOption_HasCentralWidget bool isPersistentCentralDockWidget() const; + /// @brief Sets the desired floating window flags, in case the defaults aren't desired. + /// By default KDDW will use the flags specified in KDDockWidgets::Config to influence + /// many aspects regarding windows (minimize,maximize support for example). + /// You can use this function to override those "global flags" and specify per-dock widget + /// flags. Be sure to not call this before the floating window has already been created. + /// It's suggested to call it before the dock widget is shown. + void setFloatingWindowFlags(FloatingWindowFlags); + KDDockWidgets::FloatingWindowFlags floatingWindowFlags() const; + Q_SIGNALS: #ifdef KDDOCKWIDGETS_QTWIDGETS ///@brief signal emitted when the parent changed diff --git a/src/private/DockWidgetBase_p.h b/src/private/DockWidgetBase_p.h index 9901b536..0ad72deb 100644 --- a/src/private/DockWidgetBase_p.h +++ b/src/private/DockWidgetBase_p.h @@ -155,6 +155,7 @@ public: QWidgetOrQuick *widget = nullptr; DockWidgetBase *const q; DockWidgetBase::Options options; + FloatingWindowFlags m_flags = FloatingWindowFlag::FromGlobalConfig; const LayoutSaverOptions layoutSaverOptions; QAction *const toggleAction; QAction *const floatAction; diff --git a/src/private/FloatingWindow.cpp b/src/private/FloatingWindow.cpp index 5ed1da98..7be145ad 100644 --- a/src/private/FloatingWindow.cpp +++ b/src/private/FloatingWindow.cpp @@ -10,6 +10,7 @@ */ #include "FloatingWindow_p.h" +#include "KDDockWidgets.h" #include "MainWindowBase.h" #include "Logging_p.h" #include "Frame_p.h" @@ -184,8 +185,20 @@ FloatingWindow::FloatingWindow(QRect suggestedGeometry, MainWindowBase *parent, m_layoutDestroyedConnection = connect(m_dropArea, &QObject::destroyed, this, &FloatingWindow::scheduleDeleteLater); } +static FloatingWindowFlags floatingWindowFlagsForFrame(Frame *frame) +{ + if (!frame) + return FloatingWindowFlag::FromGlobalConfig; + + const auto dockwidgets = frame->dockWidgets(); + if (!dockwidgets.isEmpty()) + return dockwidgets.first()->floatingWindowFlags(); + + return FloatingWindowFlag::FromGlobalConfig; +} + FloatingWindow::FloatingWindow(Frame *frame, QRect suggestedGeometry, MainWindowBase *parent) - : FloatingWindow(suggestedGeometry, hackFindParentHarder(frame, parent)) + : FloatingWindow(suggestedGeometry, hackFindParentHarder(frame, parent), floatingWindowFlagsForFrame(frame)) { QScopedValueRollback guard(m_disableSetVisible, true);