Explorar o código

refactor: 收口书籍详情与阅读功能的配置依赖

扩展封面设置模型并由 BookInfoViewModel 汇总主题、封面和其他设置状态。

将有效替换规则及中文转换状态纳入 ReadBookUiState,通过 Intent 处理禁用操作,移除相关 Screen 和 Sheet 的配置单例访问。
5151561 hai 3 meses
pai
achega
a2acc6e562

+ 2 - 0
app/src/main/java/io/legado/app/data/repository/FeatureSettingsRepositories.kt

@@ -233,6 +233,8 @@ class CoverSettingsRepository : CoverSettingsGateway {
                 showAuthorDark = preferences.compatDsBoolean(PreferKey.coverShowAuthorN) ?: true,
                 showAuthorDark = preferences.compatDsBoolean(PreferKey.coverShowAuthorN) ?: true,
                 infoOrientation = preferences.compatDsString(PreferKey.coverInfoOrientation) ?: "0",
                 infoOrientation = preferences.compatDsString(PreferKey.coverInfoOrientation) ?: "0",
                 exploreFilterState = preferences.compatDsInt(PreferKey.exploreFilterState) ?: 0,
                 exploreFilterState = preferences.compatDsInt(PreferKey.exploreFilterState) ?: 0,
+                defaultCover = preferences.compatDsString(PreferKey.defaultCover).orEmpty(),
+                defaultCoverDark = preferences.compatDsString(PreferKey.defaultCoverDark).orEmpty(),
             )
             )
         }
         }
         .distinctUntilChanged()
         .distinctUntilChanged()

+ 1 - 0
app/src/main/java/io/legado/app/di/appModule.kt

@@ -422,6 +422,7 @@ val appModule = module {
             bookContentProcessGateway = get(),
             bookContentProcessGateway = get(),
             aiArtifactGateway = get(),
             aiArtifactGateway = get(),
             aiPromptPresetGateway = get(),
             aiPromptPresetGateway = get(),
+            replaceRuleRepository = get(),
         )
         )
     }
     }
     viewModelOf(::ChangeCoverViewModel)
     viewModelOf(::ChangeCoverViewModel)

+ 2 - 0
app/src/main/java/io/legado/app/domain/model/settings/CoverSettings.kt

@@ -16,4 +16,6 @@ data class CoverSettings(
     val showAuthorDark: Boolean = true,
     val showAuthorDark: Boolean = true,
     val infoOrientation: String = "0",
     val infoOrientation: String = "0",
     val exploreFilterState: Int = 0,
     val exploreFilterState: Int = 0,
+    val defaultCover: String = "",
+    val defaultCoverDark: String = "",
 )
 )

+ 6 - 0
app/src/main/java/io/legado/app/ui/book/info/BookInfoContract.kt

@@ -40,6 +40,12 @@ data class BookInfoUiState(
     val showAppLogSheet: Boolean = false,
     val showAppLogSheet: Boolean = false,
     val sheet: BookInfoSheet = BookInfoSheet.None,
     val sheet: BookInfoSheet = BookInfoSheet.None,
     val dialog: BookInfoDialog? = null,
     val dialog: BookInfoDialog? = null,
+    val bookInfoFollowCoverColor: Boolean = true,
+    val bookInfoNetworkCoverBackground: String = "on",
+    val bookInfoDefaultCoverBackground: String = "on",
+    val loadCoverOnlyOnWifi: Boolean = false,
+    val defaultCover: String = "",
+    val defaultCoverDark: String = "",
 )
 )
 
 
 @Stable
 @Stable

+ 23 - 8
app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt

@@ -76,8 +76,6 @@ import io.legado.app.R
 import io.legado.app.constant.BookType
 import io.legado.app.constant.BookType
 import io.legado.app.data.entities.SearchBook
 import io.legado.app.data.entities.SearchBook
 import io.legado.app.data.entities.BookGroup
 import io.legado.app.data.entities.BookGroup
