Skip to content

Commit 6aeec90

Browse files
Auto scroll for document menu (#581)
1 parent c9d47c2 commit 6aeec90

4 files changed

Lines changed: 144 additions & 13 deletions

File tree

application/features/note_menu/src/commonMain/kotlin/io/writeopia/notemenu/ui/screen/documents/NotesCardsScreen.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@ import androidx.compose.foundation.layout.width
2121
import androidx.compose.foundation.lazy.LazyColumn
2222
import androidx.compose.foundation.lazy.grid.GridCells
2323
import androidx.compose.foundation.lazy.grid.GridItemSpan
24-
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
2524
import androidx.compose.foundation.lazy.grid.itemsIndexed
2625
import androidx.compose.foundation.lazy.itemsIndexed
27-
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
2826
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
2927
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan
3028
import androidx.compose.foundation.lazy.staggeredgrid.itemsIndexed
@@ -70,6 +68,8 @@ import io.writeopia.sdk.model.draganddrop.DropInfo
7068
import io.writeopia.sdk.models.story.StoryTypes
7169
import io.writeopia.sdk.models.utils.ResultData
7270
import io.writeopia.theme.WriteopiaTheme
71+
import io.writeopia.ui.components.AutoScrollLazyVerticalGrid
72+
import io.writeopia.ui.components.AutoScrollLazyVerticalStaggeredGrid
7373
import io.writeopia.ui.components.SwipeBox
7474
import io.writeopia.ui.components.multiselection.SelectableByDrag
7575
import io.writeopia.ui.draganddrop.target.DragCardTarget
@@ -284,7 +284,7 @@ private fun LazyStaggeredGridNotes(
284284
) {
285285
val spacing = 6.dp
286286

287-
LazyVerticalStaggeredGrid(
287+
AutoScrollLazyVerticalStaggeredGrid(
288288
modifier = modifier,
289289
columns = StaggeredGridCells.Adaptive(minSize = minimalNoteWidth),
290290
horizontalArrangement = Arrangement.spacedBy(spacing),
@@ -367,7 +367,7 @@ private fun LazyGridNotes(
367367
) {
368368
val spacing = Arrangement.spacedBy(6.dp)
369369

370-
LazyVerticalGrid(
370+
AutoScrollLazyVerticalGrid(
371371
modifier = modifier,
372372
columns = GridCells.Adaptive(minSize = minimalNoteWidth),
373373
horizontalArrangement = spacing,

writeopia_ui/src/commonMain/kotlin/io/writeopia/ui/components/AutoScrollLazyColumn.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.writeopia.ui.components
22

3+
import androidx.compose.foundation.gestures.ScrollableState
34
import androidx.compose.foundation.layout.Box
45
import androidx.compose.foundation.layout.PaddingValues
56
import androidx.compose.foundation.lazy.LazyColumn
@@ -51,7 +52,7 @@ fun AutoScrollLazyColumn(
5152

5253
AutoScrollEffect(
5354
dragInfo = dragInfo,
54-
listState = state,
55+
scrollableState = state,
5556
columnTop = columnTop,
5657
columnBottom = columnBottom,
5758
edgeThreshold = edgeThreshold,
@@ -75,15 +76,15 @@ fun AutoScrollLazyColumn(
7576
}
7677

7778
@Composable
78-
private fun AutoScrollEffect(
79+
internal fun AutoScrollEffect(
7980
dragInfo: DragTargetInfo,
80-
listState: LazyListState,
81+
scrollableState: ScrollableState,
8182
columnTop: Float,
8283
columnBottom: Float,
8384
edgeThreshold: Dp,
8485
scrollSpeed: Float
8586
) {
86-
LaunchedEffect(dragInfo, listState, columnTop, columnBottom, edgeThreshold, scrollSpeed) {
87+
LaunchedEffect(dragInfo, scrollableState, columnTop, columnBottom, edgeThreshold, scrollSpeed) {
8788
snapshotFlow {
8889
AutoScrollData(
8990
isDragging = dragInfo.isDragging,
@@ -117,7 +118,7 @@ private fun AutoScrollEffect(
117118
}
118119

119120
if (scrollAmount != 0f) {
120-
listState.scrollBy(scrollAmount)
121+
scrollableState.dispatchRawDelta(scrollAmount)
121122
}
122123

123124
delay(16) // ~60fps
@@ -131,7 +132,3 @@ private data class AutoScrollData(
131132
val isDragging: Boolean,
132133
val dragY: Float
133134
)
134-
135-
private suspend fun LazyListState.scrollBy(amount: Float) {
136-
dispatchRawDelta(amount)
137-
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package io.writeopia.ui.components
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.PaddingValues
6+
import androidx.compose.foundation.lazy.grid.GridCells
7+
import androidx.compose.foundation.lazy.grid.LazyGridScope
8+
import androidx.compose.foundation.lazy.grid.LazyGridState
9+
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
10+
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.getValue
13+
import androidx.compose.runtime.mutableStateOf
14+
import androidx.compose.runtime.remember
15+
import androidx.compose.runtime.setValue
16+
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.layout.boundsInWindow
18+
import androidx.compose.ui.layout.onGloballyPositioned
19+
import androidx.compose.ui.unit.Dp
20+
import androidx.compose.ui.unit.dp
21+
import io.writeopia.ui.draganddrop.target.DragTargetInfo
22+
import io.writeopia.ui.draganddrop.target.LocalDragTargetInfo
23+
24+
@Composable
25+
fun AutoScrollLazyVerticalGrid(
26+
columns: GridCells,
27+
modifier: Modifier = Modifier,
28+
state: LazyGridState = rememberLazyGridState(),
29+
contentPadding: PaddingValues = PaddingValues(0.dp),
30+
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
31+
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
32+
edgeThreshold: Dp = 80.dp,
33+
scrollSpeed: Float = 15f,
34+
content: LazyGridScope.() -> Unit
35+
) {
36+
val dragInfo: DragTargetInfo = LocalDragTargetInfo.current
37+
38+
var columnTop by remember { mutableStateOf(0f) }
39+
var columnBottom by remember { mutableStateOf(0f) }
40+
41+
AutoScrollEffect(
42+
dragInfo = dragInfo,
43+
scrollableState = state,
44+
columnTop = columnTop,
45+
columnBottom = columnBottom,
46+
edgeThreshold = edgeThreshold,
47+
scrollSpeed = scrollSpeed
48+
)
49+
50+
Box(
51+
modifier = Modifier.onGloballyPositioned { coordinates ->
52+
val bounds = coordinates.boundsInWindow()
53+
columnTop = bounds.top
54+
columnBottom = bounds.bottom
55+
}
56+
) {
57+
LazyVerticalGrid(
58+
columns = columns,
59+
modifier = modifier,
60+
state = state,
61+
contentPadding = contentPadding,
62+
horizontalArrangement = horizontalArrangement,
63+
verticalArrangement = verticalArrangement,
64+
content = content
65+
)
66+
}
67+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package io.writeopia.ui.components
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.PaddingValues
6+
import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope
7+
import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState
8+
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
9+
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
10+
import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.getValue
13+
import androidx.compose.runtime.mutableStateOf
14+
import androidx.compose.runtime.remember
15+
import androidx.compose.runtime.setValue
16+
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.layout.boundsInWindow
18+
import androidx.compose.ui.layout.onGloballyPositioned
19+
import androidx.compose.ui.unit.Dp
20+
import androidx.compose.ui.unit.dp
21+
import io.writeopia.ui.draganddrop.target.DragTargetInfo
22+
import io.writeopia.ui.draganddrop.target.LocalDragTargetInfo
23+
24+
@Composable
25+
fun AutoScrollLazyVerticalStaggeredGrid(
26+
columns: StaggeredGridCells,
27+
modifier: Modifier = Modifier,
28+
state: LazyStaggeredGridState = rememberLazyStaggeredGridState(),
29+
contentPadding: PaddingValues = PaddingValues(0.dp),
30+
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
31+
verticalItemSpacing: Dp = 0.dp,
32+
edgeThreshold: Dp = 80.dp,
33+
scrollSpeed: Float = 15f,
34+
content: LazyStaggeredGridScope.() -> Unit
35+
) {
36+
val dragInfo: DragTargetInfo = LocalDragTargetInfo.current
37+
38+
var columnTop by remember { mutableStateOf(0f) }
39+
var columnBottom by remember { mutableStateOf(0f) }
40+
41+
AutoScrollEffect(
42+
dragInfo = dragInfo,
43+
scrollableState = state,
44+
columnTop = columnTop,
45+
columnBottom = columnBottom,
46+
edgeThreshold = edgeThreshold,
47+
scrollSpeed = scrollSpeed
48+
)
49+
50+
Box(
51+
modifier = Modifier.onGloballyPositioned { coordinates ->
52+
val bounds = coordinates.boundsInWindow()
53+
columnTop = bounds.top
54+
columnBottom = bounds.bottom
55+
}
56+
) {
57+
LazyVerticalStaggeredGrid(
58+
columns = columns,
59+
modifier = modifier,
60+
state = state,
61+
contentPadding = contentPadding,
62+
horizontalArrangement = horizontalArrangement,
63+
verticalItemSpacing = verticalItemSpacing,
64+
content = content
65+
)
66+
}
67+
}

0 commit comments

Comments
 (0)