Merge remote-tracking branch 'fansangg/fix/1424'

# Conflicts:
#	app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt
#	app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt
This commit is contained in:
HapeLee committed 2026-06-15 01:49:50 +08:00
commit 6dc79761f6
3 files changed
+49 -12

No files matched your search

@@ -668,6 +668,7 @@ private fun ReadBookMenuSurface(
title = stringResource(R.string.read_config_text_effects), title = stringResource(R.string.read_config_text_effects),
maxHeight = maxHeight, maxHeight = maxHeight,
bottomPadding = if (extendSurfaceToNavigationBar) navBarHeight else 0.dp, bottomPadding = if (extendSurfaceToNavigationBar) navBarHeight else 0.dp,
animateSize = false,
onBack = { onIntent(ReadBookIntent.ReadMenuBack) }, onBack = { onIntent(ReadBookIntent.ReadMenuBack) },
) { ) {
ReadStyleTextTitleContent( ReadStyleTextTitleContent(
@@ -686,7 +687,6 @@ private fun ReadBookMenuSurface(
onOpenTitleFontSelect = { onOpenTitleFontSelect = {
onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.TitleFontSelect)) onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.TitleFontSelect))
}, },
modifier = Modifier.padding(horizontal = 16.dp),
onIntent = onIntent, onIntent = onIntent,
) )
} }
@@ -140,7 +140,11 @@ fun ReadStyleContent(
internal fun Modifier.pagerHeight(height: Dp) = this.layout { measurable, constraints -> internal fun Modifier.pagerHeight(height: Dp) = this.layout { measurable, constraints ->
val placeable = measurable.measure(constraints) val placeable = measurable.measure(constraints)
val layoutHeight = if (height != Dp.Unspecified) height.roundToPx() else placeable.height val layoutHeight = if (height != Dp.Unspecified) {
height.roundToPx().coerceIn(constraints.minHeight, constraints.maxHeight)
} else {
placeable.height
}
layout(placeable.width, layoutHeight) { layout(placeable.width, layoutHeight) {
placeable.placeRelative(0, 0) placeable.placeRelative(0, 0)
} }
@@ -1,5 +1,8 @@
package io.legado.app.ui.book.read.sheet package io.legado.app.ui.book.read.sheet
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.tween
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@@ -25,12 +28,16 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringArrayResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
@@ -80,14 +87,21 @@ fun ReadStyleTextTitleContent(
ReadStyleTextTitleContent( ReadStyleTextTitleContent(
tabTitles = tabTitles, tabTitles = tabTitles,
selectedTab = selectedTab, selectedTab = selectedTab,
onSelectedTabChange = { selectedTab = it },
pagerState = pagerState, pagerState = pagerState,
onOpenShadowSet = onOpenShadowSet, onOpenShadowSet = onOpenShadowSet,
onOpenUnderlineConfig = onOpenUnderlineConfig, onOpenUnderlineConfig = onOpenUnderlineConfig,
onOpenHighlightRule = onOpenHighlightRule, onOpenHighlightRule = onOpenHighlightRule,
onOpenFontSelect = onOpenFontSelect, onOpenFontSelect = onOpenFontSelect,
onOpenTitleFontSelect = onOpenTitleFontSelect, onOpenTitleFontSelect = onOpenTitleFontSelect,
animateToPage = { page -> scope.launch { pagerState.animateScrollToPage(page) } }, animateToPage = { page ->
selectedTab = page
scope.launch {
pagerState.animateScrollToPage(
page = page,
animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
}
},
modifier = modifier, modifier = modifier,
onIntent = onIntent, onIntent = onIntent,
) )
@@ -97,7 +111,6 @@ fun ReadStyleTextTitleContent(
internal fun ReadStyleTextTitleContent( internal fun ReadStyleTextTitleContent(
tabTitles: List<String>, tabTitles: List<String>,
selectedTab: Int, selectedTab: Int,
onSelectedTabChange: (Int) -> Unit,
pagerState: PagerState, pagerState: PagerState,
onOpenShadowSet: () -> Unit, onOpenShadowSet: () -> Unit,
onOpenUnderlineConfig: () -> Unit, onOpenUnderlineConfig: () -> Unit,
@@ -108,6 +121,9 @@ internal fun ReadStyleTextTitleContent(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onIntent: (ReadBookIntent) -> Unit, onIntent: (ReadBookIntent) -> Unit,
) { ) {
val pageHeights = remember { mutableStateMapOf<Int, Int>() }
val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
Column( Column(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
@@ -116,27 +132,35 @@ internal fun ReadStyleTextTitleContent(
tabTitles = tabTitles, tabTitles = tabTitles,
selectedTabIndex = selectedTab, selectedTabIndex = selectedTab,
onTabSelected = { index -> onTabSelected = { index ->
onSelectedTabChange(index)
animateToPage(index) animateToPage(index)
}, },
modifier = Modifier.padding(bottom = 8.dp), modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp),
) )
HorizontalPager( HorizontalPager(
state = pagerState, state = pagerState,
modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.Top,
modifier = Modifier
.fillMaxWidth()
.clipToBounds()
.pagerHeight(animatedHeight),
) { page -> ) { page ->
val pageModifier = Modifier.onSizeChanged { size ->
pageHeights[page] = size.height
}
when (page) { when (page) {
0 -> TextEffectsPage( 0 -> TextEffectsPage(
onOpenShadowSet = onOpenShadowSet, onOpenShadowSet = onOpenShadowSet,
onOpenUnderlineConfig = onOpenUnderlineConfig, onOpenUnderlineConfig = onOpenUnderlineConfig,
onOpenHighlightRule = onOpenHighlightRule, onOpenHighlightRule = onOpenHighlightRule,
onOpenFontSelect = onOpenFontSelect, onOpenFontSelect = onOpenFontSelect,
modifier = pageModifier,
onIntent = onIntent, onIntent = onIntent,
) )
1 -> LayoutSpacingPage(onIntent = onIntent) 1 -> LayoutSpacingPage(modifier = pageModifier, onIntent = onIntent)
2 -> TitleSettingsPage( 2 -> TitleSettingsPage(
onOpenTitleFontSelect = onOpenTitleFontSelect, onOpenTitleFontSelect = onOpenTitleFontSelect,
modifier = pageModifier,
onIntent = onIntent, onIntent = onIntent,
) )
} }
@@ -148,6 +172,7 @@ internal fun ReadStyleTextTitleContent(
@Composable @Composable
internal fun LayoutSpacingPage( internal fun LayoutSpacingPage(
modifier: Modifier = Modifier,
onIntent: (ReadBookIntent) -> Unit, onIntent: (ReadBookIntent) -> Unit,
) { ) {
var letterSpacing by remember { mutableFloatStateOf(ReadBookConfig.letterSpacing) } var letterSpacing by remember { mutableFloatStateOf(ReadBookConfig.letterSpacing) }
@@ -158,7 +183,9 @@ internal fun LayoutSpacingPage(
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.verticalScroll(rememberScrollState()), .padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
.then(modifier),
) { ) {
Text( Text(
text = stringResource(R.string.read_config_body_spacing), text = stringResource(R.string.read_config_body_spacing),
@@ -217,6 +244,7 @@ internal fun TextEffectsPage(
onOpenUnderlineConfig: () -> Unit, onOpenUnderlineConfig: () -> Unit,
onOpenHighlightRule: () -> Unit, onOpenHighlightRule: () -> Unit,
onOpenFontSelect: () -> Unit, onOpenFontSelect: () -> Unit,
modifier: Modifier = Modifier,
onIntent: (ReadBookIntent) -> Unit, onIntent: (ReadBookIntent) -> Unit,
) { ) {
var textItalic by remember { mutableStateOf(ReadBookConfig.textItalic) } var textItalic by remember { mutableStateOf(ReadBookConfig.textItalic) }
@@ -229,7 +257,9 @@ internal fun TextEffectsPage(
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.verticalScroll(rememberScrollState()), .padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
.then(modifier),
) { ) {
Text( Text(
text = stringResource(R.string.text_typeface), text = stringResource(R.string.text_typeface),
@@ -365,6 +395,7 @@ internal fun TextEffectsPage(
@Composable @Composable
internal fun TitleSettingsPage( internal fun TitleSettingsPage(
onOpenTitleFontSelect: () -> Unit, onOpenTitleFontSelect: () -> Unit,
modifier: Modifier = Modifier,
onIntent: (ReadBookIntent) -> Unit, onIntent: (ReadBookIntent) -> Unit,
) { ) {
var titleMode by remember(ReadBookConfig.titleMode) { mutableIntStateOf(ReadBookConfig.titleMode) } var titleMode by remember(ReadBookConfig.titleMode) { mutableIntStateOf(ReadBookConfig.titleMode) }
@@ -392,7 +423,9 @@ internal fun TitleSettingsPage(
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.verticalScroll(rememberScrollState()), .padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
.then(modifier),
) { ) {
TinyDropdownSettingItem( TinyDropdownSettingItem(
title = stringResource(R.string.body_title), title = stringResource(R.string.body_title),