Skip to content

Commit

Permalink
Merge pull request #1080 from oikvpqya/fix-scrollbar-thumb
Browse files Browse the repository at this point in the history
Fix #1079: Update thumb movement range by thumb size, in app scrollbars
  • Loading branch information
tunjid authored Dec 8, 2023
2 parents 646c9cf + e8f4537 commit 63bba2e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ class ScrollbarState {
*/
val thumbMovedPercent
get() = unpackFloat2(packedValue)

/**
* Returns the max distance the thumb can travel as a percentage of total track size
*/
val thumbTrackSizePercent
get() = 1f - thumbSizePercent
}

/**
Expand Down Expand Up @@ -310,27 +316,30 @@ fun Scrollbar(
b = minThumbSize.toPx(),
)

val thumbTravelPercent = when {
interactionThumbTravelPercent.isNaN() -> state.thumbMovedPercent
else -> interactionThumbTravelPercent
val trackSizePx = when (state.thumbTrackSizePercent) {
0f -> track.size
else -> (track.size - thumbSizePx) / state.thumbTrackSizePercent
}

val thumbMovedPx = min(
a = track.size * thumbTravelPercent,
b = track.size - thumbSizePx,
val thumbTravelPercent = max(
a = min(
a = when {
interactionThumbTravelPercent.isNaN() -> state.thumbMovedPercent
else -> interactionThumbTravelPercent
},
b = state.thumbTrackSizePercent,
),
b = 0f,
)

val scrollbarThumbMovedPx = max(
a = thumbMovedPx.roundToInt(),
b = 0,
)
val thumbMovedPx = trackSizePx * thumbTravelPercent

val y = when (orientation) {
Horizontal -> 0
Vertical -> scrollbarThumbMovedPx
Vertical -> thumbMovedPx.roundToInt()
}
val x = when (orientation) {
Horizontal -> scrollbarThumbMovedPx
Horizontal -> thumbMovedPx.roundToInt()
Vertical -> 0
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import kotlin.math.roundToInt

/**
* Remembers a function to react to [Scrollbar] thumb position displacements for a [LazyListState]
Expand Down Expand Up @@ -79,7 +80,7 @@ private inline fun rememberDraggableScroller(

LaunchedEffect(percentage) {
if (percentage.isNaN()) return@LaunchedEffect
val indexToFind = (itemCount * percentage).toInt()
val indexToFind = (itemCount * percentage).roundToInt()
scroll(indexToFind)
}
return remember {
Expand Down

0 comments on commit 63bba2e

Please sign in to comment.