fix: 添加预设字体粗细控制
This commit is contained in:
@@ -1,11 +1,16 @@
|
|||||||
package io.legado.app.ui.book.read.sheet
|
package io.legado.app.ui.book.read.sheet
|
||||||
|
|
||||||
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.animation.core.FastOutSlowInEasing
|
import androidx.compose.animation.core.FastOutSlowInEasing
|
||||||
import androidx.compose.animation.core.tween
|
import androidx.compose.animation.core.tween
|
||||||
import androidx.compose.foundation.gestures.Orientation
|
import androidx.compose.foundation.gestures.Orientation
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
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.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.layout.padding
|
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.rememberScrollState
|
||||||
import androidx.compose.foundation.verticalScroll
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
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.FormatItalic
|
||||||
import androidx.compose.material.icons.filled.FormatUnderlined
|
import androidx.compose.material.icons.filled.FormatUnderlined
|
||||||
import androidx.compose.material.icons.filled.Layers
|
import androidx.compose.material.icons.filled.Layers
|
||||||
import androidx.compose.material.icons.filled.TextFields
|
import androidx.compose.material.icons.filled.TextFields
|
||||||
import androidx.compose.material.icons.filled.TextFormat
|
|
||||||
import androidx.compose.material.icons.filled.Tune
|
import androidx.compose.material.icons.filled.Tune
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
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.ConfigUpdate
|
||||||
import io.legado.app.ui.book.read.ReadBookIntent
|
import io.legado.app.ui.book.read.ReadBookIntent
|
||||||
import io.legado.app.ui.config.readConfig.ReadConfig
|
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.AppTextField
|
||||||
import io.legado.app.ui.widget.components.SectionTitle
|
import io.legado.app.ui.widget.components.SectionTitle
|
||||||
import io.legado.app.ui.widget.components.alert.AppAlertDialog
|
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.dialog.ColorPickerSheet
|
||||||
import io.legado.app.ui.widget.components.pager.rememberPagerFlingPassThroughConnection
|
import io.legado.app.ui.widget.components.pager.rememberPagerFlingPassThroughConnection
|
||||||
import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem
|
import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem
|
||||||
@@ -281,14 +288,11 @@ internal fun TextEffectsPage(
|
|||||||
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextItalic(it)))
|
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextItalic(it)))
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
TinySliderSettingItem(
|
FontWeightSetting(
|
||||||
title = stringResource(R.string.font_weight_text),
|
value = textBold,
|
||||||
value = textBold.coerceAtLeast(100).toFloat(),
|
|
||||||
valueRange = 100f..900f,
|
|
||||||
imageVector = Icons.Default.FormatBold,
|
|
||||||
onValueChange = { value ->
|
onValueChange = { value ->
|
||||||
textBold = value.toInt()
|
textBold = value
|
||||||
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextBold(value.toInt())))
|
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TextBold(value)))
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -400,12 +404,6 @@ internal fun TitleSettingsPage(
|
|||||||
var colorPickerId by remember { mutableIntStateOf(0) }
|
var colorPickerId by remember { mutableIntStateOf(0) }
|
||||||
var colorPickerInitial 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(
|
Column(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
@@ -429,14 +427,11 @@ internal fun TitleSettingsPage(
|
|||||||
|
|
||||||
Spacer(Modifier.height(8.dp))
|
Spacer(Modifier.height(8.dp))
|
||||||
|
|
||||||
TinySliderSettingItem(
|
FontWeightSetting(
|
||||||
title = stringResource(R.string.font_weight_text),
|
value = titleBold,
|
||||||
value = titleBold.coerceAtLeast(100).toFloat(),
|
|
||||||
valueRange = 100f..900f,
|
|
||||||
imageVector = weightIconMap[titleBold] ?: Icons.Default.FormatBold,
|
|
||||||
onValueChange = { value ->
|
onValueChange = { value ->
|
||||||
titleBold = value.toInt()
|
titleBold = value
|
||||||
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBold(value.toInt())))
|
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(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="text_font_weight">
|
<string-array name="text_font_weight">
|
||||||
<item>正常</item>
|
<item>常规</item>
|
||||||
<item>粗体</item>
|
<item>粗体</item>
|
||||||
<item>细体</item>
|
<item>细体</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="text_font_weight">
|
<string-array name="text_font_weight">
|
||||||
<item>正常</item>
|
<item>常規</item>
|
||||||
<item>粗體</item>
|
<item>粗體</item>
|
||||||
<item>細體</item>
|
<item>細體</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|||||||
@@ -106,7 +106,7 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="text_font_weight">
|
<string-array name="text_font_weight">
|
||||||
<item>正常</item>
|
<item>常規</item>
|
||||||
<item>粗體</item>
|
<item>粗體</item>
|
||||||
<item>細體</item>
|
<item>細體</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|||||||
@@ -204,7 +204,7 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="text_font_weight">
|
<string-array name="text_font_weight">
|
||||||
<item>Normal</item>
|
<item>Regular</item>
|
||||||
<item>Bold</item>
|
<item>Bold</item>
|
||||||
<item>Light</item>
|
<item>Light</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|||||||
Reference in New Issue
Block a user