diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2020-12-17 23:13:06 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2021-02-06 10:00:39 -0800 |
commit | 8a36a100ce073decb5cb236efbd7c4ce93f5abc2 (patch) | |
tree | 7bc50091a02221f64caa6bcd4ff8953acf4b33d0 /desktop-widgets | |
parent | 1ed2f1681ad32eb73cf68964788e81bc03786577 (diff) | |
download | subsurface-8a36a100ce073decb5cb236efbd7c4ce93f5abc2.tar.gz |
desktop: don't allow view change in planner
When in planner mode, don't allow the user to change the application
state. This brought us nothing but troubles and inconsistencies.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'desktop-widgets')
-rw-r--r-- | desktop-widgets/mainwindow.cpp | 77 | ||||
-rw-r--r-- | desktop-widgets/mainwindow.h | 2 |
2 files changed, 54 insertions, 25 deletions
diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 77055b9c1..8566e2b48 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -175,28 +175,28 @@ MainWindow::MainWindow() : QMainWindow(), diveSiteEdit.reset(new LocationInformationWidget); - registerApplicationState(ApplicationState::Default, { { mainTab.get(), FLAG_NONE }, { profileContainer, FLAG_NONE }, - { diveList, FLAG_NONE }, { mapWidget, FLAG_NONE } }); - registerApplicationState(ApplicationState::EditDive, { { mainTab.get(), FLAG_NONE }, { profileContainer, FLAG_NONE }, - { diveList, FLAG_NONE }, { mapWidget, FLAG_NONE } }); - registerApplicationState(ApplicationState::PlanDive, { { &plannerWidgets->plannerWidget, FLAG_NONE }, { profileContainer, FLAG_NONE }, - { &plannerWidgets->plannerSettingsWidget, FLAG_NONE }, { &plannerWidgets->plannerDetails, FLAG_NONE } }); - registerApplicationState(ApplicationState::EditPlannedDive, { { &plannerWidgets->plannerWidget, FLAG_NONE }, { profileContainer, FLAG_NONE }, - { diveList, FLAG_NONE }, { mapWidget, FLAG_NONE } }); - registerApplicationState(ApplicationState::EditDiveSite, { { diveSiteEdit.get(), FLAG_NONE }, { profileContainer, FLAG_DISABLED }, - { diveList, FLAG_DISABLED }, { mapWidget, FLAG_NONE } }); - registerApplicationState(ApplicationState::FilterDive, { { mainTab.get(), FLAG_NONE }, { profileContainer, FLAG_NONE }, - { diveList, FLAG_NONE }, { &filterWidget, FLAG_NONE } }); - registerApplicationState(ApplicationState::Statistics, { { statistics, FLAG_NONE }, { profileContainer, FLAG_NONE }, - { diveList, FLAG_DISABLED }, { &filterWidget, FLAG_NONE } }); - registerApplicationState(ApplicationState::MapMaximized, { { nullptr, FLAG_NONE }, { nullptr, FLAG_NONE }, - { nullptr, FLAG_NONE }, { mapWidget, FLAG_NONE } }); - registerApplicationState(ApplicationState::ProfileMaximized, { { nullptr, FLAG_NONE }, { profileContainer, FLAG_NONE }, - { nullptr, FLAG_NONE }, { nullptr, FLAG_NONE } }); - registerApplicationState(ApplicationState::ListMaximized, { { nullptr, FLAG_NONE }, { nullptr, FLAG_NONE }, - { diveList, FLAG_NONE }, { nullptr, FLAG_NONE } }); - registerApplicationState(ApplicationState::InfoMaximized, { { mainTab.get(), FLAG_NONE }, { nullptr, FLAG_NONE }, - { nullptr, FLAG_NONE }, { nullptr, FLAG_NONE } }); + registerApplicationState(ApplicationState::Default, { true, { mainTab.get(), FLAG_NONE }, { profileContainer, FLAG_NONE }, + { diveList, FLAG_NONE }, { mapWidget, FLAG_NONE } }); + registerApplicationState(ApplicationState::EditDive, { false, { mainTab.get(), FLAG_NONE }, { profileContainer, FLAG_NONE }, + { diveList, FLAG_NONE }, { mapWidget, FLAG_NONE } }); + registerApplicationState(ApplicationState::PlanDive, { false, { &plannerWidgets->plannerWidget, FLAG_NONE }, { profileContainer, FLAG_NONE }, + { &plannerWidgets->plannerSettingsWidget, FLAG_NONE }, { &plannerWidgets->plannerDetails, FLAG_NONE } }); + registerApplicationState(ApplicationState::EditPlannedDive, { true, { &plannerWidgets->plannerWidget, FLAG_NONE }, { profileContainer, FLAG_NONE }, + { diveList, FLAG_NONE }, { mapWidget, FLAG_NONE } }); + registerApplicationState(ApplicationState::EditDiveSite, { false, { diveSiteEdit.get(), FLAG_NONE }, { profileContainer, FLAG_DISABLED }, + { diveList, FLAG_DISABLED }, { mapWidget, FLAG_NONE } }); + registerApplicationState(ApplicationState::FilterDive, { true, { mainTab.get(), FLAG_NONE }, { profileContainer, FLAG_NONE }, + { diveList, FLAG_NONE }, { &filterWidget, FLAG_NONE } }); + registerApplicationState(ApplicationState::Statistics, { true, { statistics, FLAG_NONE }, { profileContainer, FLAG_NONE }, + { diveList, FLAG_DISABLED }, { &filterWidget, FLAG_NONE } }); + registerApplicationState(ApplicationState::MapMaximized, { true, { nullptr, FLAG_NONE }, { nullptr, FLAG_NONE }, + { nullptr, FLAG_NONE }, { mapWidget, FLAG_NONE } }); + registerApplicationState(ApplicationState::ProfileMaximized, { true, { nullptr, FLAG_NONE }, { profileContainer, FLAG_NONE }, + { nullptr, FLAG_NONE }, { nullptr, FLAG_NONE } }); + registerApplicationState(ApplicationState::ListMaximized, { true, { nullptr, FLAG_NONE }, { nullptr, FLAG_NONE }, + { diveList, FLAG_NONE }, { nullptr, FLAG_NONE } }); + registerApplicationState(ApplicationState::InfoMaximized, { true, { mainTab.get(), FLAG_NONE }, { nullptr, FLAG_NONE }, + { nullptr, FLAG_NONE }, { nullptr, FLAG_NONE } }); restoreSplitterSizes(); setApplicationState(ApplicationState::Default); @@ -753,7 +753,7 @@ void MainWindow::planCreated() void MainWindow::on_actionReplanDive_triggered() { - if (!plannerStateClean() || !current_dive) + if (!plannerStateClean() || !current_dive || !userMayChangeAppState()) return; else if (!is_dc_planner(¤t_dive->dc)) { if (QMessageBox::warning(this, tr("Warning"), tr("Trying to replan a dive that's not a planned dive."), @@ -769,7 +769,7 @@ void MainWindow::on_actionReplanDive_triggered() void MainWindow::on_actionDivePlanner_triggered() { - if (!plannerStateClean()) + if (!plannerStateClean() || !userMayChangeAppState()) return; // put us in PLAN mode @@ -837,26 +837,36 @@ void MainWindow::on_actionYearlyStatistics_triggered() void MainWindow::on_actionViewList_triggered() { + if (!userMayChangeAppState()) + return; setApplicationState(ApplicationState::ListMaximized); } void MainWindow::on_actionViewProfile_triggered() { + if (!userMayChangeAppState()) + return; setApplicationState(ApplicationState::ProfileMaximized); } void MainWindow::on_actionViewInfo_triggered() { + if (!userMayChangeAppState()) + return; setApplicationState(ApplicationState::InfoMaximized); } void MainWindow::on_actionViewMap_triggered() { + if (!userMayChangeAppState()) + return; setApplicationState(ApplicationState::MapMaximized); } void MainWindow::on_actionViewAll_triggered() { + if (!userMayChangeAppState()) + return; setApplicationState(ApplicationState::Default); } @@ -1492,7 +1502,7 @@ void MainWindow::on_actionImportDiveSites_triggered() void MainWindow::editCurrentDive() { // We only allow editing of the profile for manually added dives. - if (!current_dive || !same_string(current_dive->dc.model, "manually added dive")) + if (!current_dive || !same_string(current_dive->dc.model, "manually added dive") || !userMayChangeAppState()) return; // This shouldn't be possible, but let's make sure no weird "double editing" takes place. @@ -1546,11 +1556,15 @@ void MainWindow::on_paste_triggered() void MainWindow::on_actionFilterTags_triggered() { + if (!userMayChangeAppState()) + return; setApplicationState(getAppState() == ApplicationState::FilterDive ? ApplicationState::Default : ApplicationState::FilterDive); } void MainWindow::on_actionStats_triggered() { + if (!userMayChangeAppState()) + return; setApplicationState(getAppState() == ApplicationState::Statistics ? ApplicationState::Default : ApplicationState::Statistics); } @@ -1584,6 +1598,11 @@ void MainWindow::clearSplitters() clearSplitter(ui.mainSplitter, this); } +bool MainWindow::userMayChangeAppState() const +{ + return applicationState[(int)getAppState()].allowUserChange; +} + void MainWindow::setApplicationState(ApplicationState state) { if (getAppState() == state) @@ -1609,6 +1628,14 @@ void MainWindow::setApplicationState(ApplicationState state) } restoreSplitterSizes(); + + bool allowChange = userMayChangeAppState(); + ui.actionViewAll->setEnabled(allowChange); + ui.actionViewList->setEnabled(allowChange); + ui.actionViewProfile->setEnabled(allowChange); + ui.actionViewInfo->setEnabled(allowChange); + ui.actionViewMap->setEnabled(allowChange); + ui.actionFilterTags->setEnabled(allowChange); } void MainWindow::showProgressBar() diff --git a/desktop-widgets/mainwindow.h b/desktop-widgets/mainwindow.h index ef29e86bb..2233a6090 100644 --- a/desktop-widgets/mainwindow.h +++ b/desktop-widgets/mainwindow.h @@ -205,6 +205,7 @@ private: }; struct Quadrants { + bool allowUserChange; // Allow the user to change away from this state Quadrant topLeft; Quadrant topRight; Quadrant bottomLeft; @@ -213,6 +214,7 @@ private: Quadrants applicationState[(size_t)ApplicationState::Count]; static void addWidgets(const Quadrant &); + bool userMayChangeAppState() const; void setQuadrantWidget(const Quadrant &q, QSplitter *splitter); void registerApplicationState(ApplicationState state, Quadrants q); |