-import io.legado.app.ui.config.coverConfig.CoverConfig
-import io.legado.app.ui.config.themeConfig.ThemeConfig
 import io.legado.app.ui.main.homepage.modules.BannerModule
 import io.legado.app.ui.main.homepage.modules.BannerModule
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LocalHazeState
 import io.legado.app.ui.theme.LocalHazeState
@@ -162,11 +160,22 @@ fun BookInfoScreen(
     ) {
     ) {
         mutableStateOf(initiallyUsesDefaultCover)
         mutableStateOf(initiallyUsesDefaultCover)
     }
     }
-    val backdropStyle = state.book?.let { resolveBookInfoBackdropStyle(it, usesDefaultCover) }
+    val backdropStyle = state.book?.let {
+        resolveBookInfoBackdropStyle(
+            book = it,
+            usesDefaultCover = usesDefaultCover,
+            defaultCoverBackground = state.bookInfoDefaultCoverBackground,
+            networkCoverBackground = state.bookInfoNetworkCoverBackground,
+        )
+    }
     val bookColorTheme = rememberBookInfoColorTheme(
     val bookColorTheme = rememberBookInfoColorTheme(
         book = state.book,
         book = state.book,
         enabled = backdropStyle?.showCover == true,
         enabled = backdropStyle?.showCover == true,
         usesDefaultCover = usesDefaultCover,
         usesDefaultCover = usesDefaultCover,
+        followCoverColor = state.bookInfoFollowCoverColor,
+        defaultCover = state.defaultCover,
+        defaultCoverDark = state.defaultCoverDark,
+        loadCoverOnlyOnWifi = state.loadCoverOnlyOnWifi,
     )
     )
 
 
     BookInfoColorTheme(theme = bookColorTheme.takeIf {
     BookInfoColorTheme(theme = bookColorTheme.takeIf {
@@ -520,11 +529,15 @@ private fun rememberBookInfoColorTheme(
     book: BookInfoBookUi?,
     book: BookInfoBookUi?,
     enabled: Boolean,
     enabled: Boolean,
     usesDefaultCover: Boolean,
     usesDefaultCover: Boolean,
+    followCoverColor: Boolean,
+    defaultCover: String,
+    defaultCoverDark: String,
+    loadCoverOnlyOnWifi: Boolean,
 ): ThemeOverrideState? {
 ): ThemeOverrideState? {
     if (
     if (
         book == null ||
         book == null ||
         !enabled ||
         !enabled ||
-        !ThemeConfig.bookInfoFollowCoverColor
+        !followCoverColor
     ) {
     ) {
         return null
         return null
     }
     }
@@ -532,7 +545,7 @@ private fun rememberBookInfoColorTheme(
     val imageLoader = koinInject<ImageLoader>()
     val imageLoader = koinInject<ImageLoader>()
     val isNight = LegadoTheme.isDark
     val isNight = LegadoTheme.isDark
     val defaultCoverPaths =
     val defaultCoverPaths =
-        if (isNight) CoverConfig.defaultCoverDark else CoverConfig.defaultCover
+        if (isNight) defaultCoverDark else defaultCover
     val coverPath = remember(
     val coverPath = remember(
         book.name,
         book.name,
         book.author,
         book.author,
@@ -551,7 +564,7 @@ private fun rememberBookInfoColorTheme(
         }
         }
     } ?: return null
     } ?: return null
     val sourceOrigin = if (usesDefaultCover) null else book.origin
     val sourceOrigin = if (usesDefaultCover) null else book.origin
-    val loadOnlyWifi = !usesDefaultCover && CoverConfig.loadCoverOnlyWifi
+    val loadOnlyWifi = !usesDefaultCover && loadCoverOnlyOnWifi
     val requestKey = remember(coverPath, sourceOrigin, loadOnlyWifi) {
     val requestKey = remember(coverPath, sourceOrigin, loadOnlyWifi) {
         listOf(coverPath, sourceOrigin, loadOnlyWifi)
         listOf(coverPath, sourceOrigin, loadOnlyWifi)
     }
     }
@@ -571,11 +584,13 @@ private fun rememberBookInfoColorTheme(
 private fun resolveBookInfoBackdropStyle(
 private fun resolveBookInfoBackdropStyle(
     book: BookInfoBookUi,
     book: BookInfoBookUi,
     usesDefaultCover: Boolean,
     usesDefaultCover: Boolean,
+    defaultCoverBackground: String,
+    networkCoverBackground: String,
 ): BookInfoBackdropStyle {
 ): BookInfoBackdropStyle {
     val backgroundMode = if (usesDefaultCover) {
     val backgroundMode = if (usesDefaultCover) {
-        ThemeConfig.bookInfoDefaultCoverBackground
+        defaultCoverBackground
     } else {
     } else {
-        ThemeConfig.bookInfoNetworkCoverBackground
+        networkCoverBackground
     }
     }
     return resolveBookInfoBackdropStyle(backgroundMode)
     return resolveBookInfoBackdropStyle(backgroundMode)
 }
 }

+ 26 - 0
app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt

@@ -25,6 +25,8 @@ import io.legado.app.data.repository.BookGroupRepository
 import io.legado.app.data.repository.ReadRecordRepository
 import io.legado.app.data.repository.ReadRecordRepository
 import io.legado.app.data.repository.RemoteBookRepository
 import io.legado.app.data.repository.RemoteBookRepository
 import io.legado.app.domain.usecase.ChangeBookSourceUseCase
 import io.legado.app.domain.usecase.ChangeBookSourceUseCase
+import io.legado.app.domain.gateway.ThemeSettingsGateway
+import io.legado.app.domain.gateway.CoverSettingsGateway
 import io.legado.app.domain.usecase.ChangeSourceMigrationOptions
 import io.legado.app.domain.usecase.ChangeSourceMigrationOptions
 import io.legado.app.domain.usecase.ClearBookCacheUseCase
 import io.legado.app.domain.usecase.ClearBookCacheUseCase
 import io.legado.app.exception.NoBooksDirException
 import io.legado.app.exception.NoBooksDirException
@@ -94,6 +96,8 @@ class BookInfoViewModel(
     private val clearBookCacheUseCase: ClearBookCacheUseCase,
     private val clearBookCacheUseCase: ClearBookCacheUseCase,
     private val bookGroupRepository: BookGroupRepository,
     private val bookGroupRepository: BookGroupRepository,
     private val imageLoader: ImageLoader,
     private val imageLoader: ImageLoader,
+    private val themeSettingsGateway: ThemeSettingsGateway,
+    private val coverSettingsGateway: CoverSettingsGateway,
 ) : BaseViewModel(application) {
 ) : BaseViewModel(application) {
 
 
     val allGroups = bookGroupRepository.flowSelect().map { it.toImmutableList() }
     val allGroups = bookGroupRepository.flowSelect().map { it.toImmutableList() }
@@ -106,6 +110,28 @@ class BookInfoViewModel(
 
 
     init {
     init {
         collectEventBus()
         collectEventBus()
+        collectAppearanceSettings()
+    }
+
+    private fun collectAppearanceSettings() {
+        viewModelScope.launch {
+            combine(
+                themeSettingsGateway.settings,
+                coverSettingsGateway.settings,
+            ) { theme, cover -> theme to cover }
+                .collectLatest { (theme, cover) ->
+                    _uiState.update {
+                        it.copy(
+                            bookInfoFollowCoverColor = theme.bookInfoFollowCoverColor,
+                            bookInfoNetworkCoverBackground = theme.bookInfoNetworkCoverBackground,
+                            bookInfoDefaultCoverBackground = theme.bookInfoDefaultCoverBackground,
+                            loadCoverOnlyOnWifi = cover.loadOnlyOnWifi,
+                            defaultCover = cover.defaultCover,
+                            defaultCoverDark = cover.defaultCoverDark,
+                        )
+                    }
+                }
+        }
     }
     }
 
 
     private fun collectEventBus() {
     private fun collectEventBus() {

+ 6 - 0
app/src/main/java/io/legado/app/ui/book/read/ReadBookContract.kt

@@ -9,6 +9,7 @@ import io.legado.app.data.entities.Book
 import io.legado.app.data.entities.BookChapter
 import io.legado.app.data.entities.BookChapter
 import io.legado.app.data.entities.BookProgress
 import io.legado.app.data.entities.BookProgress
 import io.legado.app.data.entities.BookSource
 import io.legado.app.data.entities.BookSource
+import io.legado.app.data.entities.ReplaceRule
 import io.legado.app.data.entities.Bookmark
 import io.legado.app.data.entities.Bookmark
 import io.legado.app.data.entities.HighlightRule
 import io.legado.app.data.entities.HighlightRule
 import io.legado.app.data.entities.HttpTTS
 import io.legado.app.data.entities.HttpTTS
@@ -199,6 +200,8 @@ data class ReadBookUiState(
     val replaceRuleEnabled: Boolean = false,
     val replaceRuleEnabled: Boolean = false,
     val effectiveReplaceCount: Int = 0,
     val effectiveReplaceCount: Int = 0,
     val effectiveContentProcessCount: Int = 0,
     val effectiveContentProcessCount: Int = 0,
+    val effectiveReplaceRules: ImmutableList<ReplaceRule> = persistentListOf(),
+    val chineseConverterActive: Boolean = false,
     // Translation
     // Translation
     val translationMode: Boolean = false,
     val translationMode: Boolean = false,
     // Chapter info
     // Chapter info
@@ -514,6 +517,9 @@ sealed interface ReadBookIntent {
     // Replace editor (needs Activity context for ActivityResult)
     // Replace editor (needs Activity context for ActivityResult)
     data class OpenReplaceEditor(val id: Long, val pattern: String?) : ReadBookIntent
     data class OpenReplaceEditor(val id: Long, val pattern: String?) : ReadBookIntent
     data object ReplaceRuleChanged : ReadBookIntent
     data object ReplaceRuleChanged : ReadBookIntent
+    data class DisableEffectiveReplace(val rule: ReplaceRule) : ReadBookIntent
+    data object DisableChineseConverter : ReadBookIntent
+    data object DisableReSegment : ReadBookIntent
 
 
     // Font folder picker (needs Activity context for ActivityResult)
     // Font folder picker (needs Activity context for ActivityResult)
     data object OpenFontFolderPicker : ReadBookIntent
     data object OpenFontFolderPicker : ReadBookIntent

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

@@ -162,6 +162,9 @@ fun ReadBookScreen(
     )
     )
     EffectiveReplacesSheet(
     EffectiveReplacesSheet(
         show = state.activeSheet is ReadBookSheet.EffectiveReplaces,
         show = state.activeSheet is ReadBookSheet.EffectiveReplaces,
+        effectiveRules = state.effectiveReplaceRules,
+        chineseConvertActive = state.chineseConverterActive,
+        reSegmentActive = state.reSegment,
         onDismissRequest = dismissSheet,
         onDismissRequest = dismissSheet,
         onOpenReplaceEditor = { id, pattern ->
         onOpenReplaceEditor = { id, pattern ->
             onIntent(ReadBookIntent.OpenReplaceEditor(id, pattern))
             onIntent(ReadBookIntent.OpenReplaceEditor(id, pattern))
@@ -174,6 +177,9 @@ fun ReadBookScreen(
         onOpenContentProcesses = {
         onOpenContentProcesses = {
             onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.ContentProcesses))
             onIntent(ReadBookIntent.ShowSheet(ReadBookSheet.ContentProcesses))
         },
         },
+        onDisableRule = { onIntent(ReadBookIntent.DisableEffectiveReplace(it)) },
+        onDisableChineseConverter = { onIntent(ReadBookIntent.DisableChineseConverter) },
+        onDisableReSegment = { onIntent(ReadBookIntent.DisableReSegment) },
     )
     )
     ContentProcessesSheet(
     ContentProcessesSheet(
         show = state.activeSheet is ReadBookSheet.ContentProcesses,
         show = state.activeSheet is ReadBookSheet.ContentProcesses,

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

@@ -34,6 +34,7 @@ import io.legado.app.data.repository.SettingsRepository
 import io.legado.app.data.repository.HighlightRuleRepository
 import io.legado.app.data.repository.HighlightRuleRepository
 import io.legado.app.data.repository.ReadAloudSettingsRepository
 import io.legado.app.data.repository.ReadAloudSettingsRepository
 import io.legado.app.data.repository.ReadBookStyleConfigRepository
 import io.legado.app.data.repository.ReadBookStyleConfigRepository
+import io.legado.app.data.repository.ReplaceRuleRepository
 import io.legado.app.data.repository.ReadPreferences
 import io.legado.app.data.repository.ReadPreferences
 import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.data.repository.ReadSettingsRepository
 import io.legado.app.data.repository.UploadRepository
 import io.legado.app.data.repository.UploadRepository
@@ -171,6 +172,7 @@ class ReadBookViewModel(
     private val bookContentProcessGateway: BookContentProcessGateway,
     private val bookContentProcessGateway: BookContentProcessGateway,
     private val aiArtifactGateway: AiArtifactGateway,
     private val aiArtifactGateway: AiArtifactGateway,
     private val aiPromptPresetGateway: AiPromptPresetGateway,
     private val aiPromptPresetGateway: AiPromptPresetGateway,
+    private val replaceRuleRepository: ReplaceRuleRepository,
 ) : BaseViewModel(application), ReadBook.CallBack {
 ) : BaseViewModel(application), ReadBook.CallBack {
 
 
     // --- MVI State ---
     // --- MVI State ---
@@ -373,6 +375,17 @@ class ReadBookViewModel(
             is ReadBookIntent.RefreshAllChapters -> refreshAllChapters()
             is ReadBookIntent.RefreshAllChapters -> refreshAllChapters()
             is ReadBookIntent.RefreshContentAfter -> refreshContentAfter()
             is ReadBookIntent.RefreshContentAfter -> refreshContentAfter()
             is ReadBookIntent.ChangeReplaceRule -> changeReplaceRule(intent.enabled)
             is ReadBookIntent.ChangeReplaceRule -> changeReplaceRule(intent.enabled)
+            is ReadBookIntent.DisableEffectiveReplace -> viewModelScope.launch {
+                replaceRuleRepository.insert(intent.rule.copy(isEnabled = false))
+            }
+            ReadBookIntent.DisableChineseConverter -> {
+                handleConfigUpdate(ConfigUpdate.ChineseConverterType(0))
+            }
+            ReadBookIntent.DisableReSegment -> {
+                ReadBook.book?.setReSegment(false)
+                ReadBook.loadContent(false)
+                _uiState.update { it.copy(reSegment = false) }
+            }
             is ReadBookIntent.ToggleTranslation -> toggleTranslation()
             is ReadBookIntent.ToggleTranslation -> toggleTranslation()
             is ReadBookIntent.OpenChapterSummary -> openChapterSummary()
             is ReadBookIntent.OpenChapterSummary -> openChapterSummary()
             is ReadBookIntent.OpenAiCurrentChapterRewrite -> openAiCurrentChapterRewrite()
             is ReadBookIntent.OpenAiCurrentChapterRewrite -> openAiCurrentChapterRewrite()
@@ -2049,6 +2062,8 @@ class ReadBookViewModel(
             replaceRuleEnabled = book?.getUseReplaceRule() ?: false,
             replaceRuleEnabled = book?.getUseReplaceRule() ?: false,
             effectiveReplaceCount = textChapter?.effectiveReplaceRules?.size ?: 0,
             effectiveReplaceCount = textChapter?.effectiveReplaceRules?.size ?: 0,
             effectiveContentProcessCount = textChapter?.effectiveContentProcesses?.size ?: 0,
             effectiveContentProcessCount = textChapter?.effectiveContentProcesses?.size ?: 0,
+            effectiveReplaceRules = textChapter?.effectiveReplaceRules.orEmpty().toImmutableList(),
+            chineseConverterActive = ReadConfig.chineseConverterType > 0,
             translationMode = book?.getTranslationMode() ?: false,
             translationMode = book?.getTranslationMode() ?: false,
             isLocalTxt = book?.isLocalTxt == true,
             isLocalTxt = book?.isLocalTxt == true,
             isEpub = book?.isEpub == true,
             isEpub = book?.isEpub == true,

+ 9 - 19
app/src/main/java/io/legado/app/ui/book/read/sheet/EffectiveReplacesSheet.kt

@@ -17,7 +17,6 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.getValue
 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.setValue
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Modifier
@@ -25,17 +24,13 @@ import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
 import io.legado.app.R
 import io.legado.app.R
-import io.legado.app.data.appDb
 import io.legado.app.data.entities.ReplaceRule
 import io.legado.app.data.entities.ReplaceRule
-import io.legado.app.model.ReadBook
-import io.legado.app.ui.config.readConfig.ReadConfig
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.card.NormalCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
 import io.legado.app.ui.widget.components.text.AppText
 import io.legado.app.ui.widget.components.text.AppText
-import kotlinx.coroutines.launch
 
 
 private const val CHINESE_CONVERT_ID = -1L
 private const val CHINESE_CONVERT_ID = -1L
 private const val RE_SEGMENT_ID = -2L
 private const val RE_SEGMENT_ID = -2L
@@ -43,22 +38,21 @@ private const val RE_SEGMENT_ID = -2L
 @Composable
 @Composable
 fun EffectiveReplacesSheet(
 fun EffectiveReplacesSheet(
     show: Boolean,
     show: Boolean,
+    effectiveRules: List<ReplaceRule>,
+    chineseConvertActive: Boolean,
+    reSegmentActive: Boolean,
     onDismissRequest: () -> Unit,
     onDismissRequest: () -> Unit,
     onOpenReplaceEditor: (id: Long, pattern: String?) -> Unit,
     onOpenReplaceEditor: (id: Long, pattern: String?) -> Unit,
     onReplaceRuleChanged: () -> Unit,
     onReplaceRuleChanged: () -> Unit,
     onNavigateToTextEffects: () -> Unit,
     onNavigateToTextEffects: () -> Unit,
     onOpenContentProcesses: () -> Unit,
     onOpenContentProcesses: () -> Unit,
+    onDisableRule: (ReplaceRule) -> Unit,
+    onDisableChineseConverter: () -> Unit,
+    onDisableReSegment: () -> Unit,
 ) {
 ) {
-    val scope = rememberCoroutineScope()
-    val chineseConvertActive = ReadConfig.chineseConverterType > 0
     val chineseConvertItem = remember { ReplaceRule(CHINESE_CONVERT_ID, "繁简转换") }
     val chineseConvertItem = remember { ReplaceRule(CHINESE_CONVERT_ID, "繁简转换") }
-    val reSegmentActive = ReadBook.book?.getReSegment() == true
     val reSegmentItem = remember { ReplaceRule(RE_SEGMENT_ID, "") }
     val reSegmentItem = remember { ReplaceRule(RE_SEGMENT_ID, "") }
 
 
-    val effectiveRules = remember(show) {
-        ReadBook.curTextChapter?.effectiveReplaceRules ?: emptyList()
-    }
-
     val items = remember(show, effectiveRules, chineseConvertActive, reSegmentActive) {
     val items = remember(show, effectiveRules, chineseConvertActive, reSegmentActive) {
         buildList {
         buildList {
             addAll(effectiveRules)
             addAll(effectiveRules)
@@ -155,15 +149,11 @@ fun EffectiveReplacesSheet(
                                     isEdited = true
                                     isEdited = true
                                     when (rule.id) {
                                     when (rule.id) {
                                         RE_SEGMENT_ID -> {
                                         RE_SEGMENT_ID -> {
-                                            ReadBook.book?.setReSegment(false)
-                                            ReadBook.loadContent(false)
+                                            onDisableReSegment()
                                         }
                                         }
 
 
-                                        CHINESE_CONVERT_ID -> ReadConfig.chineseConverterType = 0
-                                        else -> scope.launch {
-                                            rule.isEnabled = false
-                                            appDb.replaceRuleDao.insert(rule)
-                                        }
+                                        CHINESE_CONVERT_ID -> onDisableChineseConverter()
+                                        else -> onDisableRule(rule)
                                     }
                                     }
                                 },
                                 },
                 icon = Icons.Default.Close,
                 icon = Icons.Default.Close,