Skip to content

Commit

Permalink
Merge pull request #659 from usuiat/fix_nestedscroll_issue_in_timetab…
Browse files Browse the repository at this point in the history
…le_grid

Fix NestedScroll Issue in Timetable Grid to Allow Tab Shrinking on Scroll
  • Loading branch information
NUmeroAndDev authored Aug 19, 2023
2 parents 4f4e26c + 5629cb6 commit 0ea0e39
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.pointer.PointerInputChange
import androidx.compose.ui.input.pointer.PointerInputScope
import androidx.compose.ui.input.pointer.pointerInput
Expand Down Expand Up @@ -69,13 +71,15 @@ data class TimetableGridUiState(val timetable: Timetable)
@Composable
fun TimetableGrid(
uiState: TimetableGridUiState,
nestedScrollDispatcher: NestedScrollDispatcher,
onTimetableItemClick: (TimetableItem) -> Unit,
modifier: Modifier = Modifier,
) {
val timetableGridState = rememberTimetableGridState()
TimetableGrid(
timetable = uiState.timetable,
timetableState = timetableGridState,
nestedScrollDispatcher = nestedScrollDispatcher,
modifier = modifier,
contentPadding = PaddingValues(16.dp),
) { timetableItem, itemHeightPx ->
Expand All @@ -92,6 +96,7 @@ fun TimetableGrid(
fun TimetableGrid(
timetable: Timetable,
timetableState: TimetableState,
nestedScrollDispatcher: NestedScrollDispatcher,
modifier: Modifier = Modifier,
contentPadding: PaddingValues = PaddingValues(),
content: @Composable (TimetableItem, Int) -> Unit,
Expand Down Expand Up @@ -159,6 +164,7 @@ fun TimetableGrid(
dragAmount,
change.uptimeMillis,
change.position,
nestedScrollDispatcher,
)
}
},
Expand Down Expand Up @@ -251,6 +257,7 @@ fun TimetablePreview() {
modifier = Modifier.fillMaxSize(),
timetable = Timetable.fake(),
timetableState = timetableState,
nestedScrollDispatcher = remember { NestedScrollDispatcher() },
) { timetableItem, itemHeightPx ->
TimetableGridItem(
timetableItem = timetableItem,
Expand Down Expand Up @@ -572,15 +579,29 @@ private class TimetableScreen(
dragAmount: Offset,
timeMillis: Long,
position: Offset,
nestedScrollDispatcher: NestedScrollDispatcher,
) {
val nextPossibleX = calculatePossibleScrollX(dragAmount.x)
val nextPossibleY = calculatePossibleScrollY(dragAmount.y)
val parentConsumed = nestedScrollDispatcher.dispatchPreScroll(
available = dragAmount,
source = NestedScrollSource.Drag,
)
val nextPossibleX = calculatePossibleScrollX(dragAmount.x - parentConsumed.x)
val nextPossibleY = calculatePossibleScrollY(dragAmount.y - parentConsumed.y)
val weConsumed = Offset(
nextPossibleX - scrollState.scrollX,
nextPossibleY - scrollState.scrollY,
)
scrollState.scroll(
scrollX = nextPossibleX,
scrollY = nextPossibleY,
timeMillis = timeMillis,
position = position,
)
nestedScrollDispatcher.dispatchPostScroll(
consumed = parentConsumed + weConsumed,
available = dragAmount - weConsumed - parentConsumed,
source = NestedScrollSource.Drag,
)
}

fun enableHorizontalScroll(dragX: Float): Boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.testTag
Expand Down Expand Up @@ -100,11 +101,17 @@ fun TimetableSheet(
}

is GridTimetable -> {
val nestedScrollDispatcher = remember { NestedScrollDispatcher() }
TimetableGrid(
uiState = requireNotNull(uiState.timetableGridUiState[selectedDay]),
nestedScrollDispatcher = nestedScrollDispatcher,
onTimetableItemClick = onTimetableItemClick,
modifier = Modifier
.fillMaxSize()
.nestedScroll(
timetableSheetContentScrollState.nestedScrollConnection,
nestedScrollDispatcher,
)
.weight(1f),
)
}
Expand Down

0 comments on commit 0ea0e39

Please sign in to comment.