From 1314a2034af82e3c45dc0cb497360e22be4d0972 Mon Sep 17 00:00:00 2001 From: Jurgen Date: Fri, 28 Aug 2020 14:14:25 +0200 Subject: [PATCH] Reduce scroll noise (#78) --- .../java/org/fxmisc/flowless/SizeTracker.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/fxmisc/flowless/SizeTracker.java b/src/main/java/org/fxmisc/flowless/SizeTracker.java index 9423171..1896124 100644 --- a/src/main/java/org/fxmisc/flowless/SizeTracker.java +++ b/src/main/java/org/fxmisc/flowless/SizeTracker.java @@ -1,5 +1,6 @@ package org.fxmisc.flowless; +import java.time.Duration; import java.util.Optional; import java.util.function.Function; @@ -7,6 +8,7 @@ import javafx.geometry.Bounds; import javafx.scene.control.IndexRange; +import org.reactfx.EventStreams; import org.reactfx.Subscription; import org.reactfx.collection.LiveList; import org.reactfx.collection.MemoizationList; @@ -117,11 +119,15 @@ public SizeTracker( Val firstCellMinY = firstVisibleCell.flatMap(orientation::minYProperty); - lengthOffsetEstimate = Val.combine( - totalKnownLengthBeforeFirstVisibleCell, - unknownLengthEstimateBeforeFirstVisibleCell, - firstCellMinY, - (a, b, minY) -> a + b - minY).orElseConst(0.0); + lengthOffsetEstimate = Val.wrap( EventStreams.combine( + totalKnownLengthBeforeFirstVisibleCell.values(), + unknownLengthEstimateBeforeFirstVisibleCell.values(), + firstCellMinY.values() + ) + .filter( t3 -> t3.test( (a,b,minY) -> a != null && b != null && minY != null ) ) + .thenRetainLatestFor( Duration.ofMillis( 1 ) ) + .map( t3 -> t3.map( (a,b,minY) -> Double.valueOf( a + b - minY ) ) ) + .toBinding( 0.0 ) ); // pinning totalLengthEstimate and lengthOffsetEstimate // binds it all together and enables memoization