From 08495a785480d79d67709a84c5137d4c180ba06d Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 11 Dec 2018 09:00:15 +0100 Subject: [PATCH] Ref T447, utility function to set on top flag Also a signal when "always on top" was triggered --- src/blackgui/dockwidget.cpp | 19 ++++++++++++++----- src/blackgui/dockwidget.h | 7 +++++-- src/blackgui/guiapplication.cpp | 1 + src/blackgui/guiapplication.h | 3 +++ src/blackgui/guiutility.cpp | 18 ++++++++++++++++++ src/blackgui/guiutility.h | 5 ++++- 6 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/blackgui/dockwidget.cpp b/src/blackgui/dockwidget.cpp index 14ce70466..ff14a8665 100644 --- a/src/blackgui/dockwidget.cpp +++ b/src/blackgui/dockwidget.cpp @@ -272,12 +272,21 @@ namespace BlackGui this->setFrameless(!frameless); } - void CDockWidget::toggleAlwaysOnTop() + void CDockWidget::windowAlwaysOnTop() { - m_alwaysOnTop = !m_alwaysOnTop; if (this->isFloating()) { - this->setAlwaysOnTopFlag(m_alwaysOnTop); + this->setAlwaysOnTopFlag(true); + m_alwaysOnTop = true; + } + } + + void CDockWidget::windowNotAlwaysOnTop() + { + if (this->isFloating()) + { + this->setAlwaysOnTopFlag(false); + m_alwaysOnTop = false; } } @@ -353,11 +362,11 @@ namespace BlackGui if (this->isFloating()) { const bool frameless = this->isFrameless(); - const bool onTop = this->windowFlags() | Qt::WindowStaysOnTopHint; contextMenu->addAction(CIcons::dockTop16(), "Dock", this, &CDockWidget::toggleFloating); contextMenu->addAction(CIcons::tableSheet16(), frameless ? "Normal window" : "Frameless", this, &CDockWidget::toggleFrameless); - contextMenu->addAction(CIcons::dockTop16(), onTop ? "Not on top" : "Always on top", this, &CDockWidget::toggleAlwaysOnTop); + contextMenu->addAction(CIcons::dockTop16(), "Always on top", this, &CDockWidget::windowAlwaysOnTop); + contextMenu->addAction(CIcons::dockTop16(), "Not on top", this, &CDockWidget::windowNotAlwaysOnTop); contextMenu->addAction(CIcons::refresh16(), "Redraw", this, QOverload<>::of(&CDockWidget::update)); } else diff --git a/src/blackgui/dockwidget.h b/src/blackgui/dockwidget.h index 8796e6af4..1a0ed98cb 100644 --- a/src/blackgui/dockwidget.h +++ b/src/blackgui/dockwidget.h @@ -108,8 +108,11 @@ namespace BlackGui //! Toggle frameless mode (EXPERIMENTAL) void toggleFrameless(); - //! Toggle always on top - void toggleAlwaysOnTop(); + //! Window always on top + void windowAlwaysOnTop(); + + //! Window not on top + void windowNotAlwaysOnTop(); //! Set always on top void setAlwaysOnTop(bool onTop) { m_alwaysOnTop = onTop; } diff --git a/src/blackgui/guiapplication.cpp b/src/blackgui/guiapplication.cpp index 5f358db3e..576c5b660 100644 --- a/src/blackgui/guiapplication.cpp +++ b/src/blackgui/guiapplication.cpp @@ -996,6 +996,7 @@ namespace BlackGui if (!w) { return false; } const bool onTop = CGuiUtility::toggleStayOnTop(w); CLogMessage(w).info(onTop ? QStringLiteral("Window on top") : QStringLiteral("Window not always on top")); + emit this->alwaysOnTop(onTop); return onTop; } diff --git a/src/blackgui/guiapplication.h b/src/blackgui/guiapplication.h index e43f2a596..afcc395e6 100644 --- a/src/blackgui/guiapplication.h +++ b/src/blackgui/guiapplication.h @@ -271,6 +271,9 @@ namespace BlackGui //! Font has been changed void fontChanged(); + //! always on top + void alwaysOnTop(bool onTop); + protected: //! \name print messages generated during parsing / cmd handling //! @{ diff --git a/src/blackgui/guiutility.cpp b/src/blackgui/guiutility.cpp index 5a24c03c9..dac516933 100644 --- a/src/blackgui/guiutility.cpp +++ b/src/blackgui/guiutility.cpp @@ -394,6 +394,24 @@ namespace BlackGui return Qt::WindowStaysOnTopHint & flags; } + bool CGuiUtility::stayOnTop(bool onTop, QWidget *widget) + { + if (!widget) { return false; } + Qt::WindowFlags flags = widget->windowFlags(); + if (onTop) + { + flags &= ~Qt::WindowStaysOnBottomHint; + flags |= Qt::WindowStaysOnTopHint; + } + else + { + flags &= ~Qt::WindowStaysOnTopHint; + // flags |= Qt::WindowStaysOnBottomHint; + } + widget->setWindowFlags(flags); + return onTop; + } + QString CGuiUtility::marginsToString(const QMargins &margins) { const QString s("%1:%2:%3:%4"); diff --git a/src/blackgui/guiutility.h b/src/blackgui/guiutility.h index 9d5ec92ef..f6cf84da7 100644 --- a/src/blackgui/guiutility.h +++ b/src/blackgui/guiutility.h @@ -157,9 +157,12 @@ namespace BlackGui } } - //! Toogle window flags / stay on top + //! Toggle window flags / stay on top static bool toggleStayOnTop(QWidget *widget); + //! Window flags / stay on top + static bool stayOnTop(bool onTop, QWidget *widget); + //! Window on top? static bool staysOnTop(QWidget *widget);