From 621a0a4e3a2fc844054ee4022ce7117a78773ddd Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sun, 18 Sep 2022 15:25:41 +0200 Subject: [PATCH] desktop: remember previous state when switching to dive site mode The dive-site editing can be reached from two states: from the dive view and the dive list view. It always jumped back to the dive view. Therefore, remember the state. Use a stack-like structure, so that the feature can be used for the dive-site view as well. This is a bit inconsistent, because for example the statistics view does not remember the previous state and allows a direct jump to a different state. That should be fixed at some point. Signed-off-by: Berthold Stoeger --- desktop-widgets/divesitelistview.cpp | 2 +- desktop-widgets/locationinformation.cpp | 2 +- desktop-widgets/mainwindow.cpp | 13 +++++++++++++ desktop-widgets/mainwindow.h | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/desktop-widgets/divesitelistview.cpp b/desktop-widgets/divesitelistview.cpp index 302fd3471..120ce0024 100644 --- a/desktop-widgets/divesitelistview.cpp +++ b/desktop-widgets/divesitelistview.cpp @@ -48,7 +48,7 @@ DiveSiteListView::DiveSiteListView(QWidget *parent) : QWidget(parent) void DiveSiteListView::done() { - MainWindow::instance()->setApplicationState(MainWindow::ApplicationState::Default); + MainWindow::instance()->enterPreviousState(); } void DiveSiteListView::diveSiteClicked(const QModelIndex &index) diff --git a/desktop-widgets/locationinformation.cpp b/desktop-widgets/locationinformation.cpp index 4b061c4d1..67669f1b1 100644 --- a/desktop-widgets/locationinformation.cpp +++ b/desktop-widgets/locationinformation.cpp @@ -220,7 +220,7 @@ void LocationInformationWidget::acceptChanges() MainWindow::instance()->diveList->setEnabled(true); MainWindow::instance()->setEnabledToolbar(true); - MainWindow::instance()->setApplicationState(MainWindow::ApplicationState::Default); + MainWindow::instance()->enterPreviousState(); DiveFilter::instance()->stopFilterDiveSites(); // Subtlety alert: diveSite must be cleared *after* exiting the dive-site mode. diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index c7b171991..c00dced6d 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -282,6 +282,7 @@ void MainWindow::editDiveSite(dive_site *ds) if (!ds) return; diveSiteEdit->initFields(ds); + state_stack.push_back(appState); setApplicationState(ApplicationState::EditDiveSite); } @@ -765,6 +766,7 @@ void MainWindow::on_actionViewDiveSites_triggered() { if (!userMayChangeAppState()) return; + state_stack.push_back(appState); setApplicationState(ApplicationState::DiveSites); } @@ -1472,6 +1474,17 @@ bool MainWindow::userMayChangeAppState() const return applicationState[(int)appState].allowUserChange; } +// For the dive-site list view and the dive-site edit states, +// we remember the previous state and then switch back to that. +void MainWindow::enterPreviousState() +{ + if (state_stack.empty()) + setApplicationState(ApplicationState::Default); + ApplicationState prev = state_stack.back(); + state_stack.pop_back(); + setApplicationState(prev); +} + void MainWindow::setApplicationState(ApplicationState state) { if (appState == state) diff --git a/desktop-widgets/mainwindow.h b/desktop-widgets/mainwindow.h index 31e12694f..8b9a62820 100644 --- a/desktop-widgets/mainwindow.h +++ b/desktop-widgets/mainwindow.h @@ -72,6 +72,7 @@ public: void importFiles(const QStringList importFiles); void setToolButtonsEnabled(bool enabled); void setApplicationState(ApplicationState state); + void enterPreviousState(); NotificationWidget *getNotificationWidget(); void enableDisableCloudActions(); void enableDisableOtherDCsActions(); @@ -162,6 +163,7 @@ slots: private: ApplicationState appState; + std::vector state_stack; Ui::MainWindow ui; FilterWidget filterWidget; std::unique_ptr topSplitter;