Browse Source

fix: 添加预设字体粗细控制

HapeLee 4 months ago
parent
commit
b60c025473

+ 121 - 22
app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt

@@ -1,11 +1,16 @@
 package io.legado.app.ui.book.read.sheet
 
+import androidx.compose.animation.AnimatedVisibility
 import androidx.compose.animation.core.FastOutSlowInEasing
 import androidx.compose.animation.core.tween
 import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.aspectRatio
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
@@ -15,13 +20,12 @@ import androidx.compose.foundation.pager.rememberPagerState
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.FormatBold
 import androidx.compose.material.icons.filled.FormatItalic
 import androidx.compose.material.icons.filled.FormatUnderlined
 import androidx.compose.material.icons.filled.Layers
 import androidx.compose.material.icons.filled.TextFields
-import androidx.compose.material.icons.filled.TextFormat
 import androidx.compose.material.icons.filled.Tune
+import androidx.compose.material3.Icon
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
@@ -45,9 +49,12 @@ import io.legado.app.help.config.ReadBookConfig
 import io.legado.app.ui.book.read.ConfigUpdate
 import io.legado.app.ui.book.read.ReadBookIntent
 import io.legado.app.ui.config.readConfig.ReadConfig
+import io.legado.app.ui.theme.LegadoTheme
+import io.legado.app.ui.widget.components.AppSlider
 import io.legado.app.ui.widget.components.AppTextField
 import io.legado.app.ui.widget.components.SectionTitle
 import io.legado.app.ui.widget.components.alert.AppAlertDialog
+import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.dialog.ColorPickerSheet
 import io.legado.app.ui.widget.components.pager.rememberPagerFlingPassThroughConnection
 import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem
@@ -281,14 +288,11 @@ internal fun TextEffectsPage(
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextItalic(it)))
             },
         )
-        TinySliderSettingItem(
-            title = stringResource(R.string.font_weight_text),
-            value = textBold.coerceAtLeast(100).toFloat(),
-            valueRange = 100f..900f,
-            imageVector = Icons.Default.FormatBold,
+        FontWeightSetting(
+            value = textBold,
             onValueChange = { value ->
-                textBold = value.toInt()
-                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextBold(value.toInt())))
+                textBold = value
+                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextBold(value)))
             },
         )
 
@@ -400,12 +404,6 @@ internal fun TitleSettingsPage(
     var colorPickerId by remember { mutableIntStateOf(0) }
     var colorPickerInitial by remember { mutableIntStateOf(0) }
 
-    val weightIconMap = mapOf(
-        0 to Icons.Default.TextFields,
-        1 to Icons.Default.TextFormat,
-        2 to Icons.Default.FormatBold,
-    )
-
     Column(
         modifier = modifier
             .fillMaxWidth()
@@ -429,14 +427,11 @@ internal fun TitleSettingsPage(
 
         Spacer(Modifier.height(8.dp))
 
-        TinySliderSettingItem(
-            title = stringResource(R.string.font_weight_text),
-            value = titleBold.coerceAtLeast(100).toFloat(),
-            valueRange = 100f..900f,
-            imageVector = weightIconMap[titleBold] ?: Icons.Default.FormatBold,
+        FontWeightSetting(
+            value = titleBold,
             onValueChange = { value ->
-                titleBold = value.toInt()
-                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBold(value.toInt())))
+                titleBold = value
+                onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBold(value)))
             },
         )
 
@@ -605,3 +600,107 @@ internal fun TitleSettingsPage(
         },
     )
 }
