|
@@ -321,6 +321,39 @@ class ReadBookViewModel(
|
|
|
|
|
|
|
|
val contentEditState = contentEditDelegate.uiState
|
|
val contentEditState = contentEditDelegate.uiState
|
|
|
|
|
|
|
|
|
|
+ // --- 配置更新分发(无自持状态,menuConfig 仍在 ReadBookUiState)---
|
|
|
|
|
+
|
|
|
|
|
+ private val configUpdateDelegate = ReadConfigUpdateDelegate(
|
|
|
|
|
+ scope = viewModelScope,
|
|
|
|
|
+ host = object : ReadConfigUpdateDelegate.Host {
|
|
|
|
|
+ override val menuConfig: ReadMenuConfig get() = _uiState.value.menuConfig
|
|
|
|
|
+
|
|
|
|
|
+ override fun updateMenuConfig(transform: (ReadMenuConfig) -> ReadMenuConfig) {
|
|
|
|
|
+ _uiState.update { it.copy(menuConfig = transform(it.menuConfig)) }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun refreshConfigSnapshots() {
|
|
|
|
|
+ _uiState.update {
|
|
|
|
|
+ it.copy(
|
|
|
|
|
+ styleConfig = buildStyleConfig(),
|
|
|
|
|
+ sheetConfig = buildSheetConfig(),
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun emitEffect(effect: ReadBookEffect) {
|
|
|
|
|
+ _effects.tryEmit(effect)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun resetDayNightReminderDismissal() {
|
|
|
|
|
+ hasDismissedDarkReminder = false
|
|
|
|
|
+ hasDismissedLightReminder = false
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ readSettingsRepository = readSettingsRepository,
|
|
|
|
|
+ readBookStyleConfigRepository = readBookStyleConfigRepository,
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
private val sysEngines: List<TextToSpeech.EngineInfo> by lazy {
|
|
private val sysEngines: List<TextToSpeech.EngineInfo> by lazy {
|
|
|
val tts = TextToSpeech(context, null)
|
|
val tts = TextToSpeech(context, null)
|
|
|
val engines = tts.engines
|
|
val engines = tts.engines
|
|
@@ -583,7 +616,7 @@ class ReadBookViewModel(
|
|
|
replaceRuleRepository.insert(intent.rule.copy(isEnabled = false))
|
|
replaceRuleRepository.insert(intent.rule.copy(isEnabled = false))
|
|
|
}
|
|
}
|
|
|
ReadBookIntent.DisableChineseConverter -> {
|
|
ReadBookIntent.DisableChineseConverter -> {
|
|
|
- handleConfigUpdate(ConfigUpdate.ChineseConverterType(0))
|
|
|
|
|
|
|
+ configUpdateDelegate.handle(ConfigUpdate.ChineseConverterType(0))
|
|
|
}
|
|
}
|
|
|
ReadBookIntent.DisableReSegment -> {
|
|
ReadBookIntent.DisableReSegment -> {
|
|
|
ReadBook.book?.setReSegment(false)
|
|
ReadBook.book?.setReSegment(false)
|
|
@@ -944,7 +977,7 @@ class ReadBookViewModel(
|
|
|
|
|
|
|
|
is ReadBookIntent.RemoveFromBookshelf -> removeFromBookshelf()
|
|
is ReadBookIntent.RemoveFromBookshelf -> removeFromBookshelf()
|
|
|
is ReadBookIntent.UpdateConfig -> {
|
|
is ReadBookIntent.UpdateConfig -> {
|
|
|
- handleConfigUpdate(intent.update)
|
|
|
|
|
|
|
+ configUpdateDelegate.handle(intent.update)
|
|
|
}
|
|
}
|
|
|
is ReadBookIntent.AddHighlightRule -> highlightRuleDelegate.startAddRule()
|
|
is ReadBookIntent.AddHighlightRule -> highlightRuleDelegate.startAddRule()
|
|
|
is ReadBookIntent.EditHighlightRule ->
|
|
is ReadBookIntent.EditHighlightRule ->
|
|
@@ -1538,7 +1571,7 @@ class ReadBookViewModel(
|
|
|
}
|
|
}
|
|
|
is ReadBookIntent.AddReadStyleConfig -> {
|
|
is ReadBookIntent.AddReadStyleConfig -> {
|
|
|
val newIndex = readBookStyleConfigRepository.addStyle()
|
|
val newIndex = readBookStyleConfigRepository.addStyle()
|
|
|
- handleConfigUpdate(ConfigUpdate.StyleSelect(newIndex))
|
|
|
|
|
|
|
+ configUpdateDelegate.handle(ConfigUpdate.StyleSelect(newIndex))
|
|
|
}
|
|
}
|
|
|
is ReadBookIntent.DeleteCurrentReadStyleConfig -> {
|
|
is ReadBookIntent.DeleteCurrentReadStyleConfig -> {
|
|
|
if (readBookStyleConfigRepository.deleteCurrentStyle()) {
|
|
if (readBookStyleConfigRepository.deleteCurrentStyle()) {
|
|
@@ -3507,802 +3540,6 @@ class ReadBookViewModel(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Suppress("LongMethod")
|
|
@Suppress("LongMethod")
|
|
|
- private fun handleConfigUpdate(update: ConfigUpdate) {
|
|
|
|
|
- val styleMutation = update.toReadStyleMutation()
|
|
|
|
|
- styleMutation?.let(readBookStyleConfigRepository::updateCurrentStyle)
|
|
|
|
|
- when (update) {
|
|
|
|
|
- // --- Text style ---
|
|
|
|
|
- is ConfigUpdate.TextSize,
|
|
|
|
|
- is ConfigUpdate.LetterSpacing,
|
|
|
|
|
- is ConfigUpdate.LineSpacing,
|
|
|
|
|
- is ConfigUpdate.ParagraphSpacing,
|
|
|
|
|
- is ConfigUpdate.ParagraphIndent,
|
|
|
|
|
- is ConfigUpdate.TextItalic,
|
|
|
|
|
- is ConfigUpdate.TextBold,
|
|
|
|
|
- is ConfigUpdate.TextColor,
|
|
|
|
|
- is ConfigUpdate.TextAccentColor -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Title style ---
|
|
|
|
|
- is ConfigUpdate.TitleMode,
|
|
|
|
|
- is ConfigUpdate.TitleBold,
|
|
|
|
|
- is ConfigUpdate.TitleSegScaling,
|
|
|
|
|
- is ConfigUpdate.TitleLineSpacingExtra,
|
|
|
|
|
- is ConfigUpdate.TitleLineSpacingSub,
|
|
|
|
|
- is ConfigUpdate.TitleSize,
|
|
|
|
|
- is ConfigUpdate.TitleTopSpacing,
|
|
|
|
|
- is ConfigUpdate.TitleBottomSpacing,
|
|
|
|
|
- is ConfigUpdate.TitleColor,
|
|
|
|
|
- is ConfigUpdate.TitleColorNight,
|
|
|
|
|
- is ConfigUpdate.TitleFont,
|
|
|
|
|
- is ConfigUpdate.TitleSegType,
|
|
|
|
|
- is ConfigUpdate.TitleSegDistance,
|
|
|
|
|
- is ConfigUpdate.TitleSegFlag -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Header / footer tips ---
|
|
|
|
|
- is ConfigUpdate.HeaderMode,
|
|
|
|
|
- is ConfigUpdate.FooterMode,
|
|
|
|
|
- is ConfigUpdate.TipHeaderLeft,
|
|
|
|
|
- is ConfigUpdate.TipHeaderMiddle,
|
|
|
|
|
- is ConfigUpdate.TipHeaderRight,
|
|
|
|
|
- is ConfigUpdate.TipFooterLeft,
|
|
|
|
|
- is ConfigUpdate.TipFooterMiddle,
|
|
|
|
|
- is ConfigUpdate.TipFooterRight,
|
|
|
|
|
- is ConfigUpdate.CustomTipHeaderLeft,
|
|
|
|
|
- is ConfigUpdate.CustomTipHeaderMiddle,
|
|
|
|
|
- is ConfigUpdate.CustomTipHeaderRight,
|
|
|
|
|
- is ConfigUpdate.CustomTipFooterLeft,
|
|
|
|
|
- is ConfigUpdate.CustomTipFooterMiddle,
|
|
|
|
|
- is ConfigUpdate.CustomTipFooterRight,
|
|
|
|
|
- is ConfigUpdate.HeaderFont,
|
|
|
|
|
- is ConfigUpdate.HeaderFontSize,
|
|
|
|
|
- is ConfigUpdate.FooterFont,
|
|
|
|
|
- is ConfigUpdate.FooterFontSize,
|
|
|
|
|
- is ConfigUpdate.ApplyHeaderStyle,
|
|
|
|
|
- is ConfigUpdate.TipHeaderColor,
|
|
|
|
|
- is ConfigUpdate.TipHeaderColorNight,
|
|
|
|
|
- is ConfigUpdate.TipFooterColor,
|
|
|
|
|
- is ConfigUpdate.TipFooterColorNight,
|
|
|
|
|
- is ConfigUpdate.TipDividerColor -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Layout / style ---
|
|
|
|
|
- is ConfigUpdate.StyleSelect -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setStyleSelect(ReadSessionState.isComic, update.index)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ShareLayout -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setShareLayout(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.PageAnim -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Menu appearance ---
|
|
|
|
|
- is ConfigUpdate.MenuBgColor -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBgColor(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuAccentColor -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuAccentColor(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuContainerColor -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuContainerColor(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuBgColorNight -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBgColorNight(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuAccentColorNight -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuAccentColorNight(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuContainerColorNight -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuContainerColorNight(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuTextColor -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuTextColor(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readMenuTextColor = update.color))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuTextColorNight -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuTextColorNight(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readMenuTextColorNight = update.color))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuColorMode -> {
|
|
|
|
|
- val value = update.value.coerceIn(0, 1)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuColorMode(value)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ReadBarStyle -> {
|
|
|
|
|
- val value = update.value.coerceIn(0, 2)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadBarStyle(value)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // --- Menu bar border ---
|
|
|
|
|
- is ConfigUpdate.BorderWidth -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBorderWidth(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuBorderWidth = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.BorderColor -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBorderColor(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuBorderColor = update.color)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.BorderColorNight -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBorderColorNight(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuBorderColorNight = update.color)) }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // --- Shadow ---
|
|
|
|
|
- is ConfigUpdate.TextShadow,
|
|
|
|
|
- is ConfigUpdate.ShadowRadius,
|
|
|
|
|
- is ConfigUpdate.ShadowDx,
|
|
|
|
|
- is ConfigUpdate.ShadowDy,
|
|
|
|
|
- is ConfigUpdate.ShadowColor -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Underline ---
|
|
|
|
|
- is ConfigUpdate.Underline,
|
|
|
|
|
- is ConfigUpdate.DottedLine,
|
|
|
|
|
- is ConfigUpdate.UnderlineExtend,
|
|
|
|
|
- is ConfigUpdate.UnderlineHeight,
|
|
|
|
|
- is ConfigUpdate.UnderlinePadding,
|
|
|
|
|
- is ConfigUpdate.DottedBase,
|
|
|
|
|
- is ConfigUpdate.DottedRatio,
|
|
|
|
|
- is ConfigUpdate.UnderlineColor -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Body padding ---
|
|
|
|
|
- is ConfigUpdate.PaddingTop,
|
|
|
|
|
- is ConfigUpdate.PaddingBottom,
|
|
|
|
|
- is ConfigUpdate.PaddingLeft,
|
|
|
|
|
- is ConfigUpdate.PaddingRight -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Header padding ---
|
|
|
|
|
- is ConfigUpdate.HeaderPaddingTop,
|
|
|
|
|
- is ConfigUpdate.HeaderPaddingBottom,
|
|
|
|
|
- is ConfigUpdate.HeaderPaddingLeft,
|
|
|
|
|
- is ConfigUpdate.HeaderPaddingRight,
|
|
|
|
|
- is ConfigUpdate.ShowHeaderLine -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Footer padding ---
|
|
|
|
|
- is ConfigUpdate.FooterPaddingTop,
|
|
|
|
|
- is ConfigUpdate.FooterPaddingBottom,
|
|
|
|
|
- is ConfigUpdate.FooterPaddingLeft,
|
|
|
|
|
- is ConfigUpdate.FooterPaddingRight,
|
|
|
|
|
- is ConfigUpdate.ShowFooterLine -> Unit
|
|
|
|
|
-
|
|
|
|
|
- // --- Background / display ---
|
|
|
|
|
- is ConfigUpdate.BgStr,
|
|
|
|
|
- is ConfigUpdate.BgStrNight,
|
|
|
|
|
- is ConfigUpdate.BgStrEInk,
|
|
|
|
|
- is ConfigUpdate.BgType,
|
|
|
|
|
- is ConfigUpdate.BgTypeNight,
|
|
|
|
|
- is ConfigUpdate.BgTypeEInk,
|
|
|
|
|
- is ConfigUpdate.BgAlpha,
|
|
|
|
|
- is ConfigUpdate.StatusIconDark,
|
|
|
|
|
- is ConfigUpdate.StyleName -> Unit
|
|
|
|
|
- is ConfigUpdate.MenuIconShowText -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuIconShowText(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuIconShowText = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuIconStyle -> {
|
|
|
|
|
- val value = update.value.coerceIn(0, 2)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuIconStyle(value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuIconStyle = value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.TitleBarIconStyle -> {
|
|
|
|
|
- val value = update.value.coerceIn(0, 2)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setTitleBarIconStyle(value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(titleBarIconStyle = value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuIconItemsPerRow -> {
|
|
|
|
|
- val value = update.value.coerceIn(2, 8)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuIconItemsPerRow(value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuIconItemsPerRow = value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuIconRowCount -> {
|
|
|
|
|
- val value = update.value.coerceIn(1, 2)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuIconRowCount(value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuIconRowCount = value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuBottomCornerRadius -> {
|
|
|
|
|
- val value = update.value.coerceIn(0, 32)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBottomCornerRadius(value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuBottomCornerRadius = value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.FloatingBottomBar -> {
|
|
|
|
|
- val needsBlurFallback = !update.value &&
|
|
|
|
|
- _uiState.value.menuConfig.readMenuBottomBarBlurMode ==
|
|
|
|
|
- ReadMenuBlurMode.LiquidGlass
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuFloatingBottomBar(update.value)
|
|
|
|
|
- if (needsBlurFallback) {
|
|
|
|
|
- readSettingsRepository.setReadMenuBottomBarBlurMode(ReadMenuBlurMode.Haze)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(
|
|
|
|
|
- menuConfig = it.menuConfig.copy(
|
|
|
|
|
- readMenuFloatingBottomBar = update.value,
|
|
|
|
|
- readMenuBottomBarBlurMode = if (needsBlurFallback) ReadMenuBlurMode.Haze
|
|
|
|
|
- else it.menuConfig.readMenuBottomBarBlurMode,
|
|
|
|
|
- )
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ShowMenuIcon -> {
|
|
|
|
|
- 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
|
|
|
|
|
- }
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuTopBarBlurMode(mode)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readMenuTopBarBlurMode = mode))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- is ConfigUpdate.MenuBottomBarBlurMode -> {
|
|
|
|
|
- val mode = update.value.coerceIn(0, 2)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBottomBarBlurMode(mode)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readMenuBottomBarBlurMode = mode))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- is ConfigUpdate.MenuTopBarLiquidGlassButtons -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuTopBarLiquidGlassButtons(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readMenuTopBarLiquidGlassButtons = update.value))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- is ConfigUpdate.MenuTopBarTitleCapsule -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuTopBarTitleCapsule(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readMenuTopBarTitleCapsule = update.value))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- is ConfigUpdate.MenuBottomBarLiquidGlassButtons -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBottomBarLiquidGlassButtons(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readMenuBottomBarLiquidGlassButtons = update.value))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- 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
|
|
|
|
|
- }
|
|
|
|
|
- val style = update.style.coerceIn(0, 1)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuTopBarBlurMode(mode)
|
|
|
|
|
- readSettingsRepository.setReadMenuTopBarBlurStyle(style)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(
|
|
|
|
|
- menuConfig = it.menuConfig.copy(
|
|
|
|
|
- readMenuTopBarBlurMode = mode,
|
|
|
|
|
- readMenuTopBarBlurStyle = style,
|
|
|
|
|
- )
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- is ConfigUpdate.MenuBottomBarBlurStyle -> {
|
|
|
|
|
- val style = update.value.coerceIn(0, 1)
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBottomBarBlurStyle(style)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readMenuBottomBarBlurStyle = style))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuBlurRadius -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBlurRadius(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuBlurRadius = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuBlurAlpha -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBlurAlpha(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuBlurAlpha = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuBlurColor -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBlurColor(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuBlurColor = update.color)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuBlurColorNight -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuBlurColorNight(update.color)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuBlurColorNight = update.color)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuPaletteStyle -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuPaletteStyle(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuPaletteStyle = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuLensRadius -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuLensRadius(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuLensRadius = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MenuCustomIcon -> {
|
|
|
|
|
- val icons = ReadBookConfig.readMenuCustomIcons.toMutableMap()
|
|
|
|
|
- if (update.path.isBlank()) {
|
|
|
|
|
- icons.remove(update.id)?.let { path ->
|
|
|
|
|
- runCatching { java.io.File(path).delete() }
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- icons[update.id] = update.path
|
|
|
|
|
- }
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadMenuCustomIcons(
|
|
|
|
|
- ReadBookConfig.encodeReadMenuCustomIcons(icons)
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(readMenuCustomIcons = icons.toImmutableMap())) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.TitleBarCustomIcon -> {
|
|
|
|
|
- val icons = ReadBookConfig.titleBarCustomIcons.toMutableMap()
|
|
|
|
|
- if (update.path.isBlank()) {
|
|
|
|
|
- icons.remove(update.id)?.let { path ->
|
|
|
|
|
- runCatching { java.io.File(path).delete() }
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- icons[update.id] = update.path
|
|
|
|
|
- }
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setTitleBarCustomIcons(
|
|
|
|
|
- ReadBookConfig.encodeReadMenuCustomIcons(icons)
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(titleBarCustomIcons = icons.toImmutableMap())) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.TitleBarIconPosition -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setTitleBarIconPosition(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(titleBarIconPosition = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ShowTitleBarIcons -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setShowTitleBarIcons(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(showTitleBarIcons = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.TitleBarCompact -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.update { it.copy(titleBarCompact = update.value) }
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update { it.copy(menuConfig = it.menuConfig.copy(titleBarCompact = update.value)) }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // --- System UI (also persists to DataStore) ---
|
|
|
|
|
- is ConfigUpdate.HideStatusBar -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setHideStatusBar(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.HideNavigationBar -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setHideNavigationBar(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // --- Display toggles ---
|
|
|
|
|
- is ConfigUpdate.PaddingDisplayCutouts -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setPaddingDisplayCutouts(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.TitleBarMode -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setTitleBarMode(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ReadBodyToLh -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadBodyToLh(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.DefaultSourceChangeAll -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setDefaultSourceChangeAll(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.TextFullJustify -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setTextFullJustify(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.TextBottomJustify -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setTextBottomJustify(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.AdaptSpecialStyle -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setAdaptSpecialStyle(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.UseZhLayout -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setUseZhLayout(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ShowBrightnessView -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setShowBrightnessView(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(showBrightnessView = update.value))
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(PreferKey.showBrightnessView, "")
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- is ConfigUpdate.BrightnessVwPos -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setBrightnessVwPos(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(brightnessVwPos = update.value))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- is ConfigUpdate.BrightnessAuto -> {
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(brightnessAuto = update.value))
|
|
|
|
|
- }
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setBrightnessAuto(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _effects.tryEmit(
|
|
|
|
|
- ReadBookEffect.ToggleBrightnessAuto(
|
|
|
|
|
- update.value,
|
|
|
|
|
- _uiState.value.menuConfig.readBrightness
|
|
|
|
|
- )
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.UseUnderlineGlobal -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setUseUnderline(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ReadSliderMode -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setReadSliderMode(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(menuConfig = it.menuConfig.copy(readSliderMode = update.value))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.DoubleHorizontalPage -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setDoubleHorizontalPage(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ProgressBarBehavior -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setProgressBarBehavior(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.MouseWheelPage -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setMouseWheelPage(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.VolumeKeyPage -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setVolumeKeyPage(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.VolumeKeyPageOnPlay -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setVolumeKeyPageOnPlay(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.KeyPageOnLongPress -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setKeyPageOnLongPress(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.SliderVibrator -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setSliderVibrator(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.SelectVibrator -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setSelectVibrator(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.AutoChangeSource -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setAutoChangeSource(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.AutoSuggestDayNight -> {
|
|
|
|
|
- if (update.value) {
|
|
|
|
|
- hasDismissedDarkReminder = false
|
|
|
|
|
- hasDismissedLightReminder = false
|
|
|
|
|
- }
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setAutoSuggestDayNight(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.SelectText -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setSelectText(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _effects.tryEmit(ReadBookEffect.UpTextSelectAble(update.value))
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.NoAnimScrollPage -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setNoAnimScrollPage(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- _effects.tryEmit(ReadBookEffect.UpPageAnim(upRecorder = false))
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.OptimizeRender -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setOptimizeRender(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ClickImgWay -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setClickImgWay(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.DisableReturnKey -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setDisableReturnKey(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ExpandTextMenu -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setExpandTextMenu(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ShowSelectMenuIcon -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setShowSelectMenuIcon(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- is ConfigUpdate.ShowReadTitleAddition -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setShowReadTitleAddition(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // --- Auto read ---
|
|
|
|
|
- is ConfigUpdate.AutoReadSpeed -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setAutoReadSpeed(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // --- Chinese converter ---
|
|
|
|
|
- is ConfigUpdate.ChineseConverterType -> {
|
|
|
|
|
- viewModelScope.launch {
|
|
|
|
|
- readSettingsRepository.setChineseConverterType(update.value)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 走了 gateway 的更新由 collectReadStyle 重建快照;只写 DataStore 的更新
|
|
|
|
|
- // 不经 gateway,需在此手工重建——且必须两份一起,
|
|
|
|
|
- // 否则像 ChineseConverterType 这种本就在 sheetConfig 里的项会一直显示旧值。
|
|
|
|
|
- if (styleMutation == null) {
|
|
|
|
|
- _uiState.update {
|
|
|
|
|
- it.copy(
|
|
|
|
|
- styleConfig = buildStyleConfig(),
|
|
|
|
|
- sheetConfig = buildSheetConfig(),
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if (update.actions.isNotEmpty()) {
|
|
|
|
|
- _effects.tryEmit(ReadBookEffect.UpdateReadViewConfig(update.actions))
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private fun ConfigUpdate.toReadStyleMutation(): ReadStyleMutation? = when (this) {
|
|
|
|
|
- is ConfigUpdate.TextSize -> intMutation(ReadStyleIntKey.TextSize, value)
|
|
|
|
|
- is ConfigUpdate.LetterSpacing -> floatMutation(ReadStyleFloatKey.LetterSpacing, value)
|
|
|
|
|
- is ConfigUpdate.LineSpacing -> intMutation(ReadStyleIntKey.LineSpacing, value)
|
|
|
|
|
- is ConfigUpdate.ParagraphSpacing -> intMutation(ReadStyleIntKey.ParagraphSpacing, value)
|
|
|
|
|
- is ConfigUpdate.ParagraphIndent -> stringMutation(ReadStyleStringKey.ParagraphIndent, value)
|
|
|
|
|
- is ConfigUpdate.TextItalic -> booleanMutation(ReadStyleBooleanKey.TextItalic, value)
|
|
|
|
|
- is ConfigUpdate.TextBold -> intMutation(ReadStyleIntKey.TextBold, value)
|
|
|
|
|
- is ConfigUpdate.TextColor -> colorMutation(ReadStyleColorKey.Text, color)
|
|
|
|
|
- is ConfigUpdate.TextAccentColor -> colorMutation(ReadStyleColorKey.TextAccent, color)
|
|
|
|
|
- is ConfigUpdate.TitleMode -> intMutation(ReadStyleIntKey.TitleMode, value)
|
|
|
|
|
- is ConfigUpdate.TitleBold -> intMutation(ReadStyleIntKey.TitleBold, value)
|
|
|
|
|
- is ConfigUpdate.TitleSegScaling -> floatMutation(ReadStyleFloatKey.TitleSegScaling, value)
|
|
|
|
|
- is ConfigUpdate.TitleLineSpacingExtra ->
|
|
|
|
|
- intMutation(ReadStyleIntKey.TitleLineSpacingExtra, value)
|
|
|
|
|
- is ConfigUpdate.TitleLineSpacingSub ->
|
|
|
|
|
- intMutation(ReadStyleIntKey.TitleLineSpacingSub, value)
|
|
|
|
|
- is ConfigUpdate.TitleSize -> intMutation(ReadStyleIntKey.TitleSize, value)
|
|
|
|
|
- is ConfigUpdate.TitleTopSpacing -> intMutation(ReadStyleIntKey.TitleTopSpacing, value)
|
|
|
|
|
- is ConfigUpdate.TitleBottomSpacing ->
|
|
|
|
|
- intMutation(ReadStyleIntKey.TitleBottomSpacing, value)
|
|
|
|
|
- is ConfigUpdate.TitleColor -> colorMutation(ReadStyleColorKey.Title, color)
|
|
|
|
|
- is ConfigUpdate.TitleColorNight -> colorMutation(ReadStyleColorKey.TitleNight, color)
|
|
|
|
|
- is ConfigUpdate.TitleFont -> stringMutation(ReadStyleStringKey.TitleFont, path)
|
|
|
|
|
- is ConfigUpdate.TitleSegType -> intMutation(ReadStyleIntKey.TitleSegType, value)
|
|
|
|
|
- is ConfigUpdate.TitleSegDistance -> intMutation(ReadStyleIntKey.TitleSegDistance, value)
|
|
|
|
|
- is ConfigUpdate.TitleSegFlag -> stringMutation(ReadStyleStringKey.TitleSegFlag, value)
|
|
|
|
|
- is ConfigUpdate.HeaderMode -> intMutation(ReadStyleIntKey.HeaderMode, value)
|
|
|
|
|
- is ConfigUpdate.FooterMode -> intMutation(ReadStyleIntKey.FooterMode, value)
|
|
|
|
|
- is ConfigUpdate.TipHeaderLeft -> intMutation(ReadStyleIntKey.TipHeaderLeft, value)
|
|
|
|
|
- is ConfigUpdate.TipHeaderMiddle -> intMutation(ReadStyleIntKey.TipHeaderMiddle, value)
|
|
|
|
|
- is ConfigUpdate.TipHeaderRight -> intMutation(ReadStyleIntKey.TipHeaderRight, value)
|
|
|
|
|
- is ConfigUpdate.TipFooterLeft -> intMutation(ReadStyleIntKey.TipFooterLeft, value)
|
|
|
|
|
- is ConfigUpdate.TipFooterMiddle -> intMutation(ReadStyleIntKey.TipFooterMiddle, value)
|
|
|
|
|
- is ConfigUpdate.TipFooterRight -> intMutation(ReadStyleIntKey.TipFooterRight, value)
|
|
|
|
|
- is ConfigUpdate.HeaderFont -> stringMutation(ReadStyleStringKey.HeaderFont, path)
|
|
|
|
|
- is ConfigUpdate.FooterFont -> stringMutation(ReadStyleStringKey.FooterFont, path)
|
|
|
|
|
- is ConfigUpdate.CustomTipHeaderLeft ->
|
|
|
|
|
- stringMutation(ReadStyleStringKey.CustomTipHeaderLeft, value)
|
|
|
|
|
- is ConfigUpdate.CustomTipHeaderMiddle ->
|
|
|
|
|
- stringMutation(ReadStyleStringKey.CustomTipHeaderMiddle, value)
|
|
|
|
|
- is ConfigUpdate.CustomTipHeaderRight ->
|
|
|
|
|
- stringMutation(ReadStyleStringKey.CustomTipHeaderRight, value)
|
|
|
|
|
- is ConfigUpdate.CustomTipFooterLeft ->
|
|
|
|
|
- stringMutation(ReadStyleStringKey.CustomTipFooterLeft, value)
|
|
|
|
|
- is ConfigUpdate.CustomTipFooterMiddle ->
|
|
|
|
|
- stringMutation(ReadStyleStringKey.CustomTipFooterMiddle, value)
|
|
|
|
|
- is ConfigUpdate.CustomTipFooterRight ->
|
|
|
|
|
- stringMutation(ReadStyleStringKey.CustomTipFooterRight, value)
|
|
|
|
|
- is ConfigUpdate.HeaderFontSize -> intMutation(ReadStyleIntKey.HeaderFontSize, value)
|
|
|
|
|
- is ConfigUpdate.FooterFontSize -> intMutation(ReadStyleIntKey.FooterFontSize, value)
|
|
|
|
|
- is ConfigUpdate.ApplyHeaderStyle -> booleanMutation(ReadStyleBooleanKey.ApplyHeaderStyle, value)
|
|
|
|
|
- is ConfigUpdate.TipHeaderColor -> colorMutation(ReadStyleColorKey.TipHeader, color)
|
|
|
|
|
- is ConfigUpdate.TipHeaderColorNight ->
|
|
|
|
|
- colorMutation(ReadStyleColorKey.TipHeaderNight, color)
|
|
|
|
|
- is ConfigUpdate.TipFooterColor -> colorMutation(ReadStyleColorKey.TipFooter, color)
|
|
|
|
|
- is ConfigUpdate.TipFooterColorNight ->
|
|
|
|
|
- colorMutation(ReadStyleColorKey.TipFooterNight, color)
|
|
|
|
|
- is ConfigUpdate.TipDividerColor -> colorMutation(ReadStyleColorKey.TipDivider, color)
|
|
|
|
|
- is ConfigUpdate.PageAnim -> intMutation(ReadStyleIntKey.PageAnim, value)
|
|
|
|
|
- is ConfigUpdate.TextShadow -> booleanMutation(ReadStyleBooleanKey.TextShadow, value)
|
|
|
|
|
- is ConfigUpdate.ShadowRadius -> floatMutation(ReadStyleFloatKey.ShadowRadius, value)
|
|
|
|
|
- is ConfigUpdate.ShadowDx -> floatMutation(ReadStyleFloatKey.ShadowDx, value)
|
|
|
|
|
- is ConfigUpdate.ShadowDy -> floatMutation(ReadStyleFloatKey.ShadowDy, value)
|
|
|
|
|
- is ConfigUpdate.ShadowColor -> colorMutation(ReadStyleColorKey.Shadow, color)
|
|
|
|
|
- is ConfigUpdate.Underline -> booleanMutation(ReadStyleBooleanKey.Underline, value)
|
|
|
|
|
- is ConfigUpdate.DottedLine -> booleanMutation(ReadStyleBooleanKey.DottedLine, value)
|
|
|
|
|
- is ConfigUpdate.UnderlineExtend ->
|
|
|
|
|
- booleanMutation(ReadStyleBooleanKey.UnderlineExtend, value)
|
|
|
|
|
- is ConfigUpdate.UnderlineHeight -> intMutation(ReadStyleIntKey.UnderlineHeight, value)
|
|
|
|
|
- is ConfigUpdate.UnderlinePadding -> intMutation(ReadStyleIntKey.UnderlinePadding, value)
|
|
|
|
|
- is ConfigUpdate.DottedBase -> floatMutation(ReadStyleFloatKey.DottedBase, value)
|
|
|
|
|
- is ConfigUpdate.DottedRatio -> floatMutation(ReadStyleFloatKey.DottedRatio, value)
|
|
|
|
|
- is ConfigUpdate.UnderlineColor -> colorMutation(ReadStyleColorKey.Underline, color)
|
|
|
|
|
- is ConfigUpdate.PaddingTop -> intMutation(ReadStyleIntKey.PaddingTop, value)
|
|
|
|
|
- is ConfigUpdate.PaddingBottom -> intMutation(ReadStyleIntKey.PaddingBottom, value)
|
|
|
|
|
- is ConfigUpdate.PaddingLeft -> intMutation(ReadStyleIntKey.PaddingLeft, value)
|
|
|
|
|
- is ConfigUpdate.PaddingRight -> intMutation(ReadStyleIntKey.PaddingRight, value)
|
|
|
|
|
- is ConfigUpdate.HeaderPaddingTop -> intMutation(ReadStyleIntKey.HeaderPaddingTop, value)
|
|
|
|
|
- is ConfigUpdate.HeaderPaddingBottom ->
|
|
|
|
|
- intMutation(ReadStyleIntKey.HeaderPaddingBottom, value)
|
|
|
|
|
- is ConfigUpdate.HeaderPaddingLeft -> intMutation(ReadStyleIntKey.HeaderPaddingLeft, value)
|
|
|
|
|
- is ConfigUpdate.HeaderPaddingRight ->
|
|
|
|
|
- intMutation(ReadStyleIntKey.HeaderPaddingRight, value)
|
|
|
|
|
- is ConfigUpdate.ShowHeaderLine ->
|
|
|
|
|
- booleanMutation(ReadStyleBooleanKey.ShowHeaderLine, value)
|
|
|
|
|
- is ConfigUpdate.FooterPaddingTop -> intMutation(ReadStyleIntKey.FooterPaddingTop, value)
|
|
|
|
|
- is ConfigUpdate.FooterPaddingBottom ->
|
|
|
|
|
- intMutation(ReadStyleIntKey.FooterPaddingBottom, value)
|
|
|
|
|
- is ConfigUpdate.FooterPaddingLeft -> intMutation(ReadStyleIntKey.FooterPaddingLeft, value)
|
|
|
|
|
- is ConfigUpdate.FooterPaddingRight ->
|
|
|
|
|
- intMutation(ReadStyleIntKey.FooterPaddingRight, value)
|
|
|
|
|
- is ConfigUpdate.ShowFooterLine ->
|
|
|
|
|
- booleanMutation(ReadStyleBooleanKey.ShowFooterLine, value)
|
|
|
|
|
- is ConfigUpdate.BgStr -> stringMutation(ReadStyleStringKey.BgStr, value)
|
|
|
|
|
- is ConfigUpdate.BgStrNight -> stringMutation(ReadStyleStringKey.BgStrNight, value)
|
|
|
|
|
- is ConfigUpdate.BgStrEInk -> stringMutation(ReadStyleStringKey.BgStrEInk, value)
|
|
|
|
|
- is ConfigUpdate.BgType -> intMutation(ReadStyleIntKey.BgType, value)
|
|
|
|
|
- is ConfigUpdate.BgTypeNight -> intMutation(ReadStyleIntKey.BgTypeNight, value)
|
|
|
|
|
- is ConfigUpdate.BgTypeEInk -> intMutation(ReadStyleIntKey.BgTypeEInk, value)
|
|
|
|
|
- is ConfigUpdate.BgAlpha -> intMutation(ReadStyleIntKey.BgAlpha, value)
|
|
|
|
|
- is ConfigUpdate.StatusIconDark ->
|
|
|
|
|
- booleanMutation(ReadStyleBooleanKey.StatusIconDark, value)
|
|
|
|
|
- is ConfigUpdate.StyleName -> stringMutation(ReadStyleStringKey.StyleName, value)
|
|
|
|
|
- else -> null
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private fun intMutation(key: ReadStyleIntKey, value: Int) =
|
|
|
|
|
- ReadStyleMutation.IntValue(key, value)
|
|
|
|
|
-
|
|
|
|
|
- private fun floatMutation(key: ReadStyleFloatKey, value: Float) =
|
|
|
|
|
- ReadStyleMutation.FloatValue(key, value)
|
|
|
|
|
-
|
|
|
|
|
- private fun booleanMutation(key: ReadStyleBooleanKey, value: Boolean) =
|
|
|
|
|
- ReadStyleMutation.BooleanValue(key, value)
|
|
|
|
|
-
|
|
|
|
|
- private fun stringMutation(key: ReadStyleStringKey, value: String) =
|
|
|
|
|
- ReadStyleMutation.StringValue(key, value)
|
|
|
|
|
-
|
|
|
|
|
- private fun colorMutation(key: ReadStyleColorKey, value: Int) =
|
|
|
|
|
- ReadStyleMutation.ColorValue(key, value)
|
|
|
|
|
-
|
|
|
|
|
private fun saveMenuCustomIcon(id: String, uri: Uri) {
|
|
private fun saveMenuCustomIcon(id: String, uri: Uri) {
|
|
|
execute {
|
|
execute {
|
|
|
val iconFile = java.io.File(context.filesDir, "read_menu_icons/$id.png")
|
|
val iconFile = java.io.File(context.filesDir, "read_menu_icons/$id.png")
|
|
@@ -4310,7 +3547,7 @@ class ReadBookViewModel(
|
|
|
context.contentResolver.openInputStream(uri)?.use { input ->
|
|
context.contentResolver.openInputStream(uri)?.use { input ->
|
|
|
iconFile.outputStream().use { output -> input.copyTo(output) }
|
|
iconFile.outputStream().use { output -> input.copyTo(output) }
|
|
|
}
|
|
}
|
|
|
- handleConfigUpdate(ConfigUpdate.MenuCustomIcon(id, iconFile.absolutePath))
|
|
|
|
|
|
|
+ configUpdateDelegate.handle(ConfigUpdate.MenuCustomIcon(id, iconFile.absolutePath))
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -4321,7 +3558,7 @@ class ReadBookViewModel(
|
|
|
context.contentResolver.openInputStream(uri)?.use { input ->
|
|
context.contentResolver.openInputStream(uri)?.use { input ->
|
|
|
iconFile.outputStream().use { output -> input.copyTo(output) }
|
|
iconFile.outputStream().use { output -> input.copyTo(output) }
|
|
|
}
|
|
}
|
|
|
- handleConfigUpdate(ConfigUpdate.TitleBarCustomIcon(id, iconFile.absolutePath))
|
|
|
|
|
|
|
+ configUpdateDelegate.handle(ConfigUpdate.TitleBarCustomIcon(id, iconFile.absolutePath))
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|