mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 13:10:19 +00:00
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>
This commit is contained in:
parent
141433c3df
commit
3485c6c260
1 changed files with 12 additions and 6 deletions
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue