Просмотр исходного кода

feat: 调整阅读菜单默认值和部分选项

HapeLee 3 месяцев назад
Родитель
Сommit
d0dac5ad50

+ 1 - 0
app/src/main/java/io/legado/app/constant/PreferKey.kt

@@ -336,6 +336,7 @@ object PreferKey {
     const val readMenuTopBarLiquidGlassButtons = "readMenuTopBarLiquidGlassButtons"
     const val readMenuTopBarTitleCapsule = "readMenuTopBarTitleCapsule"
     const val readMenuBottomBarLiquidGlassButtons = "readMenuBottomBarLiquidGlassButtons"
+    const val readMenuFloatingIconLiquidGlass = "readMenuFloatingIconLiquidGlass"
     const val readMenuTopBarBlurStyle = "readMenuTopBarBlurStyle"
     const val readMenuBottomBarBlurStyle = "readMenuBottomBarBlurStyle"
     const val readMenuBlurRadius = "readMenuBlurRadius"

+ 9 - 0
app/src/main/java/io/legado/app/data/repository/ReadSettingsRepository.kt

@@ -263,6 +263,9 @@ class ReadSettingsRepository(
     suspend fun setReadMenuBottomBarLiquidGlassButtons(value: Boolean) =
         settingsRepository.putBoolean(PreferKey.readMenuBottomBarLiquidGlassButtons, value)
 
+    suspend fun setReadMenuFloatingIconLiquidGlass(value: Boolean) =
+        settingsRepository.putBoolean(PreferKey.readMenuFloatingIconLiquidGlass, value)
+
     suspend fun setReadMenuTopBarBlurStyle(value: Int) =
         settingsRepository.putInt(PreferKey.readMenuTopBarBlurStyle, value.coerceIn(0, 1))
 
@@ -411,6 +414,10 @@ class ReadSettingsRepository(
             readMenuTopBarLiquidGlassButtons = compatDsValue(Keys.ReadMenuTopBarLiquidGlassButtons, false),
             readMenuTopBarTitleCapsule = compatDsValue(Keys.ReadMenuTopBarTitleCapsule, false),
             readMenuBottomBarLiquidGlassButtons = compatDsValue(Keys.ReadMenuBottomBarLiquidGlassButtons, false),
+            readMenuFloatingIconLiquidGlass = compatDsValue(
+                Keys.ReadMenuFloatingIconLiquidGlass,
+                false
+            ),
             readMenuTopBarBlurStyle = compatDsValue(
                 Keys.ReadMenuTopBarBlurStyle,
                 ReadMenuBlurStyle.Solid
@@ -522,6 +529,8 @@ class ReadSettingsRepository(
             booleanPreferencesKey(PreferKey.readMenuTopBarTitleCapsule)
         val ReadMenuBottomBarLiquidGlassButtons =
             booleanPreferencesKey(PreferKey.readMenuBottomBarLiquidGlassButtons)
+        val ReadMenuFloatingIconLiquidGlass =
+            booleanPreferencesKey(PreferKey.readMenuFloatingIconLiquidGlass)
         val ReadMenuTopBarBlurStyle = intPreferencesKey(PreferKey.readMenuTopBarBlurStyle)
         val ReadMenuBottomBarBlurStyle = intPreferencesKey(PreferKey.readMenuBottomBarBlurStyle)
         val ReadMenuBlurRadius = intPreferencesKey(PreferKey.readMenuBlurRadius)

+ 1 - 0
app/src/main/java/io/legado/app/domain/model/settings/ReadSettings.kt

@@ -90,6 +90,7 @@ data class ReadSettings(
     val readMenuTopBarLiquidGlassButtons: Boolean = false,
     val readMenuTopBarTitleCapsule: Boolean = false,
     val readMenuBottomBarLiquidGlassButtons: Boolean = false,
+    val readMenuFloatingIconLiquidGlass: Boolean = false,
     val readMenuTopBarBlurStyle: Int = ReadMenuBlurStyle.Solid,
     val readMenuBottomBarBlurStyle: Int = ReadMenuBlurStyle.Solid,
     val readMenuBlurRadius: Int = 24,

+ 1 - 0
app/src/main/java/io/legado/app/help/config/ReadBookConfig.kt

@@ -196,6 +196,7 @@ object ReadBookConfig {
     val readMenuTopBarLiquidGlassButtons get() = readSettings.readMenuTopBarLiquidGlassButtons
     val readMenuTopBarTitleCapsule get() = readSettings.readMenuTopBarTitleCapsule
     val readMenuBottomBarLiquidGlassButtons get() = readSettings.readMenuBottomBarLiquidGlassButtons
+    val readMenuFloatingIconLiquidGlass get() = readSettings.readMenuFloatingIconLiquidGlass
     val readMenuBorderColor get() = readSettings.readMenuBorderColor
     val readMenuBorderColorNight get() = readSettings.readMenuBorderColorNight
     val readMenuTextColor get() = readSettings.readMenuTextColor

+ 1 - 0
app/src/main/java/io/legado/app/help/storage/BackupConfig.kt

@@ -225,6 +225,7 @@ object BackupConfig {
         PreferKey.readMenuTopBarLiquidGlassButtons,
         PreferKey.readMenuTopBarTitleCapsule,
         PreferKey.readMenuBottomBarLiquidGlassButtons,
+        PreferKey.readMenuFloatingIconLiquidGlass,
         PreferKey.readMenuTopBarBlurStyle,
         PreferKey.readMenuBottomBarBlurStyle,
         PreferKey.readMenuBlurRadius,

+ 5 - 1
app/src/main/java/io/legado/app/ui/book/read/ReadBookContract.kt

@@ -388,6 +388,7 @@ data class ReadMenuConfig(
     val readMenuTopBarLiquidGlassButtons: Boolean = false,
     val readMenuTopBarTitleCapsule: Boolean = false,
     val readMenuBottomBarLiquidGlassButtons: Boolean = false,
+    val readMenuFloatingIconLiquidGlass: Boolean = false,
     val readMenuTopBarBlurStyle: Int = ReadMenuBlurStyle.Solid,
     val readMenuBottomBarBlurStyle: Int = ReadMenuBlurStyle.Solid,
     val readMenuIconStyle: Int = 0,
@@ -954,7 +955,7 @@ sealed interface ReadBookSheet {
     data object SimulatedReading : ReadBookSheet
     data object ToolButtonConfig : ReadBookSheet
     data object EyeProtection : ReadBookSheet
-    data object TitleBarIconConfig : ReadBookSheet
+    data object FloatingBarIconConfig : ReadBookSheet
     data object EffectiveReplaces : ReadBookSheet
     data object ContentProcesses : ReadBookSheet
     data object ContentEdit : ReadBookSheet
@@ -1397,6 +1398,9 @@ sealed interface ConfigUpdate {
     data class MenuBottomBarLiquidGlassButtons(val value: Boolean) : ConfigUpdate {
         override val actions = emptySet<ConfigUpdateAction>()
     }
+    data class MenuFloatingIconLiquidGlass(val value: Boolean) : ConfigUpdate {
+        override val actions = emptySet<ConfigUpdateAction>()
+    }
     data class MenuTopBarBlurSelection(val mode: Int, val style: Int) : ConfigUpdate {
         override val actions = emptySet<ConfigUpdateAction>()
     }

+ 11 - 13
app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt

@@ -1940,7 +1940,7 @@ private fun FloatingIconRow(
     backdrop: Backdrop?,
 ) {
     val context = LocalContext.current
-    val titleBarIcons = remember(
+    val floatingIcons = remember(
         state.menuConfig.titleBarButtons,
         state.isReadAloudRunning,
         state.isAutoPage,
@@ -1956,7 +1956,7 @@ private fun FloatingIconRow(
         )
     }
 
-    if (titleBarIcons.isEmpty()) return
+    if (floatingIcons.isEmpty()) return
 
     Row(
         modifier = Modifier
@@ -1970,21 +1970,20 @@ private fun FloatingIconRow(
         },
         verticalAlignment = Alignment.CenterVertically,
     ) {
-        titleBarIcons.forEach { iconDef ->
+        floatingIcons.forEach { iconDef ->
             val customPath = remember(state.menuConfig.titleBarCustomIcons, iconDef.id) {
                 state.menuConfig.titleBarCustomIcons[iconDef.id]
             }
             val isCustom = !customPath.isNullOrBlank()
+            val glassEnabled = !isCustom && state.menuConfig.readMenuFloatingIconLiquidGlass &&
+                    readerMenuLiquidGlassAvailable(backdrop)
             ReadMenuGlassButtonSurface(
                 onClick = iconDef.onClick,
                 colors = colors,
                 backdrop = backdrop,
                 menuConfig = state.menuConfig,
-                glassEnabled = !isCustom && readMenuTopBarButtonLiquidGlassEnabled(
-                    backdrop,
-                    state.menuConfig
-                ),
-                iconStyle = state.menuConfig.titleBarIconStyle,
+                glassEnabled = glassEnabled,
+                iconStyle = 1,
                 selected = iconDef.isActive,
                 modifier = Modifier.padding(horizontal = 4.dp),
                 onLongClick = iconDef.onLongClick,
@@ -3170,8 +3169,7 @@ private fun readMenuTopBarButtonLiquidGlassEnabled(
     backdrop: Backdrop?,
     menuConfig: ReadMenuConfig,
 ): Boolean {
-    return menuConfig.readMenuTopBarBlurMode != ReadMenuBlurMode.None &&
-            menuConfig.readMenuTopBarLiquidGlassButtons &&
+    return menuConfig.readMenuTopBarLiquidGlassButtons &&
             readerMenuLiquidGlassAvailable(backdrop)
 }
 
@@ -3331,7 +3329,7 @@ private fun readMenuColors(readBarStyle: Int): ReadMenuColors {
 
 // ========== Title Bar Icons ==========
 
-private data class TitleBarIconDef(
+private data class FloatingIconDef(
     val id: String,
     val icon: ImageVector,
     val label: String,
@@ -3345,7 +3343,7 @@ private fun loadFloatingIcons(
     state: ReadBookUiState,
     preferences: ReadPreferences,
     onIntent: (ReadBookIntent) -> Unit,
-): List<TitleBarIconDef> {
+): List<FloatingIconDef> {
     val infoMap = readMenuButtonInfos(context).associateBy { it.id }
 
     val actionMap: Map<String, () -> Unit> = mapOf(
@@ -3394,7 +3392,7 @@ private fun loadFloatingIcons(
         .mapNotNull { item ->
             val id = item.id
             val info = infoMap[id] ?: return@mapNotNull null
-            TitleBarIconDef(
+            FloatingIconDef(
                 id = id,
                 icon = info.icon,
                 label = info.label,

+ 3 - 3
app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt

@@ -28,6 +28,7 @@ import io.legado.app.ui.book.read.sheet.ContentProcessesSheet
 import io.legado.app.ui.book.read.sheet.DownloadSheet
 import io.legado.app.ui.book.read.sheet.EffectiveReplacesSheet
 import io.legado.app.ui.book.read.sheet.EyeProtectionConfigSheet
+import io.legado.app.ui.book.read.sheet.FloatingBarIconConfigSheet
 import io.legado.app.ui.book.read.sheet.HighlightRuleConfigSheet
 import io.legado.app.ui.book.read.sheet.HttpTtsEditSheet
 import io.legado.app.ui.book.read.sheet.MoreConfigSheet
@@ -39,7 +40,6 @@ import io.legado.app.ui.book.read.sheet.ReadAloudNumberConfigSheet
 import io.legado.app.ui.book.read.sheet.ShadowSetSheet
 import io.legado.app.ui.book.read.sheet.SimulatedReadingSheet
 import io.legado.app.ui.book.read.sheet.SpeakEngineConfigSheet
-import io.legado.app.ui.book.read.sheet.TitleBarIconSheet
 import io.legado.app.ui.book.read.sheet.ToolButtonConfigSheet
 import io.legado.app.ui.book.read.sheet.UnderlineConfigSheet
 import io.legado.app.ui.book.readaloud.player.ReadAloudPlayerEffect
@@ -251,8 +251,8 @@ fun ReadBookScreen(
         onIntensityChange = { onIntent(ReadBookIntent.EyeProtectionIntensityChanged(it)) },
         onAutoNightChange = { onIntent(ReadBookIntent.EyeProtectionAutoNightChanged(it)) },
     )
-    TitleBarIconSheet(
-        show = state.activeSheet is ReadBookSheet.TitleBarIconConfig,
+    FloatingBarIconConfigSheet(
+        show = state.activeSheet is ReadBookSheet.FloatingBarIconConfig,
         items = state.menuConfig.titleBarButtons,
         customIcons = state.menuConfig.titleBarCustomIcons,
         onDismissRequest = dismissSheet,

+ 10 - 0
app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt

@@ -2486,6 +2486,7 @@ class ReadBookViewModel(
                 readMenuTopBarLiquidGlassButtons = ReadBookConfig.readMenuTopBarLiquidGlassButtons,
                 readMenuTopBarTitleCapsule = ReadBookConfig.readMenuTopBarTitleCapsule,
                 readMenuBottomBarLiquidGlassButtons = ReadBookConfig.readMenuBottomBarLiquidGlassButtons,
+                readMenuFloatingIconLiquidGlass = ReadBookConfig.readMenuFloatingIconLiquidGlass,
                 readMenuTopBarBlurStyle = ReadBookConfig.readMenuTopBarBlurStyle,
                 readMenuBottomBarBlurStyle = ReadBookConfig.readMenuBottomBarBlurStyle,
                 readMenuIconStyle = ReadBookConfig.readMenuIconStyle,
@@ -5175,6 +5176,15 @@ class ReadBookViewModel(
                 }
             }
 
+            is ConfigUpdate.MenuFloatingIconLiquidGlass -> {
+                viewModelScope.launch {
+                    readSettingsRepository.setReadMenuFloatingIconLiquidGlass(update.value)
+                }
+                _uiState.update {
+                    it.copy(menuConfig = it.menuConfig.copy(readMenuFloatingIconLiquidGlass = update.value))
+                }
+            }
+
             is ConfigUpdate.MenuTopBarBlurSelection -> {
                 val mode = update.mode.coerceIn(0, 2).let {
                     if (it == ReadMenuBlurMode.LiquidGlass) ReadMenuBlurMode.Haze else it

+ 3 - 3
app/src/main/java/io/legado/app/ui/book/read/sheet/TitleBarIconSheet.kt → app/src/main/java/io/legado/app/ui/book/read/sheet/FloatingBarIconConfigSheet.kt

@@ -50,7 +50,7 @@ import sh.calvin.reorderable.ReorderableItem
 import sh.calvin.reorderable.rememberReorderableLazyListState
 
 @Composable
-fun TitleBarIconSheet(
+fun FloatingBarIconConfigSheet(
     show: Boolean,
     items: List<ReadBookButtonConfigItem>,
     customIcons: Map<String, String>,
@@ -139,7 +139,7 @@ private fun ButtonIconConfigSheet(
                             cornerRadius = 12.dp,
                             containerColor = LegadoTheme.colorScheme.surfaceContainerLow
                         ) {
-                            TitleBarIconItem(
+                            ButtonIconConfigItem(
                                 item = item,
                                 customIcon = customIcons[item.id],
                                 onToggleEnabled = {
@@ -182,7 +182,7 @@ private fun ButtonIconConfigSheet(
 }
 
 @Composable
-private fun TitleBarIconItem(
+private fun ButtonIconConfigItem(
     item: ButtonIconEntry,
     customIcon: String?,
     onToggleEnabled: () -> Unit,

+ 37 - 40
app/src/main/java/io/legado/app/ui/book/read/sheet/SystemMenuPage.kt

@@ -243,6 +243,9 @@ private fun GlobalMenuTab(
     onIntent: (ReadBookIntent) -> Unit,
     onShowColorPicker: (Int, Int) -> Unit,
 ) {
+    val customIconCount = remember(preferences.titleBarCustomIcons) {
+        countCustomIcons(preferences.titleBarCustomIcons)
+    }
     val bottomMode = preferences.readBarStyle
     val colorMode = preferences.readMenuColorMode.coerceIn(0, 1)
     val dayMenuBgColor = preferences.readMenuBgColor
@@ -511,6 +514,17 @@ private fun GlobalMenuTab(
         )
         AnimatedVisibility(visible = preferences.showTitleBarIcons) {
             Column {
+                TinyClickableSettingItem(
+                    title = stringResource(R.string.title_bar_icons),
+                    description = if (customIconCount == 0) {
+                        stringResource(R.string.read_menu_custom_icons_none)
+                    } else {
+                        stringResource(R.string.read_menu_custom_icons_count, customIconCount)
+                    },
+                    onClick = {
+                        onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.FloatingBarIconConfig))
+                    },
+                )
                 TinyDropdownSettingItem(
                     title = stringResource(R.string.title_bar_icon_position),
                     selectedValue = preferences.titleBarIconPosition.toString(),
@@ -529,17 +543,17 @@ private fun GlobalMenuTab(
                         )
                     },
                 )
-                TinyDropdownSettingItem(
-                    title = stringResource(R.string.read_menu_icon_container_style),
-                    selectedValue = preferences.titleBarIconStyle.toString(),
-                    displayEntries = arrayOf(
-                        stringResource(R.string.read_menu_icon_style_plain),
-                        stringResource(R.string.read_menu_icon_style_tonal),
-                        stringResource(R.string.read_menu_icon_style_outlined),
-                    ),
-                    entryValues = arrayOf("0", "1", "2"),
-                    onValueChange = {
-                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBarIconStyle(it.toInt())))
+                TinySwitchSettingItem(
+                    title = stringResource(R.string.read_menu_bar_liquid_glass_buttons),
+                    checked = preferences.readMenuFloatingIconLiquidGlass,
+                    onCheckedChange = {
+                        onIntent(
+                            ReadBookIntent.UpdateConfig(
+                                ConfigUpdate.MenuFloatingIconLiquidGlass(
+                                    it
+                                )
+                            )
+                        )
                     },
                 )
             }
@@ -740,9 +754,6 @@ private fun TopBarTab(
     preferences: ReadPreferences,
     onIntent: (ReadBookIntent) -> Unit,
 ) {
-    val customIconCount = remember(preferences.titleBarCustomIcons) {
-        countCustomIcons(preferences.titleBarCustomIcons)
-    }
     val topBarBlurEnabled = preferences.readMenuTopBarBlurMode == ReadMenuBlurMode.Haze
 
     val titleBarModeEntries = stringArrayResource(R.array.title_bar_mode)
@@ -785,17 +796,6 @@ private fun TopBarTab(
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBarCompact(it)))
             },
         )
-        TinyClickableSettingItem(
-            title = stringResource(R.string.title_bar_icons),
-            description = if (customIconCount == 0) {
-                stringResource(R.string.read_menu_custom_icons_none)
-            } else {
-                stringResource(R.string.read_menu_custom_icons_count, customIconCount)
-            },
-            onClick = {
-                onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.TitleBarIconConfig))
-            },
-        )
         TinyDropdownSettingItem(
             title = stringResource(R.string.read_menu_icon_container_style),
             selectedValue = preferences.titleBarIconStyle.toString(),
@@ -809,7 +809,6 @@ private fun TopBarTab(
                 onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TitleBarIconStyle(it.toInt())))
             },
         )
-
         TinySwitchSettingItem(
             title = stringResource(R.string.read_menu_bar_blur),
             checked = topBarBlurEnabled,
@@ -846,22 +845,20 @@ private fun TopBarTab(
                 )
             },
         )
-        AnimatedVisibility(visible = topBarBlurEnabled) {
-            TinySwitchSettingItem(
-                title = stringResource(R.string.read_menu_bar_liquid_glass_buttons),
-                description = stringResource(R.string.read_menu_top_bar_liquid_glass_buttons_summary),
-                checked = preferences.readMenuTopBarLiquidGlassButtons,
-                onCheckedChange = {
-                    onIntent(
-                        ReadBookIntent.UpdateConfig(
-                            ConfigUpdate.MenuTopBarLiquidGlassButtons(
-                                it
-                            )
+        TinySwitchSettingItem(
+            title = stringResource(R.string.read_menu_bar_liquid_glass_buttons),
+            description = stringResource(R.string.read_menu_top_bar_liquid_glass_buttons_summary),
+            checked = preferences.readMenuTopBarLiquidGlassButtons,
+            onCheckedChange = {
+                onIntent(
+                    ReadBookIntent.UpdateConfig(
+                        ConfigUpdate.MenuTopBarLiquidGlassButtons(
+                            it
                         )
                     )
-                },
-            )
-        }
+                )
+            },
+        )
     }
 }
 

+ 1 - 0
app/src/test/java/io/legado/app/data/repository/ReadSettingsMappingTest.kt

@@ -80,6 +80,7 @@ class ReadSettingsMappingTest {
         assertEquals(1, settings.readMenuBorderWidth)
         assertEquals(3, settings.titleBarIconPosition)
         assertFalse(settings.showTitleBarIcons)
+        assertFalse(settings.readMenuFloatingIconLiquidGlass)
         assertFalse(settings.showMenuIcon)
         assertFalse(settings.titleBarCompact)
     }