feat: 增加是否展示菜单项图标的配置开关 (#1502)

* feat: 增加是否展示菜单项图标的配置开关

* fix(read-settings): 恢复被误删的 titleBarIconPosition 属性映射

---------

Co-authored-by: lyc <liuyichen@o-neg.com>
This commit is contained in:
lalala-12138
2026-06-20 00:16:00 +08:00
committed by GitHub
co-authored by lyc
parent 70c88cf3f4
commit ad8b8df13f
14 changed files with 105 additions and 2 deletions
@@ -318,6 +318,7 @@ object PreferKey {
const val titleBarCustomIcons = "titleBarCustomIcons"
const val titleBarIconPosition = "titleBarIconPosition"
const val showTitleBarIcons = "showTitleBarIcons"
const val showMenuIcon = "showMenuIcon"
const val disableReturnKey = "disableReturnKey"
const val selectText = "selectText"
//我在干什么
@@ -105,6 +105,7 @@ data class ReadPreferences(
val titleBarIconPosition: Int = 0,
val showTitleBarIcons: Boolean = true,
val chineseConverterType: Int = 0,
val showMenuIcon: Boolean = true,
)
class ReadSettingsRepository(
@@ -367,6 +368,9 @@ class ReadSettingsRepository(
suspend fun setShowTitleBarIcons(value: Boolean) =
settingsRepository.putBoolean(PreferKey.showTitleBarIcons, value)
suspend fun setShowMenuIcon(value: Boolean) =
settingsRepository.putBoolean(PreferKey.showMenuIcon, value)
suspend fun setChineseConverterType(value: Int) =
settingsRepository.putInt(PreferKey.chineseConverterType, value)
@@ -474,6 +478,7 @@ class ReadSettingsRepository(
titleBarIconPosition = this[Keys.TitleBarIconPosition] ?: 0,
showTitleBarIcons = this[Keys.ShowTitleBarIcons] ?: false,
chineseConverterType = this[Keys.ChineseConverterType] ?: 0,
showMenuIcon = this[Keys.ShowMenuIcon] ?: true,
)
}
@@ -570,5 +575,6 @@ class ReadSettingsRepository(
val TitleBarIconPosition = intPreferencesKey(PreferKey.titleBarIconPosition)
val ShowTitleBarIcons = booleanPreferencesKey(PreferKey.showTitleBarIcons)
val ChineseConverterType = intPreferencesKey(PreferKey.chineseConverterType)
val ShowMenuIcon = booleanPreferencesKey(PreferKey.showMenuIcon)
}
}
@@ -202,6 +202,7 @@ object ReadBookConfig {
var hideNavigationBar by prefDelegate(PreferKey.hideNavigationBar, false)
var useZhLayout by prefDelegate(PreferKey.useZhLayout, false)
var readMenuIconShowText by prefDelegate(PreferKey.readMenuIconShowText, true)
var showMenuIcon by prefDelegate(PreferKey.showMenuIcon, true)
var readMenuFloatingBottomBar by prefDelegate(PreferKey.readMenuFloatingBottomBar, false)
var readMenuTopBarLiquidGlassButtons by prefDelegate(PreferKey.readMenuTopBarLiquidGlassButtons, false)
var readMenuTopBarTitleCapsule by prefDelegate(PreferKey.readMenuTopBarTitleCapsule, false)
@@ -208,6 +208,7 @@ data class ReadMenuConfig(
val brightnessVwPos: String = "1",
val readBrightness: Int = 100,
val brightnessAuto: Boolean = false,
val showMenuIcon: Boolean = true,
)
@Immutable
@@ -1109,6 +1110,9 @@ sealed interface ConfigUpdate {
data class TitleBarMode(val value: String) : ConfigUpdate {
override val actions = emptySet<ConfigUpdateAction>()
}
data class ShowMenuIcon(val value: Boolean) : ConfigUpdate {
override val actions = emptySet<ConfigUpdateAction>()
}
data class ReadBodyToLh(val value: Boolean) : ConfigUpdate {
override val actions = setOf(ConfigUpdateAction.ReloadContent)
}
@@ -69,6 +69,19 @@ 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.Rule
import androidx.compose.material.icons.filled.SwapVert
import androidx.compose.material.icons.filled.Sync
import androidx.compose.material.icons.filled.Toc
import androidx.compose.material.icons.filled.Translate
import androidx.compose.material3.Icon
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
@@ -157,6 +170,7 @@ 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
@@ -1624,6 +1638,15 @@ private fun OverflowDropdownMenu(
expanded: Boolean,
onDismiss: () -> Unit,
) {
val showIcon = state.menuConfig.showMenuIcon
val menuIcon: (ImageVector) -> (@Composable () -> Unit)? = { imageVector ->
if (showIcon) {
{ MenuItemIcon(imageVector = imageVector) }
} else {
null
}
}
RoundDropdownMenu(
expanded = expanded,
onDismissRequest = onDismiss,
@@ -1634,6 +1657,7 @@ private fun OverflowDropdownMenu(
if (!state.isLocalBook) {
RoundDropdownMenuItem(
text = stringResource(R.string.menu_refresh_all),
leadingIcon = menuIcon(AppIcons.Replay),
onClick = { dismiss(); onIntent(ReadBookIntent.MenuRefreshAll) },
)
}
@@ -1642,6 +1666,7 @@ private fun OverflowDropdownMenu(
if (state.isLocalTxt) {
RoundDropdownMenuItem(
text = stringResource(R.string.txt_toc_rule),
leadingIcon = menuIcon(Icons.Default.Toc),
onClick = { dismiss(); onIntent(ReadBookIntent.MenuTocRegex) },
)
}
@@ -1650,6 +1675,7 @@ private fun OverflowDropdownMenu(
if (state.isLocalBook) {
RoundDropdownMenuItem(
text = stringResource(R.string.set_charset),
leadingIcon = menuIcon(Icons.Default.Translate),
onClick = {
dismiss()
onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.Charset))
@@ -1662,10 +1688,12 @@ private fun OverflowDropdownMenu(
// Content operations
RoundDropdownMenuItem(
text = stringResource(R.string.bookmark_add),
leadingIcon = menuIcon(Icons.Default.Bookmark),
onClick = { dismiss(); onIntent(ReadBookIntent.AddBookmark) },
)
RoundDropdownMenuItem(
text = stringResource(R.string.edit_content),
leadingIcon = menuIcon(AppIcons.Edit),
onClick = {
dismiss()
onIntent(ReadBookIntent.OpenContentEdit)
@@ -1674,6 +1702,7 @@ private fun OverflowDropdownMenu(
if (!state.isLocalBook) {
RoundDropdownMenuItem(
text = stringResource(R.string.offline_cache),
leadingIcon = menuIcon(Icons.Default.CloudDownload),
onClick = {
dismiss()
onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.Download))
@@ -1682,10 +1711,12 @@ private fun OverflowDropdownMenu(
}
RoundDropdownMenuItem(
text = stringResource(R.string.update_toc),
leadingIcon = menuIcon(AppIcons.Replay),
onClick = { dismiss(); onIntent(ReadBookIntent.MenuUpdateToc) },
)
RoundDropdownMenuItem(
text = stringResource(R.string.simulated_reading),
leadingIcon = menuIcon(Icons.Default.AutoStories),
onClick = {
dismiss()
onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.SimulatedReading))
@@ -1693,6 +1724,7 @@ private fun OverflowDropdownMenu(
)
RoundDropdownMenuItem(
text = stringResource(R.string.reverse_content),
leadingIcon = menuIcon(Icons.Default.SwapVert),
onClick = { dismiss(); onIntent(ReadBookIntent.MenuReverseContent) },
)
@@ -1701,15 +1733,18 @@ private fun OverflowDropdownMenu(
// Checkable items
RoundDropdownMenuItem(
text = stringResource(R.string.replace_rule_title),
leadingIcon = menuIcon(Icons.Default.FindReplace),
isSelected = state.useReplaceRule,
onClick = { onIntent(ReadBookIntent.MenuEnableReplace) },
)
RoundDropdownMenuItem(
text = stringResource(R.string.replace_rule_title_setting),
leadingIcon = menuIcon(AppIcons.Settings),
onClick = { dismiss(); onIntent(ReadBookIntent.MenuSettingReplace) },
)
RoundDropdownMenuItem(
text = stringResource(R.string.effective_replaces),
leadingIcon = menuIcon(Icons.Default.Rule),
onClick = {
dismiss()
onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.EffectiveReplaces))
@@ -1717,11 +1752,13 @@ private fun OverflowDropdownMenu(
)
RoundDropdownMenuItem(
text = stringResource(R.string.same_title_removed),
leadingIcon = menuIcon(Icons.Default.CleanHands),
isSelected = state.sameTitleRemoved,
onClick = { onIntent(ReadBookIntent.MenuSameTitleRemoved) },
)
RoundDropdownMenuItem(
text = stringResource(R.string.re_segment),
leadingIcon = menuIcon(Icons.Default.Toc),
isSelected = state.reSegment,
onClick = { onIntent(ReadBookIntent.MenuReSegment) },
)
@@ -1730,11 +1767,13 @@ private fun OverflowDropdownMenu(
if (state.isEpub) {
RoundDropdownMenuItem(
text = stringResource(R.string.del_ruby_tag),
leadingIcon = menuIcon(Icons.Default.CleanHands),
isSelected = state.delRubyTag,
onClick = { onIntent(ReadBookIntent.MenuDelRubyTag) },
)
RoundDropdownMenuItem(
text = stringResource(R.string.del_h_tag),
leadingIcon = menuIcon(Icons.Default.CleanHands),
isSelected = state.delHTag,
onClick = { onIntent(ReadBookIntent.MenuDelHTag) },
)
@@ -1746,6 +1785,7 @@ private fun OverflowDropdownMenu(
Box {
RoundDropdownMenuItem(
text = stringResource(R.string.image_style),
leadingIcon = menuIcon(Icons.Default.Image),
onClick = { imageStyleExpanded = true },
)
RoundDropdownMenu(
@@ -1784,6 +1824,7 @@ private fun OverflowDropdownMenu(
}
RoundDropdownMenuItem(
text = stringResource(R.string.book_page_anim),
leadingIcon = menuIcon(Icons.Default.Animation),
onClick = {
dismiss()
onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.PageAnim))
@@ -1791,6 +1832,7 @@ private fun OverflowDropdownMenu(
)
RoundDropdownMenuItem(
text = stringResource(R.string.config_btn),
leadingIcon = menuIcon(Icons.Default.Build),
onClick = {
dismiss()
onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.ToolButtonConfig))
@@ -1801,10 +1843,12 @@ private fun OverflowDropdownMenu(
if (state.isReadingProgressSyncConfigured) {
RoundDropdownMenuItem(
text = stringResource(R.string.get_book_progress),
leadingIcon = menuIcon(Icons.Default.Sync),
onClick = { dismiss(); onIntent(ReadBookIntent.MenuGetProgress) },
)
RoundDropdownMenuItem(
text = stringResource(R.string.cover_book_progress),
leadingIcon = menuIcon(Icons.Default.Sync),
onClick = { dismiss(); onIntent(ReadBookIntent.MenuCoverProgress) },
)
}
@@ -1813,6 +1857,7 @@ private fun OverflowDropdownMenu(
RoundDropdownMenuItem(
text = stringResource(R.string.log),
leadingIcon = menuIcon(AppIcons.BugReport),
onClick = {
dismiss()
onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.AppLog))
@@ -1680,6 +1680,7 @@ class ReadBookViewModel(
ReadConfig.syncReadPreferences(preferences)
ReadBookConfig.readMenuPaletteStyle = preferences.readMenuPaletteStyle
_readPreferences.value = preferences
_uiState.update { syncFromReadBook(it) }
if (!preferences.hasMenuClickArea()) {
ReadConfig.detectClickArea()
readSettingsRepository.setClickAction(PreferKey.clickActionMC, 0)
@@ -1850,6 +1851,7 @@ class ReadBookViewModel(
brightnessVwPos = ReadBookConfig.brightnessVwPos,
readBrightness = ReadBookConfig.readBrightness,
brightnessAuto = ReadBookConfig.brightnessAuto,
showMenuIcon = ReadBookConfig.showMenuIcon,
),
)
}
@@ -3099,6 +3101,13 @@ class ReadBookViewModel(
)
}
}
is ConfigUpdate.ShowMenuIcon -> {
ReadBookConfig.showMenuIcon = update.value
viewModelScope.launch {
readSettingsRepository.setShowMenuIcon(update.value)
}
_uiState.update { it.copy(menuConfig = it.menuConfig.copy(showMenuIcon = update.value)) }
}
is ConfigUpdate.MenuTopBarBlurMode -> {
val mode = update.value.coerceIn(0, 2).let {
if (it == ReadMenuBlurMode.LiquidGlass) ReadMenuBlurMode.Haze else it
@@ -147,6 +147,9 @@ fun MoreConfigSheet(
onShowReadTitleAdditionChange = {
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ShowReadTitleAddition(it)))
},
onShowMenuIconChange = {
onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.ShowMenuIcon(it)))
},
)
}
}
@@ -299,6 +302,7 @@ private fun OtherSettings(
onOpenPageKeyConfig: () -> Unit,
onExpandTextMenuChange: (Boolean) -> Unit,
onShowReadTitleAdditionChange: (Boolean) -> Unit,
onShowMenuIconChange: (Boolean) -> Unit,
) {
val clickImageWayEntries = stringArrayResource(R.array.click_image_way_title)
val clickImageWayValues = stringArrayResource(R.array.click_image_way_value)
@@ -363,4 +367,9 @@ private fun OtherSettings(
checked = preferences.showReadTitleAddition,
onCheckedChange = onShowReadTitleAdditionChange,
)
TinySwitchSettingItem(
title = stringResource(R.string.show_menu_icon),
checked = preferences.showMenuIcon,
onCheckedChange = onShowMenuIconChange,
)
}
@@ -87,6 +87,9 @@ object ReadConfig {
var showReadTitleAddition
get() = ReadMenuConfig.showReadTitleAddition
set(value) { ReadMenuConfig.showReadTitleAddition = value }
var showMenuIcon
get() = ReadMenuConfig.showMenuIcon
set(value) { ReadMenuConfig.showMenuIcon = value }
var clickActionTL
get() = ReadMenuConfig.clickActionTL
set(value) { ReadMenuConfig.clickActionTL = value }
@@ -262,6 +265,7 @@ object ReadConfig {
progressBarBehavior = preferences.progressBarBehavior
expandTextMenu = preferences.expandTextMenu
showReadTitleAddition = preferences.showReadTitleAddition
showMenuIcon = preferences.showMenuIcon
clickActionTL = preferences.clickActionTL
clickActionTC = preferences.clickActionTC
clickActionTR = preferences.clickActionTR
@@ -38,7 +38,8 @@ data class ReadConfigUiState(
val showReadTitleAddition: Boolean = true,
val autoReadSpeed: Int = 10,
val prevKeys: String = "",
val nextKeys: String = ""
val nextKeys: String = "",
val showMenuIcon: Boolean = true
)
sealed interface ReadConfigIntent {
@@ -76,5 +77,6 @@ sealed interface ReadConfigIntent {
data class DisableReturnKeyChanged(val value: Boolean) : ReadConfigIntent
data class ExpandTextMenuChanged(val value: Boolean) : ReadConfigIntent
data class ShowReadTitleAdditionChanged(val value: Boolean) : ReadConfigIntent
data class ShowMenuIconChanged(val value: Boolean) : ReadConfigIntent
data class PageKeysChanged(val prevKeys: String, val nextKeys: String) : ReadConfigIntent
}
@@ -376,6 +376,14 @@ fun ReadConfigScreen(
viewModel.onIntent(ReadConfigIntent.ShowReadTitleAdditionChanged(it))
}
)
SwitchSettingItem(
title = stringResource(R.string.show_menu_icon),
checked = state.showMenuIcon,
onCheckedChange = {
viewModel.onIntent(ReadConfigIntent.ShowMenuIconChanged(it))
}
)
}
}
}
@@ -203,6 +203,12 @@ class ReadConfigViewModel(
postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
}
is ReadConfigIntent.ShowMenuIconChanged -> {
ReadConfig.showMenuIcon = intent.value
readSettingsRepository.setShowMenuIcon(intent.value)
postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
}
is ReadConfigIntent.PageKeysChanged -> {
readSettingsRepository.setPageKeys(intent.prevKeys, intent.nextKeys)
}
@@ -260,7 +266,8 @@ class ReadConfigViewModel(
showReadTitleAddition = showReadTitleAddition,
autoReadSpeed = autoReadSpeed,
prevKeys = prevKeys,
nextKeys = nextKeys
nextKeys = nextKeys,
showMenuIcon = showMenuIcon
)
}
}
@@ -45,6 +45,11 @@ object ReadMenuConfig {
true
)
var showMenuIcon by prefDelegate(
PreferKey.showMenuIcon,
true
)
// --- 点击区域配置 ---
var clickActionTL by prefDelegate(
@@ -1138,6 +1138,7 @@
<string name="custom_welcome">自定义欢迎页</string>
<string name="custom_welcome_summary">是否使用自定义欢迎页</string>
<string name="show_icon">显示图标</string>
<string name="show_menu_icon">展示菜单项图标</string>
<string name="show_default_book_icon">显示默认书籍图标</string>
<string name="cache_export">书籍缓存</string>
<string name="assists_key_config">辅助按键配置</string>
+1
View File
@@ -906,6 +906,7 @@
<string name="restore_ignore">Bypass List</string>
<string name="restore_ignore_summary">Ignore some contents while restoring</string>
<string name="read_config">Reading Interface Settings</string>
<string name="show_menu_icon">Show Menu Item Icons</string>
<string name="read_config_global_theme">Global &amp; Theme</string>
<string name="read_config_layout_spacing">Layout &amp; Spacing</string>
<string name="read_config_text_effects">Text &amp; Effects</string>