VancedManager/app/src/main/java/com/vanced/manager/ui/component/ManagerLazyDsl.kt

114 lines
3.8 KiB
Kotlin

package com.vanced.manager.ui.component
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.ScrollableDefaults
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.*
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vanced.manager.ui.util.EdgeToEdgeContentPadding
@Composable
fun ManagerLazyColumn(
modifier: Modifier = Modifier,
state: LazyListState = rememberLazyListState(),
contentPadding: PaddingValues = PaddingValues(
start = EdgeToEdgeContentPadding,
end = EdgeToEdgeContentPadding,
bottom = 8.dp
),
reverseLayout: Boolean = false,
verticalArrangement: Arrangement.Vertical =
Arrangement.spacedBy(8.dp, if (!reverseLayout) Alignment.Top else Alignment.Bottom),
horizontalAlignment: Alignment.Horizontal = Alignment.Start,
flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
content: LazyListScope.() -> Unit
) {
LazyColumn(
modifier = modifier,
state = state,
contentPadding = contentPadding,
reverseLayout = reverseLayout,
verticalArrangement = verticalArrangement,
horizontalAlignment = horizontalAlignment,
flingBehavior = flingBehavior,
content = content
)
}
@Composable
fun ManagerLazyRow(
modifier: Modifier = Modifier,
state: LazyListState = rememberLazyListState(),
contentPadding: PaddingValues = PaddingValues(
start = EdgeToEdgeContentPadding,
end = EdgeToEdgeContentPadding,
),
reverseLayout: Boolean = false,
horizontalArrangement: Arrangement.Horizontal =
Arrangement.spacedBy(8.dp, if (!reverseLayout) Alignment.Start else Alignment.End),
verticalAlignment: Alignment.Vertical = Alignment.Top,
flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
content: LazyListScope.() -> Unit
) {
LazyRow(
modifier = modifier,
state = state,
contentPadding = contentPadding,
reverseLayout = reverseLayout,
horizontalArrangement = horizontalArrangement,
verticalAlignment = verticalAlignment,
flingBehavior = flingBehavior,
content = content
)
}
inline fun LazyListScope.managerCategory(
crossinline categoryName: @Composable () -> String,
content: LazyListScope.() -> Unit
) {
item {
ManagerText(
modifier = Modifier
.padding(
start = 8.dp,
top = 4.dp
),
text = categoryName(),
textStyle = MaterialTheme.typography.headlineSmall,
)
}
content()
}
inline fun <K, V> LazyListScope.items(
items: Map<K, V>,
noinline key: ((key: K, value: V) -> Any)? = null,
crossinline itemContent: @Composable LazyItemScope.(key: K, value: V) -> Unit
) = items(
count = items.size,
key = if (key != null) { index ->
key(items.keys.elementAt(index), items.values.elementAt(index))
} else null
) { index ->
itemContent(items.keys.elementAt(index), items.values.elementAt(index))
}
inline fun <K, V> LazyListScope.itemsIndexed(
items: Map<K, V>,
noinline key: ((index: Int, key: K, value: V) -> Any)? = null,
crossinline itemContent: @Composable LazyItemScope.(index: Int, key: K, value: V) -> Unit
) = items(
count = items.size,
key = if (key != null) { index ->
key(index, items.keys.elementAt(index), items.values.elementAt(index))
} else null
) { index ->
itemContent(index, items.keys.elementAt(index), items.values.elementAt(index))
}