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 <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2022-09-18 15:25:41 +02:00
parent 17033d0d83
commit 621a0a4e3a
4 changed files with 17 additions and 2 deletions

View file

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

View file

@ -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.

View file

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

View file

@ -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<ApplicationState> state_stack;
Ui::MainWindow ui;
FilterWidget filterWidget;
std::unique_ptr<QSplitter> topSplitter;