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);