Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan
import androidx.compose.foundation.lazy.staggeredgrid.itemsIndexed
Expand Down Expand Up @@ -70,6 +68,8 @@ import io.writeopia.sdk.model.draganddrop.DropInfo
import io.writeopia.sdk.models.story.StoryTypes
import io.writeopia.sdk.models.utils.ResultData
import io.writeopia.theme.WriteopiaTheme
import io.writeopia.ui.components.AutoScrollLazyVerticalGrid
import io.writeopia.ui.components.AutoScrollLazyVerticalStaggeredGrid
import io.writeopia.ui.components.SwipeBox
import io.writeopia.ui.components.multiselection.SelectableByDrag
import io.writeopia.ui.draganddrop.target.DragCardTarget
Expand Down Expand Up @@ -284,7 +284,7 @@ private fun LazyStaggeredGridNotes(
) {
val spacing = 6.dp

LazyVerticalStaggeredGrid(
AutoScrollLazyVerticalStaggeredGrid(
modifier = modifier,
columns = StaggeredGridCells.Adaptive(minSize = minimalNoteWidth),
horizontalArrangement = Arrangement.spacedBy(spacing),
Expand Down Expand Up @@ -367,7 +367,7 @@ private fun LazyGridNotes(
) {
val spacing = Arrangement.spacedBy(6.dp)

LazyVerticalGrid(
AutoScrollLazyVerticalGrid(
modifier = modifier,
columns = GridCells.Adaptive(minSize = minimalNoteWidth),
horizontalArrangement = spacing,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.writeopia.ui.components

import androidx.compose.foundation.gestures.ScrollableState
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.lazy.LazyColumn
Expand Down Expand Up @@ -51,7 +52,7 @@ fun AutoScrollLazyColumn(

AutoScrollEffect(
dragInfo = dragInfo,
listState = state,
scrollableState = state,
columnTop = columnTop,
columnBottom = columnBottom,
edgeThreshold = edgeThreshold,
Expand All @@ -75,15 +76,15 @@ fun AutoScrollLazyColumn(
}

@Composable
private fun AutoScrollEffect(
internal fun AutoScrollEffect(
dragInfo: DragTargetInfo,
listState: LazyListState,
scrollableState: ScrollableState,
columnTop: Float,
columnBottom: Float,
edgeThreshold: Dp,
scrollSpeed: Float
) {
LaunchedEffect(dragInfo, listState, columnTop, columnBottom, edgeThreshold, scrollSpeed) {
LaunchedEffect(dragInfo, scrollableState, columnTop, columnBottom, edgeThreshold, scrollSpeed) {
snapshotFlow {
AutoScrollData(
isDragging = dragInfo.isDragging,
Expand Down Expand Up @@ -117,7 +118,7 @@ private fun AutoScrollEffect(
}

if (scrollAmount != 0f) {
listState.scrollBy(scrollAmount)
scrollableState.dispatchRawDelta(scrollAmount)
}

delay(16) // ~60fps
Expand All @@ -131,7 +132,3 @@ private data class AutoScrollData(
val isDragging: Boolean,
val dragY: Float
)

private suspend fun LazyListState.scrollBy(amount: Float) {
dispatchRawDelta(amount)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package io.writeopia.ui.components

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.foundation.lazy.grid.LazyGridState
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.boundsInWindow
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import io.writeopia.ui.draganddrop.target.DragTargetInfo
import io.writeopia.ui.draganddrop.target.LocalDragTargetInfo

@Composable
fun AutoScrollLazyVerticalGrid(
columns: GridCells,
modifier: Modifier = Modifier,
state: LazyGridState = rememberLazyGridState(),
contentPadding: PaddingValues = PaddingValues(0.dp),
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
edgeThreshold: Dp = 80.dp,
scrollSpeed: Float = 15f,
content: LazyGridScope.() -> Unit
) {
val dragInfo: DragTargetInfo = LocalDragTargetInfo.current

var columnTop by remember { mutableStateOf(0f) }
var columnBottom by remember { mutableStateOf(0f) }

AutoScrollEffect(
dragInfo = dragInfo,
scrollableState = state,
columnTop = columnTop,
columnBottom = columnBottom,
edgeThreshold = edgeThreshold,
scrollSpeed = scrollSpeed
)

Box(
modifier = Modifier.onGloballyPositioned { coordinates ->
val bounds = coordinates.boundsInWindow()
columnTop = bounds.top
columnBottom = bounds.bottom
}
) {
LazyVerticalGrid(
columns = columns,
modifier = modifier,
state = state,
contentPadding = contentPadding,
horizontalArrangement = horizontalArrangement,
verticalArrangement = verticalArrangement,
content = content
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package io.writeopia.ui.components

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridScope
import androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.boundsInWindow
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import io.writeopia.ui.draganddrop.target.DragTargetInfo
import io.writeopia.ui.draganddrop.target.LocalDragTargetInfo

@Composable
fun AutoScrollLazyVerticalStaggeredGrid(
columns: StaggeredGridCells,
modifier: Modifier = Modifier,
state: LazyStaggeredGridState = rememberLazyStaggeredGridState(),
contentPadding: PaddingValues = PaddingValues(0.dp),
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
verticalItemSpacing: Dp = 0.dp,
edgeThreshold: Dp = 80.dp,
scrollSpeed: Float = 15f,
content: LazyStaggeredGridScope.() -> Unit
) {
val dragInfo: DragTargetInfo = LocalDragTargetInfo.current

var columnTop by remember { mutableStateOf(0f) }
var columnBottom by remember { mutableStateOf(0f) }

AutoScrollEffect(
dragInfo = dragInfo,
scrollableState = state,
columnTop = columnTop,
columnBottom = columnBottom,
edgeThreshold = edgeThreshold,
scrollSpeed = scrollSpeed
)

Box(
modifier = Modifier.onGloballyPositioned { coordinates ->
val bounds = coordinates.boundsInWindow()
columnTop = bounds.top
columnBottom = bounds.bottom
}
) {
LazyVerticalStaggeredGrid(
columns = columns,
modifier = modifier,
state = state,
contentPadding = contentPadding,
horizontalArrangement = horizontalArrangement,
verticalItemSpacing = verticalItemSpacing,
content = content
)
}
}