diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceGroup.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceGroup.kt index 6581fce231..62a7ac3440 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceGroup.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceGroup.kt @@ -96,13 +96,33 @@ fun PreferenceGroupPositionAware( modifier = modifier, ) { PreferenceGroupHeading(heading) + + val scope = PreferenceGroupScopeImpl() + scope.content() + Column( modifier = Modifier.padding(horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(itemSpacing), ) { - val scope = PreferenceGroupScopeImpl() - scope.content() - scope.Render() + val items = scope.items + val count = items.size + + items.forEachIndexed { index, itemData -> + androidx.compose.runtime.key(itemData.key ?: index) { + val position = PreferenceGroupItemPosition( + isFirst = index == 0, + isLast = index == count - 1, + ) + + Surface( + modifier = Modifier.fillMaxWidth(), + shape = preferenceGroupItemShape(position), + color = preferenceGroupColor(), + ) { + itemData.content(position) + } + } + } } PreferenceGroupDescription(description = description, showDescription = showDescription) } @@ -115,33 +135,19 @@ interface PreferenceGroupScope { ) } +private data class PreferenceGroupItemData( + val key: Any?, + val content: @Composable (position: PreferenceGroupItemPosition) -> Unit, +) + private class PreferenceGroupScopeImpl : PreferenceGroupScope { - private val items = mutableListOf<@Composable (position: PreferenceGroupItemPosition) -> Unit>() + val items = mutableListOf() override fun item( key: Any?, content: @Composable (position: PreferenceGroupItemPosition) -> Unit, ) { - items.add(content) - } - - @Suppress("ktlint:compose:modifier-missing-check") - @Composable - fun Render() { - val count = items.size - items.forEachIndexed { index, item -> - val position = PreferenceGroupItemPosition( - isFirst = index == 0, - isLast = index == count - 1, - ) - Surface( - modifier = Modifier.fillMaxWidth(), - shape = preferenceGroupItemShape(position), - color = preferenceGroupColor(), - ) { - item(position) - } - } + items.add(PreferenceGroupItemData(key, content)) } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceStackedCardGroup.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceStackedCardGroup.kt deleted file mode 100644 index 9e8b69ef0d..0000000000 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceStackedCardGroup.kt +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025, Lawnchair - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package app.lawnchair.ui.preferences.components.layout - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Surface -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import app.lawnchair.ui.theme.preferenceGroupColor - -/** - * A PreferenceGroup variant that renders each child as a visually stacked card with: - * - First item: large top corners, small bottom corners - * - Middle items: small corners all around - * - Last item: small top corners, large bottom corners - * - * Use PreferenceStackedCardItem inside this group. - */ -@Composable -fun PreferenceStackedCardGroup( - modifier: Modifier = Modifier, - heading: String? = null, - description: String? = null, - showDescription: Boolean = true, - itemSpacing: Dp = 4.dp, - content: @Composable PreferenceStackedCardScope.() -> Unit, -) { - Column( - modifier = modifier, - ) { - PreferenceGroupHeading(heading) - Column( - modifier = Modifier.padding(horizontal = 16.dp), - verticalArrangement = Arrangement.spacedBy(itemSpacing), - ) { - val scope = PreferenceStackedCardScopeImpl() - scope.content() - } - PreferenceGroupDescription(description = description, showDescription = showDescription) - } -} - -interface PreferenceStackedCardScope { - @Composable - fun PreferenceStackedCardItem( - modifier: Modifier = Modifier, - isFirst: Boolean = false, - isLast: Boolean = false, - content: @Composable () -> Unit, - ) -} - -private class PreferenceStackedCardScopeImpl : PreferenceStackedCardScope { - @Composable - override fun PreferenceStackedCardItem( - modifier: Modifier, - isFirst: Boolean, - isLast: Boolean, - content: @Composable () -> Unit, - ) { - val largeCorner = 24.dp - val smallCorner = 4.dp - - val topCorner = if (isFirst) largeCorner else smallCorner - val bottomCorner = if (isLast) largeCorner else smallCorner - - val shape = RoundedCornerShape( - topStart = topCorner, - topEnd = topCorner, - bottomStart = bottomCorner, - bottomEnd = bottomCorner, - ) - - Surface( - modifier = modifier.fillMaxWidth(), - shape = shape, - color = preferenceGroupColor(), - ) { - content() - } - } -}