1+ import androidx.compose.animation.core.animateDpAsState
2+ import androidx.compose.foundation.Image
3+ import androidx.compose.foundation.VerticalScrollbar
4+ import androidx.compose.foundation.background
5+ import androidx.compose.foundation.layout.*
6+ import androidx.compose.foundation.lazy.LazyColumn
7+ import androidx.compose.foundation.lazy.items
8+ import androidx.compose.foundation.rememberScrollbarAdapter
9+ import androidx.compose.material.Divider
10+ import androidx.compose.material.MaterialTheme
11+ import androidx.compose.material.Text
12+ import androidx.compose.material.icons.Icons
13+ import androidx.compose.material.icons.filled.Menu
14+ import androidx.compose.runtime.Composable
15+ import androidx.compose.runtime.mutableStateOf
16+ import androidx.compose.runtime.remember
17+ import androidx.compose.ui.Alignment
18+ import androidx.compose.ui.Modifier
19+ import androidx.compose.ui.draw.shadow
20+ import androidx.compose.ui.unit.dp
21+ import org.burnoutcrew.reorderable.ReorderableItem
22+ import org.burnoutcrew.reorderable.detectReorder
23+ import org.burnoutcrew.reorderable.rememberReorderableLazyListState
24+ import org.burnoutcrew.reorderable.reorderable
25+ import org.jetbrains.skiko.wasm.onWasmReady
26+
27+ fun main () {
28+ onWasmReady {
29+ BrowserViewportWindow (" ComposeReorderableDemo" ) {
30+ MaterialTheme {
31+ Box (modifier = Modifier .fillMaxSize()) {
32+ VerticalReorderList ()
33+ }
34+ }
35+ }
36+ }
37+ }
38+
39+
40+ @Composable
41+ fun VerticalReorderList () {
42+ val items = remember { mutableStateOf(List (100 ) { it }) }
43+ val state = rememberReorderableLazyListState(onMove = { from, to ->
44+ items.value = items.value.toMutableList().apply {
45+ add(to.index, removeAt(from.index))
46+ }
47+ })
48+ Box {
49+ LazyColumn (
50+ state = state.listState,
51+ modifier = Modifier .reorderable(state)
52+ ) {
53+ items(items.value, { it }) { item ->
54+ ReorderableItem (state, orientationLocked = false , key = item) { isDragging ->
55+ val elevation = animateDpAsState(if (isDragging) 8 .dp else 0 .dp)
56+ Column (
57+ modifier = Modifier
58+ .shadow(elevation.value)
59+ .background(MaterialTheme .colors.surface)
60+ ) {
61+ Row (
62+ verticalAlignment = Alignment .CenterVertically ,
63+ modifier = Modifier .padding(16 .dp)
64+ ) {
65+ Image (
66+ imageVector = Icons .Filled .Menu ,
67+ contentDescription = " " ,
68+ modifier = Modifier .detectReorder(state)
69+ )
70+ Text (
71+ text = item.toString(),
72+ modifier = Modifier .padding(start = 8 .dp)
73+ )
74+ }
75+ Divider ()
76+ }
77+ }
78+ }
79+ }
80+ VerticalScrollbar (
81+ modifier = Modifier .align(Alignment .CenterEnd )
82+ .fillMaxHeight(),
83+ adapter = rememberScrollbarAdapter(state.listState)
84+ )
85+ }
86+ }
0 commit comments