Bladeren bron

refactor: 提取可复用书源编辑与调试组件

HapeLee 3 maanden geleden
bovenliggende
commit
9bff37232d

+ 31 - 15
app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditScreen.kt

@@ -42,6 +42,7 @@ import io.legado.app.ui.widget.components.AppFloatingActionButton
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.card.GlassCard
+import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcons
 import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu
@@ -153,7 +154,7 @@ fun BookSourceEditScreen(
                     key = { it.path },
                     contentType = { "field" },
                 ) { field ->
-                    BookSourceFieldCard(
+                    SourceEditFieldCard(
                         field = field,
                         modifier = Modifier.fillMaxWidth(),
                         onClick = { editingFieldPath = field.path },
@@ -162,7 +163,7 @@ fun BookSourceEditScreen(
             }
         }
     }
-    BookSourceFieldEditSheet(
+    SourceEditFieldSheet(
         field = editingField,
         onDismissRequest = { editingFieldPath = null },
         onValueChange = { path, value ->
@@ -172,7 +173,7 @@ fun BookSourceEditScreen(
 }
 
 @Composable
-private fun BookSourceFieldCard(
+fun SourceEditFieldCard(
     field: BookSourceEditFieldUi,
     modifier: Modifier = Modifier,
     onClick: () -> Unit,
@@ -199,7 +200,7 @@ private fun BookSourceFieldCard(
 }
 
 @Composable
-private fun BookSourceFieldEditSheet(
+fun SourceEditFieldSheet(
     field: BookSourceEditFieldUi?,
     onDismissRequest: () -> Unit,
     onValueChange: (String, String) -> Unit,
@@ -242,7 +243,7 @@ private fun BookSourceOptions(
     Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
         Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
             Box(modifier = Modifier.weight(1f)) {
-                BookSourceOptionCard(
+                SourceEditOptionCard(
                     title = stringResource(R.string.book_type),
                     subtitle = sourceTypes.getOrNull(state.bookSourceType),
                     onClick = { typeMenuExpanded = true },
@@ -263,13 +264,13 @@ private fun BookSourceOptions(
                     }
                 }
             }
-            BookSourceOptionCard(
+            SourceEditOptionCard(
                 title = stringResource(R.string.is_enable),
                 checked = state.enabled,
                 modifier = Modifier.weight(1f),
                 onClick = { onIntent(BookSourceEditIntent.SetEnabled(!state.enabled)) },
             )
-            BookSourceOptionCard(
+            SourceEditOptionCard(
                 title = stringResource(R.string.discovery),
                 checked = state.enabledExplore,
                 modifier = Modifier.weight(1f),
@@ -277,19 +278,19 @@ private fun BookSourceOptions(
             )
         }
         Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
-            BookSourceOptionCard(
+            SourceEditOptionCard(
                 title = stringResource(R.string.auto_save_cookie),
                 checked = state.enabledCookieJar,
                 modifier = Modifier.weight(1f),
                 onClick = { onIntent(BookSourceEditIntent.SetCookieJarEnabled(!state.enabledCookieJar)) },
             )
-            BookSourceOptionCard(
+            SourceEditOptionCard(
                 title = stringResource(R.string.is_event_listener),
                 checked = state.eventListener,
                 modifier = Modifier.weight(1f),
                 onClick = { onIntent(BookSourceEditIntent.SetEventListener(!state.eventListener)) },
             )
-            BookSourceOptionCard(
+            SourceEditOptionCard(
                 title = stringResource(R.string.custom_button),
                 checked = state.customButton,
                 modifier = Modifier.weight(1f),
@@ -300,34 +301,49 @@ private fun BookSourceOptions(
 }
 
 @Composable
-private fun BookSourceOptionCard(
+fun SourceEditOptionCard(
     title: String,
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
     subtitle: String? = null,
     checked: Boolean? = null,
 ) {
-    GlassCard(modifier = modifier, onClick = onClick) {
+    GlassCard(
+        modifier = modifier,
+        onClick = onClick
+    ) {
         Row(
-            modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp),
+            modifier = Modifier.padding(start = 12.dp, end = 4.dp),
             horizontalArrangement = Arrangement.SpaceBetween,
             verticalAlignment = Alignment.CenterVertically
         ) {
             AppText(
-                text = subtitle?.let { "$title $it" } ?: title,
+                text = title,
                 maxLines = 1,
                 modifier = Modifier
                     .weight(1f)
+                    .padding(vertical = 8.dp)
                     .basicMarquee(),
                 style = LegadoTheme.typography.labelSmall,
             )
+            AnimatedVisibility(
+                visible = !subtitle.isNullOrBlank()
+            ) {
+                TextCard(
+                    text = subtitle,
+                    backgroundColor = LegadoTheme.colorScheme.surface,
+                    cornerRadius = 16.dp
+                )
+            }
             AnimatedVisibility(
                 visible = checked == true
             ) {
                 AppIcon(
                     imageVector = AppIcons.Check,
                     contentDescription = null,
-                    modifier = Modifier.size(16.dp),
+                    modifier = Modifier
+                        .padding(end = 8.dp)
+                        .size(16.dp),
                     tint = LegadoTheme.colorScheme.primary,
                 )
             }

+ 39 - 28
app/src/main/java/io/legado/app/ui/widget/components/button/ToggleChip.kt

@@ -1,12 +1,16 @@
 package io.legado.app.ui.widget.components.button
 
 import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Check
 import androidx.compose.material3.FilterChip
@@ -16,6 +20,7 @@ import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.role
 import androidx.compose.ui.semantics.semantics
@@ -26,6 +31,7 @@ import androidx.compose.ui.unit.dp
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme.composeEngine
 import io.legado.app.ui.theme.ThemeResolver
+import io.legado.app.ui.widget.components.card.NormalCard
 import top.yukonga.miuix.kmp.basic.Icon as MiuixIcon
 import top.yukonga.miuix.kmp.basic.IconButton as MiuixIconButton
 import top.yukonga.miuix.kmp.basic.Text as MiuixText
@@ -40,47 +46,52 @@ fun ToggleChip(
     checkedContentDescription: String = "已选择",
     uncheckedContentDescription: String = "未选择"
 ) {
-    val isSelected = selected
     if (ThemeResolver.isMiuixEngine(composeEngine)) {
-        MiuixIconButton(
+        NormalCard (
+            modifier = modifier
+                .padding(vertical = 2.dp)
+                .semantics {
+                    toggleableState = if (selected) {
+                        ToggleableState.On
+                    } else {
+                        ToggleableState.Off
+                    }
+                    stateDescription = if (selected) {
+                        checkedContentDescription
+                    } else {
+                        uncheckedContentDescription
+                    }
+                },
+            cornerRadius = 12.dp,
             onClick = onToggle,
-            modifier = modifier.semantics {
-                role = Role.Checkbox
-                toggleableState = if (isSelected) {
-                    ToggleableState.On
-                } else {
-                    ToggleableState.Off
-                }
-                stateDescription = if (isSelected) {
-                    checkedContentDescription
-                } else {
-                    uncheckedContentDescription
-                }
-            },
-            backgroundColor = if (selected) {
-                MiuixTheme.colorScheme.primaryContainer
+            containerColor = if (selected) {
+                MiuixTheme.colorScheme.secondaryContainer
             } else {
                 MiuixTheme.colorScheme.surfaceContainer
             }
         ) {
             Row(
+                modifier = Modifier
+                    .padding(horizontal = 12.dp),
                 verticalAlignment = Alignment.CenterVertically,
                 horizontalArrangement = Arrangement.Center,
-                modifier = Modifier.padding(horizontal = 12.dp, vertical = 6.dp)
             ) {
-                AnimatedVisibility(visible = selected) {
-                    Row(verticalAlignment = Alignment.CenterVertically) {
-                        MiuixIcon(
-                            imageVector = Icons.Default.Check,
-                            contentDescription = checkedContentDescription,
-                            modifier = Modifier.size(18.dp),
-                            tint = if (selected) MiuixTheme.colorScheme.onPrimary else MiuixTheme.colorScheme.onSurface
-                        )
-                        Spacer(Modifier.width(6.dp))
-                    }
+                AnimatedVisibility(
+                    visible = selected
+                ) {
+                    MiuixIcon(
+                        imageVector = Icons.Default.Check,
+                        contentDescription = checkedContentDescription,
+                        modifier = Modifier
+                            .padding(end = 8.dp)
+                            .size(16.dp),
+                        tint = if (selected) MiuixTheme.colorScheme.primary else MiuixTheme.colorScheme.onSurface
+                    )
                 }
 
                 MiuixText(
+                    modifier = Modifier
+                        .padding(vertical = 8.dp),
                     text = label,
                     style = LegadoTheme.typography.labelMediumEmphasized,
                     maxLines = 1,