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 <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2014-05-27 15:02:45 -07:00
parent 7feea7ccfa
commit d1cd1eb933
3 changed files with 29 additions and 6 deletions

View file

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

View file

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

View file

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