diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2013-11-14 17:52:03 +0900 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-11-14 17:58:14 +0900 |
commit | dfd17c7a7fd1f5dd85f61a6feef96c616e02cfcb (patch) | |
tree | 1a319e3029bd13436ae266f7f1658a8ccd9bb92f | |
parent | 179615f3a9a7a657f9039e124865b2f449ddb703 (diff) | |
download | subsurface-dfd17c7a7fd1f5dd85f61a6feef96c616e02cfcb.tar.gz |
Maintain the selection when aborting "dive add"
We remember what was selected before and restore it. Maybe there's a more
"Qt way" of doing this, but my implementation appears to work :-)
Also remove unconditional debug output that snuck into an earlier commit.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | qt-ui/divelistview.cpp | 24 | ||||
-rw-r--r-- | qt-ui/divelistview.h | 3 | ||||
-rw-r--r-- | qt-ui/maintab.cpp | 12 | ||||
-rw-r--r-- | qt-ui/mainwindow.cpp | 8 | ||||
-rw-r--r-- | qt-ui/mainwindow.h | 2 |
5 files changed, 40 insertions, 9 deletions
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<void*>(); + 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<dive_trip_t *> selectedTrips; @@ -50,6 +52,7 @@ signals: private: bool mouseClickSelection; QList<int> expandedRows; + QList<int> 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(); |