From 933bded9d8e437542647bb3a377f7081409e02f4 Mon Sep 17 00:00:00 2001 From: HapeLee <63206378+HapeLee@users.noreply.github.com> Date: Sun, 28 Jun 2026 17:13:22 +0800 Subject: [PATCH] =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/ai/chat/AiChatScreen.kt | 6 +- .../app/ui/book/read/ReadBookMenuBar.kt | 222 ++++++++++++++---- .../button/series/SeriesIconButton.kt | 10 +- 3 files changed, 181 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/ai/chat/AiChatScreen.kt b/app/src/main/java/io/legado/app/ui/ai/chat/AiChatScreen.kt index da5f3147c..697e1900a 100644 --- a/app/src/main/java/io/legado/app/ui/ai/chat/AiChatScreen.kt +++ b/app/src/main/java/io/legado/app/ui/ai/chat/AiChatScreen.kt @@ -391,7 +391,7 @@ fun AiChatScreen( modifier = Modifier .fillMaxWidth() .height(systemBottomPadding) - .background(bottomGradientColor.copy(alpha = 0.68f)) + .background(bottomGradientColor.copy(alpha = 0.88f)) ) } @@ -499,7 +499,7 @@ fun AiChatScreen( modifier = Modifier .fillMaxWidth() .statusBarsPadding() - .padding(start = 8.dp, top = 8.dp, end = 8.dp, bottom = 24.dp), + .padding(start = 16.dp, top = 8.dp, end = 16.dp, bottom = 24.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically ) { @@ -1252,7 +1252,7 @@ private fun ChatInputBar( bottom = bottomPadding ), shape = RoundedCornerShape(32.dp), - color = LegadoTheme.colorScheme.surfaceContainerHigh + color = LegadoTheme.colorScheme.surfaceContainerLow ) { Row( modifier = Modifier diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt index 1158026a8..140849929 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt @@ -1,8 +1,6 @@ package io.legado.app.ui.book.read -import android.app.Activity import android.content.Context -import android.content.ContextWrapper import android.os.Build import androidx.activity.compose.LocalActivity import androidx.compose.animation.AnimatedContent @@ -59,25 +57,28 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.ArrowForward import androidx.compose.material.icons.automirrored.filled.Login +import androidx.compose.material.icons.filled.Animation +import androidx.compose.material.icons.filled.AutoStories import androidx.compose.material.icons.filled.Block +import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material.icons.filled.BrightnessAuto +import androidx.compose.material.icons.filled.BugReport +import androidx.compose.material.icons.filled.Build +import androidx.compose.material.icons.filled.CleanHands import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.CloudDownload import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.filled.FindReplace +import androidx.compose.material.icons.filled.Image import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.Payment import androidx.compose.material.icons.filled.Refresh -import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.filled.SwapHoriz -import androidx.compose.material.icons.filled.Animation -import androidx.compose.material.icons.filled.AutoStories -import androidx.compose.material.icons.filled.Bookmark -import androidx.compose.material.icons.filled.Build -import androidx.compose.material.icons.filled.CleanHands -import androidx.compose.material.icons.filled.CloudDownload -import androidx.compose.material.icons.filled.FindReplace -import androidx.compose.material.icons.filled.Image +import androidx.compose.material.icons.filled.Replay import androidx.compose.material.icons.filled.Rule +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material.icons.filled.SwapHoriz import androidx.compose.material.icons.filled.SwapVert import androidx.compose.material.icons.filled.Sync import androidx.compose.material.icons.filled.Toc @@ -169,7 +170,6 @@ import io.legado.app.ui.widget.components.AppVerticalSlider import io.legado.app.ui.widget.components.bookmark.BookmarkEditContent import io.legado.app.ui.widget.components.button.series.SmallTonalButton import io.legado.app.ui.widget.components.divider.PillDivider -import io.legado.app.ui.widget.components.icon.AppIcons import io.legado.app.ui.widget.components.menuItem.MenuItemIcon import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem @@ -1008,6 +1008,27 @@ private fun MenuTitleBar( onIntent = onIntent, backdrop = backdrop, ) + DownloadActionButton( + state = state, + colors = colors, + onIntent = onIntent, + backdrop = backdrop, + ) + } else { + if (state.isLocalTxt) { + TxtTocRuleActionButton( + state = state, + colors = colors, + onIntent = onIntent, + backdrop = backdrop, + ) + } + CharsetActionButton( + state = state, + colors = colors, + onIntent = onIntent, + backdrop = backdrop, + ) } Box { @@ -1423,6 +1444,89 @@ private fun MenuTitleBarMergedGlassButton( .height(20.dp) .background(tint.copy(alpha = 0.15f)) ) + + // Download + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .size(40.dp) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + role = Role.Button, + onClick = { onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.Download)) }, + ), + ) { + Icon( + imageVector = Icons.Default.CloudDownload, + contentDescription = stringResource(R.string.offline_cache), + tint = tint, + modifier = Modifier.size(20.dp), + ) + } + + Box( + modifier = Modifier + .width(1.dp) + .height(20.dp) + .background(tint.copy(alpha = 0.15f)) + ) + } else { + // TXT directory rule + if (state.isLocalTxt) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .size(40.dp) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + role = Role.Button, + onClick = { onIntent(ReadBookIntent.MenuTocRegex) }, + ), + ) { + Icon( + imageVector = Icons.Default.Toc, + contentDescription = stringResource(R.string.txt_toc_rule), + tint = tint, + modifier = Modifier.size(20.dp), + ) + } + + Box( + modifier = Modifier + .width(1.dp) + .height(20.dp) + .background(tint.copy(alpha = 0.15f)) + ) + } + + // Text encoding + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .size(40.dp) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + role = Role.Button, + onClick = { onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.Charset)) }, + ), + ) { + Icon( + imageVector = Icons.Default.Translate, + contentDescription = stringResource(R.string.set_charset), + tint = tint, + modifier = Modifier.size(20.dp), + ) + } + + Box( + modifier = Modifier + .width(1.dp) + .height(20.dp) + .background(tint.copy(alpha = 0.15f)) + ) } // MoreVert - overflow menu @@ -1558,6 +1662,57 @@ private fun RefreshActionButton( } } +@Composable +private fun DownloadActionButton( + state: ReadBookUiState, + colors: ReadMenuColors, + onIntent: (ReadBookIntent) -> Unit, + backdrop: Backdrop?, +) { + MenuTitleGlassButton( + onClick = { onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.Download)) }, + icon = Icons.Default.CloudDownload, + contentDescription = stringResource(R.string.offline_cache), + state = state, + colors = colors, + backdrop = backdrop, + ) +} + +@Composable +private fun TxtTocRuleActionButton( + state: ReadBookUiState, + colors: ReadMenuColors, + onIntent: (ReadBookIntent) -> Unit, + backdrop: Backdrop?, +) { + MenuTitleGlassButton( + onClick = { onIntent(ReadBookIntent.MenuTocRegex) }, + icon = Icons.Default.Toc, + contentDescription = stringResource(R.string.txt_toc_rule), + state = state, + colors = colors, + backdrop = backdrop, + ) +} + +@Composable +private fun CharsetActionButton( + state: ReadBookUiState, + colors: ReadMenuColors, + onIntent: (ReadBookIntent) -> Unit, + backdrop: Backdrop?, +) { + MenuTitleGlassButton( + onClick = { onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.Charset)) }, + icon = Icons.Default.Translate, + contentDescription = stringResource(R.string.set_charset), + state = state, + colors = colors, + backdrop = backdrop, + ) +} + @Composable private fun FloatingIconRow( state: ReadBookUiState, @@ -1655,32 +1810,11 @@ private fun OverflowDropdownMenu( if (!state.isLocalBook) { RoundDropdownMenuItem( text = stringResource(R.string.menu_refresh_all), - leadingIcon = menuIcon(AppIcons.Replay), + leadingIcon = menuIcon(Icons.Default.Replay), onClick = { dismiss(); onIntent(ReadBookIntent.MenuRefreshAll) }, ) } - // TXT - if (state.isLocalTxt) { - RoundDropdownMenuItem( - text = stringResource(R.string.txt_toc_rule), - leadingIcon = menuIcon(Icons.Default.Toc), - onClick = { dismiss(); onIntent(ReadBookIntent.MenuTocRegex) }, - ) - } - - // Local book - if (state.isLocalBook) { - RoundDropdownMenuItem( - text = stringResource(R.string.set_charset), - leadingIcon = menuIcon(Icons.Default.Translate), - onClick = { - dismiss() - onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.Charset)) - }, - ) - } - PillDivider() // Content operations @@ -1691,25 +1825,15 @@ private fun OverflowDropdownMenu( ) RoundDropdownMenuItem( text = stringResource(R.string.edit_content), - leadingIcon = menuIcon(AppIcons.Edit), + leadingIcon = menuIcon(Icons.Default.Edit), onClick = { dismiss() onIntent(ReadBookIntent.OpenContentEdit) }, ) - if (!state.isLocalBook) { - RoundDropdownMenuItem( - text = stringResource(R.string.offline_cache), - leadingIcon = menuIcon(Icons.Default.CloudDownload), - onClick = { - dismiss() - onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.Download)) - }, - ) - } RoundDropdownMenuItem( text = stringResource(R.string.update_toc), - leadingIcon = menuIcon(AppIcons.Replay), + leadingIcon = menuIcon(Icons.Default.Replay), onClick = { dismiss(); onIntent(ReadBookIntent.MenuUpdateToc) }, ) RoundDropdownMenuItem( @@ -1737,7 +1861,7 @@ private fun OverflowDropdownMenu( ) RoundDropdownMenuItem( text = stringResource(R.string.replace_rule_title_setting), - leadingIcon = menuIcon(AppIcons.Settings), + leadingIcon = menuIcon(Icons.Default.Settings), onClick = { dismiss(); onIntent(ReadBookIntent.MenuSettingReplace) }, ) RoundDropdownMenuItem( @@ -1855,7 +1979,7 @@ private fun OverflowDropdownMenu( RoundDropdownMenuItem( text = stringResource(R.string.log), - leadingIcon = menuIcon(AppIcons.BugReport), + leadingIcon = menuIcon(Icons.Default.BugReport), onClick = { dismiss() onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.AppLog)) diff --git a/app/src/main/java/io/legado/app/ui/widget/components/button/series/SeriesIconButton.kt b/app/src/main/java/io/legado/app/ui/widget/components/button/series/SeriesIconButton.kt index 38e9d0d86..519f666b2 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/button/series/SeriesIconButton.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/button/series/SeriesIconButton.kt @@ -1,8 +1,9 @@ package io.legado.app.ui.widget.components.button.series -import androidx.compose.animation.animateColorAsState -import androidx.compose.animation.core.tween import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.snap +import androidx.compose.animation.core.tween import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -19,13 +20,12 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.ripple -import androidx.compose.animation.core.snap import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.runtime.SideEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -298,7 +298,7 @@ private fun containerColor(style: SeriesIconButtonStyle): Color { return when (style) { SeriesIconButtonStyle.Plain -> Color.Transparent SeriesIconButtonStyle.Tonal, - SeriesIconButtonStyle.Outlined -> LegadoTheme.colorScheme.surfaceContainerLow + SeriesIconButtonStyle.Outlined -> LegadoTheme.colorScheme.surface } }