When scrolling to dive, scroll to trip first

The behavior at startup is actually very annoying: we select the latest
dive, and expand the trip it is in, but since we use "scrollTo()" on
just the dive, and it's not initially visible, the startup will make the
first dive be at the top of the list view.

Which means that the actual _trip_ detail is not visible at all, since
it will have been scrolled off the list view entirely.

Fix this by first scrolling to the trip, and only then scrolling to the
actual dive (using the default "EnsureVisible" policy).  Obviously, if
it's a trip with lots of dives, scrolling to the dive may end up
scrolling away from the trip header again, but at least that never
happens at startup, and at that point you have to scroll away from the
trip just to show the dive.

Do this same dance when changing the dive selection (mainly noticeable
when picking dives on the globe view).

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Linus Torvalds 2014-04-28 10:39:06 -07:00 committed by Dirk Hohndel
parent 2d24779b62
commit 4f20bb9fb2

View file

@ -218,6 +218,8 @@ void DiveListView::selectDive(int i, bool scrollto, bool toggle)
if (idx.parent().isValid()) {
setAnimated(false);
expand(idx.parent());
if (scrollto)
scrollTo(idx.parent());
setAnimated(true);
}
if (scrollto)
@ -274,6 +276,8 @@ void DiveListView::selectDives(const QList<int> &newDiveSelection)
this, SLOT(currentChanged(QModelIndex, QModelIndex)));
Q_EMIT currentDiveChanged(selected_dive);
const QModelIndex &idx = m->match(m->index(0, 0), DiveTripModel::DIVE_IDX, selected_dive, 2, Qt::MatchRecursive).first();
if (idx.parent().isValid())
scrollTo(idx.parent());
scrollTo(idx);
}
@ -371,6 +375,7 @@ void DiveListView::reload(DiveTripModel::Layout layout, bool forceSort)
if (!isExpanded(curr)) {
setAnimated(false);
expand(curr);
scrollTo(curr);
setAnimated(true);
}
}