diff --git a/src/blackgui/dockwidget.cpp b/src/blackgui/dockwidget.cpp index 563d30e2d..379154cbd 100644 --- a/src/blackgui/dockwidget.cpp +++ b/src/blackgui/dockwidget.cpp @@ -53,6 +53,7 @@ namespace BlackGui // init settings this->onStyleSheetsChanged(); this->initTitleBarWidgets(); + m_originalAreas = this->allowedAreas(); // context menu m_input = new CMarginsInput(this); @@ -257,24 +258,29 @@ namespace BlackGui void CDockWidget::toggleFloating() { - const bool floating = !this->isFloating(); - if (!floating) { this->setFrameless(false); } // remove frameless if not floating + const bool changeToFloating = !this->isFloating(); + if (!changeToFloating) { this->setFrameless(false); } // remove frameless if not floating + + // disable the interactive docking + if (changeToFloating) + { + m_originalAreas = this->allowedAreas(); + this->setAllowedAreas(Qt::NoDockWidgetArea); + } + else + { + this->setAllowedAreas(m_originalAreas); + } + + this->setAlwaysOnTop(m_alwaysOnTop && changeToFloating); + this->setFloating(changeToFloating); const Qt::KeyboardModifiers km = QGuiApplication::queryKeyboardModifiers(); const bool shift = km.testFlag(Qt::ShiftModifier); - this->setFloating(floating); - this->setAlwaysOnTop(m_alwaysOnTop && floating); - - // disable the interactive docking - if (floating) - { - this->setAllowedAreas(Qt::NoDockWidgetArea); - } - // with shift ALWAYS reset - if (shift && floating) { this->resetPosition(); } - if (floating) + if (shift && changeToFloating) { this->resetPosition(); } + if (changeToFloating) { // check where we are, otherwise reset if NOT appropriate const QPoint p = this->rect().topLeft(); @@ -392,7 +398,7 @@ namespace BlackGui }); **/ - event->setAccepted(false); // refuse -> do not close + event->setAccepted(false); // refuse -> do not close (otherwise crash) } else { diff --git a/src/blackgui/dockwidget.h b/src/blackgui/dockwidget.h index f134b19a5..d68f814f8 100644 --- a/src/blackgui/dockwidget.h +++ b/src/blackgui/dockwidget.h @@ -149,7 +149,7 @@ namespace BlackGui signals: //! Top level has changed for given widget - void widgetTopLevelChanged(BlackGui::CDockWidget *, bool topLevel); + void widgetTopLevelChanged(CDockWidget *, bool topLevel); //! Font size signals @{ void fontSizePlus(); @@ -242,6 +242,7 @@ namespace BlackGui QSize m_lastFloatingSize; //!< last floating position QPoint m_offsetWhenFloating; //!< initial offset to main window when floating first time QPoint m_lastFloatingPosition; //!< last floating position + Qt::DockWidgetAreas m_originalAreas; //!< areas before floating BlackMisc::CSetting m_settings { this, &CDockWidget::settingsChanged }; diff --git a/src/blackgui/dockwidgetinfobar.cpp b/src/blackgui/dockwidgetinfobar.cpp index 8f7cd52cc..c4ef0f4c3 100644 --- a/src/blackgui/dockwidgetinfobar.cpp +++ b/src/blackgui/dockwidgetinfobar.cpp @@ -19,7 +19,7 @@ using namespace BlackGui::Components; namespace BlackGui { - CDockWidgetInfoBar::CDockWidgetInfoBar(QWidget *parent) : CDockWidget(parent) + CDockWidgetInfoBar::CDockWidgetInfoBar(QWidget *parent) : CDockWidget(false, parent) { this->setWindowTitle("Info status bar"); this->setWindowIcon(CIcons::swift24()); diff --git a/src/blackgui/dockwidgetinfobar.h b/src/blackgui/dockwidgetinfobar.h index 369442e22..7c4840de1 100644 --- a/src/blackgui/dockwidgetinfobar.h +++ b/src/blackgui/dockwidgetinfobar.h @@ -34,6 +34,10 @@ namespace BlackGui //! Force an reload void reloadStyleSheet() { this->onStyleSheetsChanged(); } + //! \copydoc CDockWidget::initialFloating + //! \remark special case to allow init + virtual void initialFloating() override { CDockWidget::initialFloating(); } + protected: //! Contribute to menu virtual void addToContextMenu(QMenu *contextMenu) const override; diff --git a/src/swiftguistandard/swiftguistdinit.cpp b/src/swiftguistandard/swiftguistdinit.cpp index ed61fec99..ae57be881 100644 --- a/src/swiftguistandard/swiftguistdinit.cpp +++ b/src/swiftguistandard/swiftguistdinit.cpp @@ -69,6 +69,8 @@ void SwiftGuiStd::init() if (m_init) { return; } + ui->dw_InfoBarStatus->initialFloating(); + this->setVisible(false); // hide all, so no flashing windows during init m_mwaStatusBar = &m_statusBar; m_mwaOverlayFrame = ui->fr_CentralFrameInside;