diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt
index 9b9685162..a594b0f3a 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt
+++ b/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(),
+ )
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/res/values-zh-rCN/arrays.xml b/app/src/main/res/values-zh-rCN/arrays.xml
index 7a28e4a96..eaaaeebc3 100644
--- a/app/src/main/res/values-zh-rCN/arrays.xml
+++ b/app/src/main/res/values-zh-rCN/arrays.xml
@@ -107,7 +107,7 @@
- - 正常
+ - 常规
- 粗体
- 细体
diff --git a/app/src/main/res/values-zh-rHK/arrays.xml b/app/src/main/res/values-zh-rHK/arrays.xml
index 683d79dac..9b9576312 100644
--- a/app/src/main/res/values-zh-rHK/arrays.xml
+++ b/app/src/main/res/values-zh-rHK/arrays.xml
@@ -69,7 +69,7 @@
- - 正常
+ - 常規
- 粗體
- 細體
diff --git a/app/src/main/res/values-zh-rTW/arrays.xml b/app/src/main/res/values-zh-rTW/arrays.xml
index 98d383ca9..76abfa9bd 100644
--- a/app/src/main/res/values-zh-rTW/arrays.xml
+++ b/app/src/main/res/values-zh-rTW/arrays.xml
@@ -106,7 +106,7 @@
- - 正常
+ - 常規
- 粗體
- 細體
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index e4ef1edec..6f4e3701d 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -204,7 +204,7 @@
- - Normal
+ - Regular
- Bold
- Light