fix: 朗读配置面板无法标识当前引擎及切换引擎后状态不一致

This commit is contained in:
HapeLee
2026-06-08 01:19:47 +08:00
parent 40cb04dfab
commit 3647ee7979
3 changed files with 39 additions and 7 deletions
@@ -133,6 +133,7 @@ data class ReadBookUiState(
val contentEditSaveToSource: Boolean = false,
val ttsEngineItems: ImmutableList<ReadBookTtsEngineItem> = persistentListOf(),
val selectedTtsEngine: String? = null,
val speakEngineName: String = "",
val preDownloadNum: Int = 10,
val audioCacheCleanTime: Int = 10,
// Read aloud config
@@ -39,10 +39,9 @@ import io.legado.app.help.book.removeType
import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.ui.config.themeConfig.ThemeConfig
import io.legado.app.ui.book.read.config.HighlightRuleStore
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.source.getSourceType
import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.model.ImageProvider
import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook
@@ -53,15 +52,19 @@ import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook
import io.legado.app.service.BaseReadAloudService
import io.legado.app.ui.book.read.config.HighlightRuleStore
import io.legado.app.ui.book.read.page.entities.TextChapter
import io.legado.app.ui.book.read.page.entities.TextPage
import io.legado.app.ui.book.read.page.provider.ChapterProvider
import io.legado.app.ui.book.read.page.provider.TextChapterLayout
import splitties.init.appCtx
import io.legado.app.ui.book.searchContent.SearchResult
import io.legado.app.ui.config.otherConfig.OtherConfig
import io.legado.app.ui.config.themeConfig.ThemeConfig
import io.legado.app.utils.GSON
import io.legado.app.utils.ImageSaveUtils
import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.fromJsonObject
import io.legado.app.utils.StringUtils
import io.legado.app.utils.hexString
import io.legado.app.utils.isAbsUrl
import io.legado.app.utils.isTrue
@@ -525,7 +528,13 @@ class ReadBookViewModel(
}
is ReadBookIntent.ShowReadAloudConfig -> {
_uiState.update { it.copy(activeSheet = ReadBookSheet.ReadAloudConfig) }
_uiState.update {
it.copy(
speakEngineName = computeSpeakEngineName(),
activeSheet = ReadBookSheet.ReadAloudConfig,
)
}
loadTtsEngineItems()
}
is ReadBookIntent.SelectSpeakEngine -> {
@@ -554,7 +563,8 @@ class ReadBookViewModel(
AppConfig.ttsEngine = intent.value
_uiState.update {
it.copy(
selectedTtsEngine = intent.value,
selectedTtsEngine = ReadAloud.ttsEngine,
speakEngineName = computeSpeakEngineName(),
activeSheet = ReadBookSheet.ReadAloudConfig,
)
}
@@ -850,6 +860,12 @@ class ReadBookViewModel(
}
private fun showSpeakEngineConfig() {
loadTtsEngineItems {
_uiState.update { it.copy(activeSheet = ReadBookSheet.SpeakEngineConfig) }
}
}
private fun loadTtsEngineItems(onSuccess: (() -> Unit)? = null) {
execute {
buildList {
add(ReadBookTtsEngineItem(context.getString(R.string.system_tts), null))
@@ -861,13 +877,25 @@ class ReadBookViewModel(
_uiState.update {
it.copy(
ttsEngineItems = items.toImmutableList(),
selectedTtsEngine = AppConfig.ttsEngine,
activeSheet = ReadBookSheet.SpeakEngineConfig,
selectedTtsEngine = ReadAloud.ttsEngine,
)
}
onSuccess?.invoke()
}
}
private fun computeSpeakEngineName(): String {
val ttsEngine = ReadAloud.ttsEngine
?: return context.getString(R.string.system_tts)
if (StringUtils.isNumeric(ttsEngine)) {
return appDb.httpTTSDao.getName(ttsEngine.toLong())
?: context.getString(R.string.system_tts)
}
return GSON.fromJsonObject<SelectItem<String>>(ttsEngine)
.getOrNull()?.title
?: context.getString(R.string.system_tts)
}
/**
* Called from the network changed listener (registered by route).
*/
@@ -97,6 +97,9 @@ fun ReadAloudConfigSheet(
)
TinyClickableSettingItem(
title = stringResource(R.string.speak_engine),
description = state.speakEngineName.ifEmpty {
stringResource(R.string.system_tts)
},
onClick = { onIntent(ReadBookIntent.SelectSpeakEngine) },
)
TinyClickableSettingItem(