From cd0f2f4e3327967c6d7f7e13cd5d7b3d2f9c1647 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Tue, 18 May 2021 18:00:04 +0100 Subject: [PATCH] Introduced Config::setDropIndicatorsInhibited(bool) Allows you to disable support for drop indicators while dragging --- Changelog | 2 ++ examples/dockwidgets/MyMainWindow.cpp | 11 +++++++++++ src/Config.cpp | 15 +++++++++++++++ src/Config.h | 9 +++++++++ src/private/DockRegistry_p.h | 3 +++ src/private/DropArea.cpp | 2 +- src/private/DropIndicatorOverlayInterface.cpp | 9 +++++++++ 7 files changed, 50 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index ea03d6b0..8176aa58 100644 --- a/Changelog +++ b/Changelog @@ -12,6 +12,8 @@ dock widget docked. Tabbed cases are more difficult since QStackedLayout doesn't propagate size constraints. - Added MainWindowBase::frameCountChanged() + - Introduced Config::setDropIndicatorsInhibited(), which allows you to disable support + for drop indicators while dragging. * v1.3.1 (unreleased) - Improve restoring layout when RestoreOption_RelativeToMainWindow is used (#171) diff --git a/examples/dockwidgets/MyMainWindow.cpp b/examples/dockwidgets/MyMainWindow.cpp index acf8fdb4..4a43486e 100644 --- a/examples/dockwidgets/MyMainWindow.cpp +++ b/examples/dockwidgets/MyMainWindow.cpp @@ -12,6 +12,7 @@ #include "MyMainWindow.h" #include "MyWidget.h" +#include #include #include @@ -69,8 +70,11 @@ MyMainWindow::MyMainWindow(const QString &uniqueName, KDDockWidgets::MainWindowO auto menubar = menuBar(); auto fileMenu = new QMenu(QStringLiteral("File")); m_toggleMenu = new QMenu(QStringLiteral("Toggle")); + auto miscMenu = new QMenu(QStringLiteral("Misc")); + menubar->addMenu(fileMenu); menubar->addMenu(m_toggleMenu); + menubar->addMenu(miscMenu); QAction *newAction = fileMenu->addAction(QStringLiteral("New DockWidget")); @@ -114,6 +118,13 @@ MyMainWindow::MyMainWindow(const QString &uniqueName, KDDockWidgets::MainWindowO auto quitAction = fileMenu->addAction(QStringLiteral("Quit")); connect(quitAction, &QAction::triggered, qApp, &QApplication::quit); + QAction *toggleDropIndicatorSupport = miscMenu->addAction(QStringLiteral("Toggle Drop Indicator Support")); + toggleDropIndicatorSupport->setCheckable(true); + toggleDropIndicatorSupport->setChecked(true); + connect(toggleDropIndicatorSupport, &QAction::toggled, this, [](bool checked) { + KDDockWidgets::Config::self().setDropIndicatorsInhibited(!checked); + }); + setAffinities({ affinityName }); createDockWidgets(); } diff --git a/src/Config.cpp b/src/Config.cpp index 90ddb37d..555e870b 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -61,6 +61,7 @@ public: CustomizableWidgets m_disabledPaintEvents = CustomizableWidget_None; qreal m_draggedWindowOpacity = Q_QNAN; int m_mdiPopupThreshold = 250; + bool m_dropIndicatorsInhibited = false; #ifdef KDDOCKWIDGETS_QTQUICK QtQuickHelpers m_qquickHelpers; #endif @@ -325,4 +326,18 @@ int Config::mdiPopupThreshold() const { return d->m_mdiPopupThreshold; } + +void Config::setDropIndicatorsInhibited(bool inhibit) const +{ + if (d->m_dropIndicatorsInhibited != inhibit) { + d->m_dropIndicatorsInhibited = inhibit; + Q_EMIT DockRegistry::self()->dropIndicatorsInhibitedChanged(inhibit); + } +} + +bool Config::dropIndicatorsInhibited() const +{ + return d->m_dropIndicatorsInhibited; +} + } diff --git a/src/Config.h b/src/Config.h index c079f5ac..feddcb99 100644 --- a/src/Config.h +++ b/src/Config.h @@ -182,6 +182,15 @@ public: ///By default it's 1.0, fully opaque qreal draggedWindowOpacity() const; + /// @brief Allows to disable support for drop indicators while dragging + /// By default drop indicators will be shown when dragging dock widgets. + /// This functionality can be toggled whenever you need it (it's not a startup-only setting). + void setDropIndicatorsInhibited(bool inhibit) const; + + /// @brief Returns whether drop indicators are inhibited. + /// by default this is false unless you call setDropIndicatorsInhibited(true) + bool dropIndicatorsInhibited() const; + /** * @brief Allows the user to intercept a docking attempt to center (tabbed) and disallow it. * diff --git a/src/private/DockRegistry_p.h b/src/private/DockRegistry_p.h index eb826eda..880c36dd 100644 --- a/src/private/DockRegistry_p.h +++ b/src/private/DockRegistry_p.h @@ -235,6 +235,9 @@ Q_SIGNALS: /// @brief emitted when the MDI frame that's being resized changed void frameInMDIResizeChanged(); + /// @brief emitted whenever Config::dropIndicatorsInhibited changes + void dropIndicatorsInhibitedChanged(bool inhibited); + protected: bool eventFilter(QObject *watched, QEvent *event) override; private: diff --git a/src/private/DropArea.cpp b/src/private/DropArea.cpp index 3a00d551..c400822c 100644 --- a/src/private/DropArea.cpp +++ b/src/private/DropArea.cpp @@ -180,7 +180,7 @@ void DropArea::layoutParentContainerEqually(DockWidgetBase *dw) DropIndicatorOverlayInterface::DropLocation DropArea::hover(WindowBeingDragged *draggedWindow, QPoint globalPos) { - if (!validateAffinity(draggedWindow)) + if (Config::self().dropIndicatorsInhibited() || !validateAffinity(draggedWindow)) return DropIndicatorOverlayInterface::DropLocation_None; if (!m_dropIndicatorOverlay) { diff --git a/src/private/DropIndicatorOverlayInterface.cpp b/src/private/DropIndicatorOverlayInterface.cpp index b6c5f331..61212873 100644 --- a/src/private/DropIndicatorOverlayInterface.cpp +++ b/src/private/DropIndicatorOverlayInterface.cpp @@ -13,6 +13,7 @@ #include "Frame_p.h" #include "DropArea_p.h" +#include "DockRegistry_p.h" using namespace KDDockWidgets; @@ -22,6 +23,14 @@ DropIndicatorOverlayInterface::DropIndicatorOverlayInterface(DropArea *dropArea) { setVisible(false); setObjectName(QStringLiteral("DropIndicatorOverlayInterface")); + + connect(DockRegistry::self(), &DockRegistry::dropIndicatorsInhibitedChanged, this, + [this](bool inhibited) { + if (inhibited) + removeHover(); + + // if false then simply moving the mouse will make the drop indicators appear again + }); } void DropIndicatorOverlayInterface::setWindowBeingDragged(bool is)