From 60b4b08da6dc1760837babb90991310ca9a3fcf4 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 5 Apr 2019 16:15:42 +0200 Subject: [PATCH] Ref T592, remember size/position where last floating This seems to work more reliable as the Qt mechanism, but still suffers incorrect positions from time to time. The floating window opens on to of the main widget, which is uncritical but still strange why it happens --- src/blackgui/dockwidget.cpp | 49 +++++++++++++++++++++++++++---------- src/blackgui/dockwidget.h | 14 ++++++++++- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/blackgui/dockwidget.cpp b/src/blackgui/dockwidget.cpp index 737bfc21a..f5cd4e201 100644 --- a/src/blackgui/dockwidget.cpp +++ b/src/blackgui/dockwidget.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include #include @@ -167,13 +169,13 @@ namespace BlackGui QDockWidget::setWindowTitle(title); } - void CDockWidget::displayStatusMessage(const BlackMisc::CStatusMessage &statusMessage) + void CDockWidget::displayStatusMessage(const CStatusMessage &statusMessage) { if (!m_allowStatusBar || !this->isFloating()) { return; } m_statusBar.displayStatusMessage(statusMessage); } - void CDockWidget::displayStatusMessages(const BlackMisc::CStatusMessageList &statusMessages) + void CDockWidget::displayStatusMessages(const CStatusMessageList &statusMessages) { if (!m_allowStatusBar || !this->isFloating()) { return; } m_statusBar.displayStatusMessages(statusMessages); @@ -263,14 +265,7 @@ namespace BlackGui void CDockWidget::toggleVisibility() { - if (this->isVisible()) - { - this->hide(); - } - else - { - this->show(); - } + this->setVisible(!this->isVisible()); } void CDockWidget::toggleFrameless() @@ -323,7 +318,8 @@ namespace BlackGui const QByteArray geo(s.getGeometry()); if (!geo.isEmpty()) { - return this->restoreGeometry(geo); + const bool ok = this->restoreGeometry(geo); + if (ok) { this->rememberFloatingSizeAndPosition(); } } this->setMargins(); return true; @@ -346,11 +342,12 @@ namespace BlackGui { CStyleSheetUtility::useStyleSheetInDerivedWidget(this, QStyle::PE_FrameDockWidget); QDockWidget::paintEvent(event); + this->rememberFloatingSizeAndPosition(); } void CDockWidget::mouseMoveEvent(QMouseEvent *event) { - if (!handleMouseMoveEvent(event)) { QDockWidget::mouseMoveEvent(event); } ; + if (!handleMouseMoveEvent(event)) { QDockWidget::mouseMoveEvent(event); } } void CDockWidget::keyPressEvent(QKeyEvent *event) @@ -430,7 +427,7 @@ namespace BlackGui QThread::msleep(100); # endif - this->setMargins(); + this->setMargins(); // from settings or default if (topLevel) { if (m_windowTitleBackup != QDockWidget::windowTitle()) @@ -441,10 +438,12 @@ namespace BlackGui if (!m_wasAlreadyFloating) { this->initialFloating(); + this->rememberFloatingSizeAndPosition(); } else { if (m_wasFrameless) { this->setFrameless(true); } + this->restoreFloatingSizeAndPositionDeferred(); // after everything was applied move and resize } m_statusBar.show(); m_wasAlreadyFloating = true; @@ -584,6 +583,30 @@ namespace BlackGui this->setStyleSheet(qss); } + void CDockWidget::rememberFloatingSizeAndPosition() + { + if (!this->isFloating()) { return; } + m_lastFloatingSize = this->size(); + m_lastFloatingPosition = this->pos(); + } + + void CDockWidget::restoreFloatingSizeAndPosition() + { + if (!m_lastFloatingSize.isValid() || m_lastFloatingPosition.isNull()) { return; } + this->resize(m_lastFloatingSize); + this->move(m_lastFloatingPosition); + } + + void CDockWidget::restoreFloatingSizeAndPositionDeferred() + { + if (!m_lastFloatingSize.isValid() || m_lastFloatingPosition.isNull()) { return; } + QPointer myself(this); + QTimer::singleShot(1000, this, [ = ] + { + if (myself) { myself->restoreFloatingSizeAndPosition(); } + }); + } + CDockWidgetSettings CDockWidget::getSettings() const { if (this->objectName().isEmpty()) { return CDockWidgetSettings(); } diff --git a/src/blackgui/dockwidget.h b/src/blackgui/dockwidget.h index 5e716d0a7..bd5c993eb 100644 --- a/src/blackgui/dockwidget.h +++ b/src/blackgui/dockwidget.h @@ -236,7 +236,10 @@ namespace BlackGui QString m_windowTitleBackup; //!< original title, even if the widget title is deleted for layout purposes QSize m_preferredSizeWhenFloating; //!< preferred size when floating 1st time QSize m_initialDockedMinimumSize; //!< minimum size before first floating + QSize m_lastFloatingSize; //!< last floating position QPoint m_offsetWhenFloating; //!< initial offset to main window when floating first time + QPoint m_lastFloatingPosition; //!< last floating position + BlackMisc::CSetting m_settings { this, &CDockWidget::settingsChanged }; //! Top level has been chaged @@ -266,8 +269,17 @@ namespace BlackGui //! Force a style sheet update void forceStyleSheetUpdate(); + //! Size and position in floating mode + void rememberFloatingSizeAndPosition(); + + //! Size and position of floating window + void restoreFloatingSizeAndPosition(); + + //! Size and position of floating window + void restoreFloatingSizeAndPositionDeferred(); + //! This widget`s settings - BlackGui::Settings::CDockWidgetSettings getSettings() const; + Settings::CDockWidgetSettings getSettings() const; //! Save settings void saveSettings(const BlackGui::Settings::CDockWidgetSettings &settings);