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.

-------------

Commit messages:
 - Add more consistency between key-values. The position, absoluteOffset and 
currentIndex

Changes: https://git.openjdk.org/jfx/pull/808/files
 Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=808&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8277785
  Stats: 372 lines in 4 files changed: 333 ins; 19 del; 20 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

Reply via email to