summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-11-14 17:52:03 +0900
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-11-14 17:58:14 +0900
commitdfd17c7a7fd1f5dd85f61a6feef96c616e02cfcb (patch)
tree1a319e3029bd13436ae266f7f1658a8ccd9bb92f
parent179615f3a9a7a657f9039e124865b2f449ddb703 (diff)
downloadsubsurface-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.cpp24
-rw-r--r--qt-ui/divelistview.h3
-rw-r--r--qt-ui/maintab.cpp12
-rw-r--r--qt-ui/mainwindow.cpp8
-rw-r--r--qt-ui/mainwindow.h2
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();