From d1cd1eb933418282942b5cdacd1df46b75729f44 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Tue, 27 May 2014 15:02:45 -0700 Subject: [PATCH] Planner: better handle the temporary dive used for planning This still crashes when you abort the plan. And when you accept the plan, the profile stays stuck in PLAN mode. Signed-off-by: Dirk Hohndel --- qt-ui/diveplanner.cpp | 16 ++++++++++++---- qt-ui/mainwindow.cpp | 17 +++++++++++++++-- qt-ui/mainwindow.h | 2 ++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/qt-ui/diveplanner.cpp b/qt-ui/diveplanner.cpp index c26aa9569..f6127e5c4 100644 --- a/qt-ui/diveplanner.cpp +++ b/qt-ui/diveplanner.cpp @@ -247,8 +247,10 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent, Qt::WindowFlags f) : QWidg // Creating the plan connect(ui.buttonBox, SIGNAL(accepted()), plannerModel, SLOT(createPlan())); connect(ui.buttonBox, SIGNAL(rejected()), plannerModel, SLOT(cancelPlan())); + connect(plannerModel, SIGNAL(planCreated()), MainWindow::instance(), SLOT(removeFakeDiveForAddAndPlan())); connect(plannerModel, SIGNAL(planCreated()), MainWindow::instance(), SLOT(showProfile())); connect(plannerModel, SIGNAL(planCreated()), MainWindow::instance(), SLOT(refreshDisplay())); + connect(plannerModel, SIGNAL(planCanceled()), MainWindow::instance(), SLOT(removeFakeDiveForAddAndPlan())); connect(plannerModel, SIGNAL(planCanceled()), MainWindow::instance(), SLOT(showProfile())); /* set defaults. */ @@ -647,14 +649,17 @@ void DivePlannerPointsModel::cancelPlan() } } clear(); + // we unselected all dives earlier, so restore that first and then recreate the dive list + MainWindow::instance()->dive_list()->restoreSelection(); + MainWindow::instance()->dive_list()->reload(DiveTripModel::CURRENT); + MainWindow::instance()->refreshDisplay(); emit planCanceled(); - if (mode != ADD) + if (mode != ADD) { free(stagingDive); + stagingDive = NULL; + } setPlanMode(NOTHING); - stagingDive = NULL; diveplan.dp = NULL; - CylindersModel::instance()->setDive(current_dive); - CylindersModel::instance()->update(); } DivePlannerPointsModel::Mode DivePlannerPointsModel::currentMode() const @@ -854,6 +859,9 @@ void DivePlannerPointsModel::createPlan() // the dive by mistake. diveplan.dp = NULL; clear(); + + // we unselected all dives earlier, so as a side effect recreating the dive list will select the new dive + MainWindow::instance()->recreateDiveList(); planCreated(); setPlanMode(NOTHING); free(stagingDive); diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 9d8a0643c..8a637ff6b 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -58,7 +58,8 @@ MainWindow::MainWindow() : QMainWindow(), yearlyStats(0), yearlyStatsModel(0), state(VIEWALL), - updateManager(0) + updateManager(0), + fakeDiveId(0) { Q_ASSERT_X(m_Instance == NULL, "MainWindow", "MainWindow recreated!"); m_Instance = this; @@ -372,6 +373,7 @@ void MainWindow::createFakeDiveForAddAndPlan() // now cheat - create one dive that we use to store the info tab data in //TODO: C-function create_temporary_dive ? struct dive *dive = alloc_dive(); + fakeDiveId = dive->id; dive->when = QDateTime::currentMSecsSinceEpoch() / 1000L + gettimezoneoffset(); dive->dc.model = "manually added dive"; // don't translate! this is stored in the XML file @@ -386,6 +388,16 @@ void MainWindow::createFakeDiveForAddAndPlan() ui.InfoWidget->updateDiveInfo(selected_dive); } +void MainWindow::removeFakeDiveForAddAndPlan() +{ + int idx; + + if (!fakeDiveId || + (idx = get_idx_by_uniq_id(fakeDiveId)) == dive_table.nr) + return; + delete_single_dive(idx); +} + void MainWindow::on_actionDivePlanner_triggered() { if(!plannerStateClean()) @@ -409,7 +421,8 @@ void MainWindow::on_actionDivePlanner_triggered() createFakeDiveForAddAndPlan(); DivePlannerPointsModel::instance()->createSimpleDive(true); - // disable the dive list + // reload and then disable the dive list + ui.ListWidget->reload(DiveTripModel::CURRENT); ui.ListWidget->setEnabled(false); } diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h index 8bb62b933..882534722 100644 --- a/qt-ui/mainwindow.h +++ b/qt-ui/mainwindow.h @@ -151,6 +151,7 @@ slots: void recreateDiveList(); void showProfile(); void editCurrentDive(); + void removeFakeDiveForAddAndPlan(); private: Ui::MainWindow ui; @@ -175,6 +176,7 @@ private: bool plannerStateClean(); void createFakeDiveForAddAndPlan(); + int fakeDiveId; }; #endif // MAINWINDOW_H