diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/component/SettingsItem.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/component/SettingsItem.kt new file mode 100644 index 00000000..21a7cdfb --- /dev/null +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/component/SettingsItem.kt @@ -0,0 +1,111 @@ +package com.sukisu.ultra.ui.component + +import androidx.compose.foundation.LocalIndication +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.selection.toggleable +import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.semantics.Role +import com.dergoogler.mmrl.ui.component.LabelItem +import com.dergoogler.mmrl.ui.component.text.TextRow +import com.sukisu.ultra.ui.theme.CardConfig + +@Composable +fun SwitchItem( + icon: ImageVector? = null, + title: String, + summary: String? = null, + checked: Boolean, + enabled: Boolean = true, + beta: Boolean = false, + onCheckedChange: (Boolean) -> Unit +) { + val interactionSource = remember { MutableInteractionSource() } + val stateAlpha = remember(checked, enabled) { Modifier.alpha(if (enabled) 1f else 0.5f) } + + MaterialTheme( + colorScheme = MaterialTheme.colorScheme.copy( + surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceContainerHigh + ) + ) { + ListItem( + modifier = Modifier + .toggleable( + value = checked, + interactionSource = interactionSource, + role = Role.Switch, + enabled = enabled, + indication = LocalIndication.current, + onValueChange = onCheckedChange + ), + headlineContent = { + TextRow( + leadingContent = if (beta) { + { + LabelItem( + modifier = Modifier.then(stateAlpha), + text = "Beta" + ) + } + } else null + ) { + Text( + modifier = Modifier.then(stateAlpha), + text = title, + ) + } + }, + leadingContent = icon?.let { + { + Icon( + modifier = Modifier.then(stateAlpha), + imageVector = icon, + contentDescription = title + ) + } + }, + trailingContent = { + Switch( + checked = checked, + enabled = enabled, + onCheckedChange = onCheckedChange, + interactionSource = interactionSource + ) + }, + supportingContent = { + if (summary != null) { + Text( + modifier = Modifier.then(stateAlpha), + text = summary + ) + } + } + ) + } +} + +@Composable +fun RadioItem( + title: String, + selected: Boolean, + onClick: () -> Unit, +) { + ListItem( + headlineContent = { + Text(title) + }, + leadingContent = { + RadioButton(selected = selected, onClick = onClick) + } + ) +} \ No newline at end of file diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/component/SwitchItem.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/component/SwitchItem.kt deleted file mode 100644 index ca060855..00000000 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/component/SwitchItem.kt +++ /dev/null @@ -1,117 +0,0 @@ -package com.sukisu.ultra.ui.component - -import androidx.compose.animation.animateColorAsState -import androidx.compose.animation.core.tween -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Icon -import androidx.compose.material3.ListItem -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Switch -import androidx.compose.material3.SwitchDefaults -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import com.sukisu.ultra.ui.theme.CardConfig - -@Composable -fun SwitchItem( - icon: ImageVector? = null, - title: String, - summary: String? = null, - checked: Boolean, - enabled: Boolean = true, - onCheckedChange: (Boolean) -> Unit -) { - // 颜色动画 - val iconTint by animateColorAsState( - targetValue = if (checked) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f), - animationSpec = tween(300), - label = "iconTint" - ) - - // 开关颜色 - val switchColors = SwitchDefaults.colors( - checkedThumbColor = MaterialTheme.colorScheme.primary, - checkedTrackColor = MaterialTheme.colorScheme.primaryContainer, - checkedBorderColor = MaterialTheme.colorScheme.primary, - checkedIconColor = MaterialTheme.colorScheme.onPrimary, - uncheckedThumbColor = MaterialTheme.colorScheme.outline, - uncheckedTrackColor = MaterialTheme.colorScheme.surfaceVariant, - uncheckedBorderColor = MaterialTheme.colorScheme.outline, - uncheckedIconColor = MaterialTheme.colorScheme.surfaceVariant, - disabledCheckedThumbColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f), - disabledCheckedTrackColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f), - disabledCheckedBorderColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f), - disabledCheckedIconColor = MaterialTheme.colorScheme.surfaceVariant, - disabledUncheckedThumbColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f), - disabledUncheckedTrackColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f), - disabledUncheckedBorderColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f), - disabledUncheckedIconColor = MaterialTheme.colorScheme.surfaceVariant - ) - - MaterialTheme( - colorScheme = MaterialTheme.colorScheme.copy( - surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceContainerHigh - ) - ) { - ListItem( - headlineContent = { - Text( - text = title, - style = MaterialTheme.typography.titleMedium, - maxLines = Int.MAX_VALUE, - overflow = TextOverflow.Ellipsis - ) - }, - supportingContent = summary?.let { - { - Column { - Spacer(modifier = Modifier.height(3.dp)) - Text( - text = it, - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - maxLines = Int.MAX_VALUE, - overflow = TextOverflow.Ellipsis - ) - } - } - }, - leadingContent = icon?.let { - { - Icon( - imageVector = it, - contentDescription = null, - modifier = Modifier.size(24.dp), - tint = iconTint - ) - } - }, - trailingContent = { - Switch( - checked = checked, - onCheckedChange = null, - enabled = enabled, - colors = switchColors - ) - }, - modifier = Modifier - .fillMaxWidth() - .clickable(enabled = enabled) { - onCheckedChange(!checked) - } - .padding(vertical = 4.dp) - ) - } -} \ No newline at end of file diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/AppProfile.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/AppProfile.kt index 8227e720..edc9b44b 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/AppProfile.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/AppProfile.kt @@ -288,6 +288,7 @@ private fun AppProfileInner( .padding(horizontal = 16.dp, vertical = 8.dp), shape = MaterialTheme.shapes.medium, colors = cardColors, + elevation = getCardElevation(), ) { ProfileBox(mode, true) { // template mode shouldn't change profile here!