diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2014-04-03 10:11:39 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-04-03 10:26:48 -0700 |
commit | 3485c6c2609f998b82d56b89e3a12db7dc0c4b05 (patch) | |
tree | 11110864527bac59c2b34216be8d35ca09c784f6 | |
parent | 141433c3df8f033737942c2fb90dca9fa841a19d (diff) | |
download | subsurface-3485c6c2609f998b82d56b89e3a12db7dc0c4b05.tar.gz |
Correctly handle dive selection after editing dives
It's a tricky problem as we need to remember this across a divelist sort
(as the user might have edited the date / time). The old code made not one
but two incorrect assumptions.
a) it assumed that the added or edited (but previously manually added)
dive was the last one in the dive list (clearly wrong when adding a dive
that has an earlier date)
b) it ignored the fact that refreshDisplay() would select the top dive in
the list if no dive was selected
This patch addresses both of them and makes the code easier to understand.
Fixes #480
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | qt-ui/maintab.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index 9ff5e9f31..70a9dc3cf 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -671,24 +671,30 @@ void MainTab::acceptChanges() int scrolledBy = MainWindow::instance()->dive_list()->verticalScrollBar()->sliderPosition(); resetPallete(); if (editMode == ADD || editMode == MANUALLY_ADDED_DIVE) { + // it's tricky to keep the right dive selected; + // first remember which one is selected in the current sort order + // and unselect all dives + int rememberSelected = selected_dive; MainWindow::instance()->dive_list()->unselectDives(); - struct dive *d = get_dive(dive_table.nr - 1); - // mark the dive as remembered (abusing the selected flag) + struct dive *d = get_dive(rememberSelected); + // mark the previously selected dive as remembered (abusing the selected flag) // and then clear that flag out on the other side of the sort_table() d->selected = true; sort_table(&dive_table); - int i = 0; - for_each_dive(i, d) { + for_each_dive(rememberSelected, d) { if (d->selected) { d->selected = false; break; } } + // refreshDisplay() will select the top dive if no dive was + // selected - but that may not be the right one, so select the one + // we remembered instead + MainWindow::instance()->dive_list()->selectDive(rememberSelected, true); + editMode = NONE; MainWindow::instance()->refreshDisplay(); - MainWindow::instance()->dive_list()->selectDive(i, true); MainWindow::instance()->graphics()->replot(); - } else { editMode = NONE; MainWindow::instance()->dive_list()->rememberSelection(); |