11/*
2- * Copyright 2021 André Claßen
2+ * Copyright 2022 André Claßen
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1515 */
1616package org.burnoutcrew.android.ui.reorderlist
1717
18-
18+ import androidx.compose.animation.core.animateDpAsState
1919import androidx.compose.foundation.background
20+ import androidx.compose.foundation.layout.Arrangement
2021import androidx.compose.foundation.layout.Box
2122import androidx.compose.foundation.layout.Column
23+ import androidx.compose.foundation.layout.PaddingValues
2224import androidx.compose.foundation.layout.aspectRatio
2325import androidx.compose.foundation.layout.height
2426import androidx.compose.foundation.layout.padding
@@ -32,85 +34,96 @@ import androidx.compose.material.Text
3234import androidx.compose.runtime.Composable
3335import androidx.compose.ui.Alignment
3436import androidx.compose.ui.Modifier
37+ import androidx.compose.ui.draw.shadow
3538import androidx.compose.ui.unit.dp
3639import androidx.lifecycle.viewmodel.compose.viewModel
37- import org.burnoutcrew.reorderable.ItemPosition
40+ import org.burnoutcrew.reorderable.ReorderableItem
3841import org.burnoutcrew.reorderable.detectReorderAfterLongPress
39- import org.burnoutcrew.reorderable.draggedItem
4042import org.burnoutcrew.reorderable.rememberReorderableLazyGridState
4143import org.burnoutcrew.reorderable.reorderable
4244
43-
4445@Composable
4546fun ReorderGrid (vm : ReorderListViewModel = viewModel()) {
4647 Column {
4748 HorizontalGrid (
48- items = vm.cats,
49- modifier = Modifier .padding(vertical = 16 .dp),
50- onMove = { from, to -> vm.moveCat(from, to) },
51- )
52- VerticalGrid (
53- items = vm.dogs,
54- onMove = { from, to -> vm.moveDog(from, to) },
55- canDragOver = { vm.isDogDragEnabled(it) },
49+ vm = vm,
50+ modifier = Modifier .padding(vertical = 16 .dp)
5651 )
52+ VerticalGrid (vm = vm)
5753 }
5854}
5955
60-
6156@Composable
6257private fun HorizontalGrid (
58+ vm : ReorderListViewModel ,
6359 modifier : Modifier = Modifier ,
64- items : List <ItemData >,
65- onMove : (fromPos: ItemPosition , toPos: ItemPosition ) -> (Unit ),
6660) {
67- val state = rememberReorderableLazyGridState(onMove = onMove )
61+ val state = rememberReorderableLazyGridState(onMove = vm::moveCat )
6862 LazyHorizontalGrid (
6963 rows = GridCells .Fixed (2 ),
7064 state = state.gridState,
65+ contentPadding = PaddingValues (horizontal = 8 .dp),
66+ verticalArrangement = Arrangement .spacedBy(4 .dp),
67+ horizontalArrangement = Arrangement .spacedBy(4 .dp),
7168 modifier = modifier.reorderable(state).height(200 .dp)
7269 ) {
73- items(items, { it.key }) { item ->
74- Box (
75- contentAlignment = Alignment .Center ,
76- modifier = Modifier
77- .aspectRatio(1f )
78- .padding(4 .dp)
79- .draggedItem(offset = state.offsetByKey(item.key))
80- .background(MaterialTheme .colors.secondary)
81- .detectReorderAfterLongPress(state)
82- ) {
83- Text (item.title)
70+ items(vm.cats, { it.key }) { item ->
71+ ReorderableItem (state, item.key) { isDragging ->
72+ val elevation = animateDpAsState(if (isDragging) 16 .dp else 0 .dp)
73+ Box (
74+ contentAlignment = Alignment .Center ,
75+ modifier = Modifier
76+ .shadow(elevation.value)
77+ .aspectRatio(1f )
78+ .background(MaterialTheme .colors.secondary)
79+ .detectReorderAfterLongPress(state)
80+ ) {
81+ Text (item.title)
82+ }
8483 }
8584 }
8685 }
8786}
8887
8988@Composable
9089private fun VerticalGrid (
90+ vm : ReorderListViewModel ,
9191 modifier : Modifier = Modifier ,
92- items : List <ItemData >,
93- onMove : (fromPos: ItemPosition , toPos: ItemPosition ) -> (Unit ),
94- canDragOver : ((pos: ItemPosition ) -> Boolean ),
9592) {
96- val state = rememberReorderableLazyGridState(onMove = onMove , canDragOver = canDragOver )
93+ val state = rememberReorderableLazyGridState(onMove = vm::moveDog , canDragOver = vm::isDogDragEnabled )
9794 LazyVerticalGrid (
9895 columns = GridCells .Fixed (4 ),
9996 state = state.gridState,
97+ contentPadding = PaddingValues (horizontal = 8 .dp),
98+ verticalArrangement = Arrangement .spacedBy(4 .dp),
99+ horizontalArrangement = Arrangement .spacedBy(4 .dp),
100100 modifier = modifier.reorderable(state)
101101 ) {
102- items(items, { it.key }) { item ->
103- Box (
104- contentAlignment = Alignment .Center ,
105- modifier = Modifier
106- .size(100 .dp)
107- .padding(4 .dp)
108- .draggedItem(state.offsetByKey(item.key))
109- .background(MaterialTheme .colors.primary)
110- .detectReorderAfterLongPress(state)
111- ) {
112- Text (item.title)
102+ items(vm.dogs, { it.key }) { item ->
103+ ReorderableItem (state, item.key) { isDragging ->
104+ val elevation = animateDpAsState(if (isDragging) 8 .dp else 0 .dp)
105+ if (item.isLocked) {
106+ Box (
107+ contentAlignment = Alignment .Center ,
108+ modifier = Modifier
109+ .size(100 .dp)
110+ .background(MaterialTheme .colors.surface)
111+ ) {
112+ Text (item.title)
113+ }
114+ } else {
115+ Box (
116+ contentAlignment = Alignment .Center ,
117+ modifier = Modifier
118+ .shadow(elevation.value)
119+ .aspectRatio(1f )
120+ .background(MaterialTheme .colors.primary)
121+ .detectReorderAfterLongPress(state)
122+ ) {
123+ Text (item.title)
124+ }
125+ }
113126 }
114127 }
115128 }
116- }
129+ }
0 commit comments