diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 34df44bf1..f2ca6a399 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -112,6 +112,30 @@ void DiveListView::fixMessyQtModelBehaviour() } } +// this only remembers dives that were selected, not trips +void DiveListView::rememberSelection() +{ + selectedDives.clear(); + QItemSelection selection = selectionModel()->selection(); + Q_FOREACH(const QModelIndex& index , selection.indexes()) { + if (index.column() != 0) // We only care about the dives, so, let's stick to rows and discard columns. + continue; + struct dive *d = (struct dive *) index.data(DiveTripModel::DIVE_ROLE).value(); + if (d) + selectedDives.push_front(get_divenr(d)); + } +} + +void DiveListView::restoreSelection() +{ + unselectDives(); + Q_FOREACH(int i, selectedDives) { + struct dive *d = get_dive(i); + if (d) + selectDive(d); + } +} + void DiveListView::unselectDives() { selectionModel()->clearSelection(); diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h index f71013177..bcd603e12 100644 --- a/qt-ui/divelistview.h +++ b/qt-ui/divelistview.h @@ -26,6 +26,8 @@ public: bool eventFilter(QObject* , QEvent* ); void unselectDives(); void selectDive(struct dive *, bool scrollto = false, bool toggle = false); + void rememberSelection(); + void restoreSelection(); void contextMenuEvent(QContextMenuEvent *event); QSet selectedTrips; @@ -50,6 +52,7 @@ signals: private: bool mouseClickSelection; QList expandedRows; + QList selectedDives; int sortColumn; Qt::SortOrder currentOrder; DiveTripModel::Layout currentLayout; diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index bd10ed356..005efe496 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -493,7 +493,6 @@ void MainTab::acceptChanges() } } - save_dive(stdout, current_dive); if (editMode == ADD || editMode == MANUALLY_ADDED_DIVE) { // clean up the dive data (get duration, depth information from samples) fixup_dive(current_dive); @@ -558,7 +557,6 @@ void MainTab::rejectChanges() if (lastMode == ADD) { // clean up DivePlannerPointsModel::instance()->cancelPlan(); - delete_single_dive(selected_dive); } else if (lastMode == MANUALLY_ADDED_DIVE ) { DivePlannerPointsModel::instance()->undoEdition(); // that's BOGUS... just copy the original dive back and be done with it... } @@ -609,6 +607,11 @@ void MainTab::rejectChanges() } } updateGpsCoordinates(curr); + if (lastMode == ADD) { + delete_single_dive(selected_dive); + mainWindow()->dive_list()->reload(DiveTripModel::CURRENT); + mainWindow()->dive_list()->restoreSelection(); + } if (selected_dive >= 0) { multiEditEquipmentPlaceholder = *get_dive(selected_dive); cylindersModel->setDive(&multiEditEquipmentPlaceholder); @@ -627,14 +630,15 @@ void MainTab::rejectChanges() ui.equipmentButtonBox->hide(); notesBackup.clear(); resetPallete(); + editMode = NONE; if (lastMode == ADD || lastMode == MANUALLY_ADDED_DIVE) { // more clean up updateDiveInfo(selected_dive); mainWindow()->showProfile(); - mainWindow()->refreshDisplay(); + // we already reloaded the divelist above, so don't recreate it or we'll lose the selection + mainWindow()->refreshDisplay(false); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::NOTHING); } - editMode = NONE; } #undef EDIT_TEXT2 diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 527441083..3222d4887 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -65,12 +65,13 @@ MainWindow::MainWindow() : helpView(0) } // this gets called after we download dives from a divecomputer -void MainWindow::refreshDisplay() +void MainWindow::refreshDisplay(bool recreateDiveList) { ui.InfoWidget->reload(); ui.ProfileWidget->refresh(); ui.globe->reload(); - ui.ListWidget->reload(DiveTripModel::CURRENT); + if (recreateDiveList) + ui.ListWidget->reload(DiveTripModel::CURRENT); ui.ListWidget->setFocus(); WSInfoModel *wsim = WSInfoModel::instance(); wsim->updateInfo(); @@ -282,8 +283,7 @@ void MainWindow::on_actionAddDive_triggered() QMessageBox::warning(this, tr("Warning"), "First finish the current edition before trying to do another." ); return; } - - // clear the selection + dive_list()->rememberSelection(); dive_list()->unselectDives(); disableDcShortcuts(); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h index 9a8deb1a0..a7dafb48b 100644 --- a/qt-ui/mainwindow.h +++ b/qt-ui/mainwindow.h @@ -108,7 +108,7 @@ protected: public slots: void readSettings(); - void refreshDisplay(); + void refreshDisplay(bool recreateDiveList = true); void showProfile(); void editCurrentDive();