+
+@Composable
+private fun FontWeightSetting(
+    value: Int,
+    onValueChange: (Int) -> Unit,
+) {
+    var showVariableWeight by remember { mutableStateOf(false) }
+    var sliderValue by remember(value) {
+        mutableFloatStateOf(
+            when (value) {
+                2 -> 300f
+                0 -> 400f
+                1 -> 900f
+                else -> value.coerceIn(100, 900).toFloat()
+            }
+        )
+    }
+    val weightEntries = stringArrayResource(R.array.text_font_weight)
+    val presetValue = when (value) {
+        2 -> 2
+        1 -> 1
+        0 -> 0
+        in 100..350 -> 2
+        in 650..900 -> 1
+        else -> 0
+    }
+
+    Column {
+        Row(
+            modifier = Modifier.fillMaxWidth(),
+            horizontalArrangement = Arrangement.spacedBy(8.dp),
+        ) {
+            Box(modifier = Modifier.weight(1f)) {
+                TinyDropdownSettingItem(
+                    title = stringResource(R.string.font_weight_text),
+                    selectedValue = presetValue.toString(),
+                    displayEntries = arrayOf(
+                        weightEntries[2],
+                        weightEntries[0],
+                        weightEntries[1],
+                    ),
+                    entryValues = arrayOf("2", "0", "1"),
+                    onValueChange = { onValueChange(it.toInt()) },
+                )
+            }
+            NormalCard(
+                onClick = { showVariableWeight = !showVariableWeight },
+                modifier = Modifier
+                    .padding(bottom = 4.dp)
+                    .height(56.dp)
+                    .aspectRatio(1f),
+                containerColor = if (showVariableWeight) {
+                    LegadoTheme.colorScheme.secondaryContainer
+                } else {
+                    LegadoTheme.colorScheme.surfaceContainerLow
+                },
+                contentColor = if (showVariableWeight) {
+                    LegadoTheme.colorScheme.onSecondaryContainer
+                } else {
+                    LegadoTheme.colorScheme.onSurfaceVariant
+                },
+                cornerRadius = 12.dp,
+            ) {
+                Box(
+                    modifier = Modifier.fillMaxSize(),
+                    contentAlignment = Alignment.Center,
+                ) {
+                    Icon(
+                        imageVector = Icons.Default.Tune,
+                        contentDescription = stringResource(R.string.font_weight_text),
+                    )
+                }
+            }
+        }
+
+        AnimatedVisibility(visible = showVariableWeight) {
+            NormalCard(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .padding(bottom = 4.dp)
+                    .height(56.dp),
+                containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
+                cornerRadius = 12.dp,
+            ) {
+                Box(
+                    modifier = Modifier
+                        .fillMaxSize()
+                        .padding(horizontal = 12.dp),
+                    contentAlignment = Alignment.Center,
+                ) {
+                    AppSlider(
+                        value = sliderValue,
+                        onValueChange = { sliderValue = it },
+                        onValueChangeFinished = {
+                            onValueChange(sliderValue.toInt())
+                        },
+                        valueRange = 100f..900f,
+                        modifier = Modifier.fillMaxWidth(),
+                    )
+                }
+            }
+        }
+    }
+}

+ 1 - 1
app/src/main/res/values-zh-rCN/arrays.xml

@@ -107,7 +107,7 @@
     </string-array>
 
     <string-array name="text_font_weight">
-        <item>正常</item>
+        <item>常规</item>
         <item>粗体</item>
         <item>细体</item>
     </string-array>

+ 1 - 1
app/src/main/res/values-zh-rHK/arrays.xml

@@ -69,7 +69,7 @@
     </string-array>
 
     <string-array name="text_font_weight">
-        <item>正常</item>
+        <item>常規</item>
         <item>粗體</item>
         <item>細體</item>
     </string-array>

+ 1 - 1
app/src/main/res/values-zh-rTW/arrays.xml

@@ -106,7 +106,7 @@
     </string-array>
 
     <string-array name="text_font_weight">
-        <item>正常</item>
+        <item>常規</item>
         <item>粗體</item>
         <item>細體</item>
     </string-array>

+ 1 - 1
app/src/main/res/values/arrays.xml

@@ -204,7 +204,7 @@
 	</string-array>
 
 	<string-array name="text_font_weight">
-		<item>Normal</item>
+		<item>Regular</item>
 		<item>Bold</item>
 		<item>Light</item>
 	</string-array>