From bdb7fa6aa8db06c906b2b404d1ed1a6947983b6c Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Thu, 22 Jun 2023 02:11:29 -0700 Subject: [PATCH] Add onDrop event --- .../frost/compose/draggable/DraggableState.kt | 20 +++++++++++++------ .../frost/tabselector/TabSelectorScreen.kt | 11 ++++++++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/app-compose/src/main/kotlin/com/pitchedapps/frost/compose/draggable/DraggableState.kt b/app-compose/src/main/kotlin/com/pitchedapps/frost/compose/draggable/DraggableState.kt index a3f3db4b4..b04f79795 100644 --- a/app-compose/src/main/kotlin/com/pitchedapps/frost/compose/draggable/DraggableState.kt +++ b/app-compose/src/main/kotlin/com/pitchedapps/frost/compose/draggable/DraggableState.kt @@ -27,12 +27,16 @@ import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Rect import androidx.compose.ui.unit.IntSize -@Composable -fun rememberDraggableState(): DraggableState { - return remember { DraggableStateImpl() } +typealias DraggableComposeContent = @Composable (isDragging: Boolean) -> Unit + +fun interface OnDrop { + fun onDrop(dragTarget: String, dragData: T, dropTarget: String) } -typealias DraggableComposeContent = @Composable (isDragging: Boolean) -> Unit +@Composable +fun rememberDraggableState(onDrop: OnDrop): DraggableState { + return remember(onDrop) { DraggableStateImpl(onDrop) } +} interface DraggableState { @@ -58,7 +62,7 @@ interface DraggableState { @Composable fun rememberDropTarget(key: String): DropTargetState } -class DraggableStateImpl : DraggableState { +class DraggableStateImpl(private val onDrop: OnDrop) : DraggableState { private val activeDragTargets = mutableStateMapOf>() private val dropTargets = mutableStateMapOf>() @@ -79,9 +83,13 @@ class DraggableStateImpl : DraggableState { } override fun onDragEnd(key: String) { - activeDragTargets.remove(key) + val dragTarget = activeDragTargets.remove(key) for ((dropKey, dropTarget) in dropTargets) { if (dropTarget.hoverKey == key) { + if (dragTarget != null) { + onDrop.onDrop(dragTarget = key, dragData = dragTarget.data, dropTarget = dropKey) + } + setHover(dragKey = null, dropKey) // Check other drag targets in case one meets drag requirements checkForDrop(dropKey) diff --git a/app-compose/src/main/kotlin/com/pitchedapps/frost/tabselector/TabSelectorScreen.kt b/app-compose/src/main/kotlin/com/pitchedapps/frost/tabselector/TabSelectorScreen.kt index 7a0ce7b1d..8855c5258 100644 --- a/app-compose/src/main/kotlin/com/pitchedapps/frost/tabselector/TabSelectorScreen.kt +++ b/app-compose/src/main/kotlin/com/pitchedapps/frost/tabselector/TabSelectorScreen.kt @@ -100,7 +100,14 @@ fun TabSelector( unselected: List, onSelect: (List) -> Unit ) { - val draggableState = rememberDraggableState() + val draggableState = + rememberDraggableState( + onDrop = { _, dragData, dropTarget -> + onSelect( + selected.map { if (it.key == dropTarget) dragData else it }, + ) + }, + ) DragContainer(modifier = modifier, draggableState = draggableState) { Column(modifier = Modifier.statusBarsPadding()) { @@ -196,7 +203,7 @@ fun DraggingTabItem( transition.animateColor(label = "Background") { if (it) MaterialTheme.colorScheme.surfaceVariant.copy( - LocalRippleTheme.current.rippleAlpha().pressedAlpha + LocalRippleTheme.current.rippleAlpha().pressedAlpha, ) else MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.85f) }