From aec19ab5a8a2dba07a8b89411ab74fdb229b46e3 Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Sat, 8 Nov 2025 12:09:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E6=96=87=E6=8C=89=E9=92=AE=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=AD=A3=E5=88=99=E6=9B=BF=E6=8D=A2=EF=BC=88=E9=95=BF?= =?UTF-8?q?=E6=8C=89=E9=85=8D=E7=BD=AE=EF=BC=8C=E7=9F=AD=E6=8C=89=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E7=8A=B6=E6=80=81=EF=BC=89=20#237?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/ReadBookActivity.kt | 1 + .../io/legado/app/ui/book/read/ReadMenu.kt | 50 ++++++++++++++++--- .../read/config/ToolButtonConfigDialog.kt | 3 +- app/version.properties | 2 +- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index e2c134282..ce1888383 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -1665,6 +1665,7 @@ class ReadBookActivity : BaseReadBookActivity(), it.setUseReplaceRule(!it.getUseReplaceRule()) ReadBook.saveRead() menu?.findItem(R.id.menu_enable_replace)?.isChecked = it.getUseReplaceRule() + binding.readMenu.changeReplace(it.getUseReplaceRule()) viewModel.replaceRuleChanged() } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 0885f5e94..cc2d06323 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -50,8 +50,10 @@ import io.legado.app.utils.openUrl import io.legado.app.utils.putPrefBoolean import io.legado.app.utils.startActivity import io.legado.app.utils.themeColor +import io.legado.app.utils.toastOnUi import io.legado.app.utils.visible import splitties.views.onClick +import splitties.views.onLongClick /** * 阅读界面菜单 @@ -107,7 +109,7 @@ class ReadMenu @JvmOverloads constructor( private val bgColor: Int get() = when (AppConfig.readBarStyle) { 0 -> colorSurfaceContainer - 1 -> kotlin.runCatching { + 1 -> runCatching { ReadBookConfig.durConfig.curBgStr().toColorInt() }.getOrDefault(colorSurfaceContainer) else -> ReadBookConfig.durConfig.curMenuBg() @@ -117,7 +119,7 @@ class ReadMenu @JvmOverloads constructor( private val acColor: Int get() = when (AppConfig.readBarStyle) { 0 -> colorSecondary - 1 -> kotlin.runCatching { + 1 -> runCatching { ReadBookConfig.durConfig.curTextColor() }.getOrDefault(colorSecondary) else -> ReadBookConfig.durConfig.curMenuAc() @@ -127,11 +129,11 @@ class ReadMenu @JvmOverloads constructor( private val bgcColor: Int get() = when (AppConfig.readBarStyle) { 0 -> colorSecondaryContainer - 1 -> kotlin.runCatching { + 1 -> runCatching { val baseColor = ReadBookConfig.durConfig.curTextColor() - ColorUtils.setAlphaComponent(baseColor, (255 * 0.2f).toInt()) + ColorUtils.setAlphaComponent(baseColor, (255 * 0.1f).toInt()) }.getOrDefault(colorSecondaryContainer) - else -> ColorUtils.setAlphaComponent(acColor, (255 * 0.2f).toInt()) + else -> ColorUtils.setAlphaComponent(acColor, (255 * 0.1f).toInt()) } private var onMenuOutEnd: (() -> Unit)? = null @@ -317,6 +319,7 @@ class ReadMenu @JvmOverloads constructor( this.visible() binding.titleBar.visible() binding.bottomMenu.visible() + changeReplace(ReadBook.book?.getUseReplaceRule() ?: false) if (anim) { binding.titleBar.startAnimation(menuTopIn) binding.bottomMenu.startAnimation(menuBottomIn) @@ -552,8 +555,29 @@ class ReadMenu @JvmOverloads constructor( strokeWidth = 0 iconGravity = MaterialButton.ICON_GRAVITY_TEXT_START iconTint = ColorStateList.valueOf(acColor) + val bgColorState = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_checked), + intArrayOf(-android.R.attr.state_checked) + ), + intArrayOf( + bgcColor, + bgColor + ) + ) + backgroundTintList = bgColorState maxLines = 1 - setOnClickListener { btn.onClick() } + if (btn.onCheck != null) { + isCheckable = true + isChecked = btn.state + setOnClickListener { + isChecked = !isChecked + btn.state = isChecked + btn.onCheck.invoke() + } + } else { + setOnClickListener { btn.onClick() } + } btn.onLongClick?.let { longAction -> setOnLongClickListener { longAction() @@ -634,10 +658,22 @@ class ReadMenu @JvmOverloads constructor( iconRes = R.drawable.ic_next, description = context.getString(R.string.next_chapter), onClick = { ReadBook.moveToNextChapter(true) } + ), + ToolButton( + id = "replace", + iconRes = R.drawable.ic_find_replace, + description = context.getString(R.string.replace_purify), + onLongClick = { runMenuOut { callBack.openReplaceRule() } }, + onCheck = { runMenuOut { callBack.changeReplaceRuleState() } }, + onClick = { } ) ) } + fun changeReplace(boolean: Boolean) { + buttonMap["replace"]?.isChecked = boolean + } + private fun getUserButtons(): List { val prefs by lazy { context.getSharedPreferences("tool_button_config", Context.MODE_PRIVATE) @@ -808,6 +844,7 @@ class ReadMenu @JvmOverloads constructor( fun skipToChapter(index: Int) fun onMenuShow() fun onMenuHide() + fun changeReplaceRuleState() } data class ToolButton( @@ -816,6 +853,7 @@ class ReadMenu @JvmOverloads constructor( val description: String, // contentDescription / tooltipText val onClick: () -> Unit, // 点击事件 val onLongClick: (() -> Unit)? = null, // 可选长按 + val onCheck: (() -> Unit)? = null,// 可选 var state: Boolean = false // 动态 ) } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ToolButtonConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ToolButtonConfigDialog.kt index fe955d5e7..752281d3e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ToolButtonConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ToolButtonConfigDialog.kt @@ -114,7 +114,7 @@ class ToolButtonConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_too } private fun getAllButtonIds(): List { - return listOf("search", "auto_page", "catalog", "read_aloud", "setting", "addBookmark", "theme", "prev_chapter", "next_chapter") + return listOf("search", "auto_page", "catalog", "read_aloud", "setting", "addBookmark", "theme", "prev_chapter", "next_chapter", "replace") } private fun getButtonInfo(id: String): Pair { @@ -128,6 +128,7 @@ class ToolButtonConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_too "theme" -> R.drawable.ic_daytime to getString(R.string.day_night_switch) "prev_chapter" -> R.drawable.ic_previous to getString(R.string.previous_chapter) "next_chapter" -> R.drawable.ic_next to getString(R.string.next_chapter) + "replace" -> R.drawable.ic_find_replace to getString(R.string.replace_purify) else -> R.drawable.ic_help to id } } diff --git a/app/version.properties b/app/version.properties index c4c184252..0350b0d94 100644 --- a/app/version.properties +++ b/app/version.properties @@ -1,4 +1,4 @@ VERSION_MAJOR=3 VERSION_MINOR=26 VERSION_PATCH=2 -VERSION_SUFFIX=-beta.9 \ No newline at end of file +VERSION_SUFFIX= \ No newline at end of file