From 81dbfaea70c406da6b3aad790860ae8b68cbdac6 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 17 Oct 2024 16:27:10 +0200 Subject: [PATCH] App: keep width of side bar widget Relates to GitHub #297 --- src/app/app_ui_state.cpp | 10 ++++++++-- src/app/app_ui_state.h | 1 + src/app/mainwindow.cpp | 14 +++++++++---- src/app/widget_main_control.cpp | 35 +++++++++++++++++++++++++++++---- src/app/widget_main_control.h | 6 ++++++ 5 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/app/app_ui_state.cpp b/src/app/app_ui_state.cpp index 09c389ad..e6cae1b6 100644 --- a/src/app/app_ui_state.cpp +++ b/src/app/app_ui_state.cpp @@ -13,10 +13,11 @@ QByteArray AppUiState::toBlob(const AppUiState& state) QByteArray blob; QDataStream stream(&blob, QIODevice::WriteOnly); stream << QtCoreUtils::QByteArray_frowRawData(std::string_view{PropertyAppUiState::TypeName}); - constexpr uint32_t version = 1; + constexpr uint32_t version = 2; stream << version; stream << state.mainWindowGeometry; stream << state.pageDocuments_isLeftSideBarVisible; + stream << state.pageDocuments_widgetLeftSideBarWidthFactor; return blob; } @@ -36,11 +37,16 @@ AppUiState AppUiState::fromBlob(const QByteArray& blob, bool* ok) if (identifier == PropertyAppUiState::TypeName) { uint32_t version = 0; stream >> version; - if (version == 1) { + if (version >= 1) { stream >> state.mainWindowGeometry; stream >> state.pageDocuments_isLeftSideBarVisible; fnSetOk(true); } + + if (version >= 2) { + stream >> state.pageDocuments_widgetLeftSideBarWidthFactor; + fnSetOk(true); + } } return state; diff --git a/src/app/app_ui_state.h b/src/app/app_ui_state.h index 05aa040b..67b6f3eb 100644 --- a/src/app/app_ui_state.h +++ b/src/app/app_ui_state.h @@ -15,6 +15,7 @@ namespace Mayo { struct AppUiState { QByteArray mainWindowGeometry; // Provided by QWidget::saveGeometry() bool pageDocuments_isLeftSideBarVisible = true; + double pageDocuments_widgetLeftSideBarWidthFactor = 0.25; // Serialization functions static QByteArray toBlob(const AppUiState& state); diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index 3b2164ff..fdf7f5db 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -77,8 +77,11 @@ void MainWindow::showEvent(QShowEvent* event) if (!uiState.mainWindowGeometry.isEmpty()) this->restoreGeometry(uiState.mainWindowGeometry); - if (this->widgetPageDocuments()) - this->widgetPageDocuments()->widgetLeftSideBar()->setVisible(uiState.pageDocuments_isLeftSideBarVisible); + WidgetMainControl* pageDocs = this->widgetPageDocuments(); + if (pageDocs) { + pageDocs->widgetLeftSideBar()->setVisible(uiState.pageDocuments_isLeftSideBarVisible); + pageDocs->setWidgetLeftSideBarWidthFactor(uiState.pageDocuments_widgetLeftSideBarWidthFactor); + } QMainWindow::showEvent(event); #if defined(Q_OS_WIN) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0) @@ -95,8 +98,11 @@ void MainWindow::closeEvent(QCloseEvent* event) { AppUiState uiState = AppModule::get()->properties()->appUiState; uiState.mainWindowGeometry = this->saveGeometry(); - if (this->widgetPageDocuments()) - uiState.pageDocuments_isLeftSideBarVisible = this->widgetPageDocuments()->widgetLeftSideBar()->isVisible(); + WidgetMainControl* pageDocs = this->widgetPageDocuments(); + if (pageDocs) { + uiState.pageDocuments_isLeftSideBarVisible = pageDocs->widgetLeftSideBar()->isVisible(); + uiState.pageDocuments_widgetLeftSideBarWidthFactor = pageDocs->widgetLeftSideBarWidthFactor(); + } AppModule::get()->properties()->appUiState.setValue(uiState); QMainWindow::closeEvent(event); diff --git a/src/app/widget_main_control.cpp b/src/app/widget_main_control.cpp index fb3f5f54..2b88799b 100644 --- a/src/app/widget_main_control.cpp +++ b/src/app/widget_main_control.cpp @@ -33,6 +33,8 @@ #include #include #include + +#include #include namespace Mayo { @@ -50,8 +52,6 @@ WidgetMainControl::WidgetMainControl(GuiApplication* guiApp, QWidget* parent) m_ui->widget_ModelTree->registerGuiApplication(guiApp); m_ui->splitter_Main->setChildrenCollapsible(false); - m_ui->splitter_Main->setStretchFactor(0, 1); - m_ui->splitter_Main->setStretchFactor(1, 3); m_ui->splitter_ModelTree->setStretchFactor(0, 1); m_ui->splitter_ModelTree->setStretchFactor(1, 2); @@ -82,6 +82,10 @@ WidgetMainControl::WidgetMainControl(GuiApplication* guiApp, QWidget* parent) m_ui->listView_OpenedDocuments, &QListView::clicked, this, [=](const QModelIndex& index) { this->setCurrentDocumentIndex(index.row()); } ); + QObject::connect( + m_ui->splitter_Main, &QSplitter::splitterMoved, + this, &WidgetMainControl::onSplitterMainMoved + ); guiApp->application()->signalDocumentFilePathChanged.connectSlot([=](const DocumentPtr& doc, const FilePath& fp) { if (this->currentWidgetGuiDocument()->documentIdentifier() == doc->identifier()) @@ -118,6 +122,7 @@ WidgetMainControl::WidgetMainControl(GuiApplication* guiApp, QWidget* parent) m_ui->stack_GuiDocuments->installEventFilter(this); this->onLeftContentsPageChanged(m_ui->stack_LeftContents->currentIndex()); m_ui->widget_MouseCoords->hide(); + this->setWidgetLeftSideBarWidthFactor(0.25); this->onCurrentDocumentIndexChanged(-1); } @@ -155,8 +160,8 @@ void WidgetMainControl::initialize(const CommandContainer* cmdContainer) if (btnId == 1) { assert(this->widgetGuiDocument(index.row()) != nullptr); FileCommandTools::closeDocument( - cmdContainer->appContext(), - this->widgetGuiDocument(index.row())->documentIdentifier() + cmdContainer->appContext(), + this->widgetGuiDocument(index.row())->documentIdentifier() ); } }); @@ -174,6 +179,19 @@ QWidget* WidgetMainControl::widgetLeftSideBar() const return m_ui->widget_Left; } +double WidgetMainControl::widgetLeftSideBarWidthFactor() const +{ + return m_widgetLeftSideBarWidthFactor; +} + +void WidgetMainControl::setWidgetLeftSideBarWidthFactor(double factor) +{ + const int mainWidth = this->geometry().width(); + const double leftFactor = std::max(0., std::min(1., factor)); // Clamp in [0, 1] + m_ui->splitter_Main->setSizes({int(leftFactor * mainWidth), int((1. - leftFactor) * mainWidth)}); + m_widgetLeftSideBarWidthFactor = leftFactor; +} + bool WidgetMainControl::eventFilter(QObject* watched, QEvent* event) { auto fnSizeBtn = [](const QWidget* container, const QWidget* widgetHeightRef) { @@ -497,4 +515,13 @@ void WidgetMainControl::onDocumentFileChanged(const DocumentPtr& doc) m_pendingDocsToReload.insert(doc); } +void WidgetMainControl::onSplitterMainMoved(int pos, int /*index*/) +{ + const int mainWidth = this->geometry().width(); + if (mainWidth != 0) + m_widgetLeftSideBarWidthFactor = pos / double(mainWidth); + else + m_widgetLeftSideBarWidthFactor = 0.25; +} + } // namespace Mayo diff --git a/src/app/widget_main_control.h b/src/app/widget_main_control.h index 65298466..75f4585b 100644 --- a/src/app/widget_main_control.h +++ b/src/app/widget_main_control.h @@ -42,6 +42,10 @@ class WidgetMainControl : public IWidgetMainPage { // Widget at the left side of the app providing access to the model tree, file system, ... QWidget* widgetLeftSideBar() const; + // Factor value must be in [0, 1] + double widgetLeftSideBarWidthFactor() const; + void setWidgetLeftSideBarWidthFactor(double factor); + int widgetGuiDocumentCount() const; WidgetGuiDocument* widgetGuiDocument(int idx) const; WidgetGuiDocument* currentWidgetGuiDocument() const; @@ -65,6 +69,7 @@ class WidgetMainControl : public IWidgetMainPage { void onGuiDocumentAdded(GuiDocument* guiDoc); void onCurrentDocumentIndexChanged(int idx); void onDocumentFileChanged(const DocumentPtr& doc); + void onSplitterMainMoved(int pos, int index); QWidget* findLeftHeaderPlaceHolder() const; QWidget* recreateLeftHeaderPlaceHolder(); @@ -79,6 +84,7 @@ class WidgetMainControl : public IWidgetMainPage { std::unique_ptr m_ptrCurrentNodeGraphicsProperties; DocumentFilesWatcher* m_docFilesWatcher = nullptr; std::unordered_set m_pendingDocsToReload; + double m_widgetLeftSideBarWidthFactor = 0.25; }; } // namespace Mayo