> In order to fix the issues reported in JDK-8089589, the VirtualFlow now uses > the real sizes of the elements that are displayed. This allows for a more > natural way of scrolling through lists that contain items of very different > sizes. > The algorithm that is used, does not calculate the size of each individual > cell upfront, as that would be a major performance overhead (especially for > large lists). Instead, we estimate the total size and the size of the > individual cells based on the real measured size of a (growing) number of > cells. > > There are a number of key variables that depend on this estimated size: > * position > * aboluteOffset > * currentIndex > > As a consequence, when the estimated size is changing, the absoluteOffset may > change which may lead to a new currentIndex. If this happens during a layout > phase, or a "complex" operation (e.g. scroll to an item and select it), this > may lead to visually unexpected artifacts. While the rendering becomes more > "correct" when the estimated size is improving, it is more important that we > do not create visual confusion. > > The difficulty is that there are a large number of ways to manipulate the > VirtualFlow, and different entry points may have different expectations about > which variables should be kept constant (or only changed gradually). > > In this PR, we focus on consistency in the scrollTo method, where we want to > keep the top-cell constant. In case the estimated size is improved during the > scrollTo execution, or the next layoutChildren invocation, this implies > keeping the result of computeCurrentIndex() constant so that after scrolling > to a cell and selecting it, the selected cell is indeed the one that is > scrolled to. > > This PR contains a number of tests for this scrollTo behaviour, that should > also be considered as regression test in case we want to add more invariants > later.
Johan Vos has updated the pull request incrementally with one additional commit since the last revision: process reviewer comments ------------- Changes: - all: https://git.openjdk.org/jfx/pull/808/files - new: https://git.openjdk.org/jfx/pull/808/files/55f6ba94..c077f10e Webrevs: - full: https://webrevs.openjdk.org/?repo=jfx&pr=808&range=01 - incr: https://webrevs.openjdk.org/?repo=jfx&pr=808&range=00-01 Stats: 71 lines in 2 files changed: 3 ins; 4 del; 64 mod Patch: https://git.openjdk.org/jfx/pull/808.diff Fetch: git fetch https://git.openjdk.org/jfx pull/808/head:pull/808 PR: https://git.openjdk.org/jfx/pull/808