替换按键角标

This commit is contained in:
HapeLee committed 2025-11-16 02:00:32 +08:00
1 parent fe5ec91cf4
commit 697a7b461e
4 files changed
+47 -3

No files matched your search

@@ -13,12 +13,16 @@ import android.view.animation.AlphaAnimation
import android.view.animation.Animation import android.view.animation.Animation
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.SeekBar import android.widget.SeekBar
import androidx.annotation.OptIn
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import androidx.core.graphics.toColorInt import androidx.core.graphics.toColorInt
import androidx.core.view.doOnAttach import androidx.core.view.doOnAttach
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.google.android.material.badge.BadgeDrawable
import com.google.android.material.badge.BadgeUtils
import com.google.android.material.badge.ExperimentalBadgeUtils
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.button.MaterialButtonGroup import com.google.android.material.button.MaterialButtonGroup
import com.google.android.material.overflow.OverflowLinearLayout import com.google.android.material.overflow.OverflowLinearLayout
@@ -50,10 +54,8 @@ import io.legado.app.utils.openUrl
import io.legado.app.utils.putPrefBoolean import io.legado.app.utils.putPrefBoolean
import io.legado.app.utils.startActivity import io.legado.app.utils.startActivity
import io.legado.app.utils.themeColor import io.legado.app.utils.themeColor
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.visible import io.legado.app.utils.visible
import splitties.views.onClick import splitties.views.onClick
import splitties.views.onLongClick
/** /**
* 阅读界面菜单 * 阅读界面菜单
@@ -321,6 +323,7 @@ class ReadMenu @JvmOverloads constructor(
binding.titleBar.visible() binding.titleBar.visible()
binding.bottomMenu.visible() binding.bottomMenu.visible()
changeReplace(ReadBook.book?.getUseReplaceRule() ?: false) changeReplace(ReadBook.book?.getUseReplaceRule() ?: false)
updateBadge("replace_badge", ReadBook.curTextChapter?.effectiveReplaceRules?.size ?: 0)
if (anim) { if (anim) {
binding.titleBar.startAnimation(menuTopIn) binding.titleBar.startAnimation(menuTopIn)
binding.bottomMenu.startAnimation(menuBottomIn) binding.bottomMenu.startAnimation(menuBottomIn)
@@ -597,6 +600,35 @@ class ReadMenu @JvmOverloads constructor(
} }
} }
private val badgeMap = mutableMapOf<MaterialButton, BadgeDrawable>()
@OptIn(ExperimentalBadgeUtils::class)
fun updateBadge(id: String, count: Int) {
val btn = buttonMap[id] ?: return
if (count != 0 && btn.isChecked) {
btn.addBadge(count)
} else {
badgeMap[btn]?.let { BadgeUtils.detachBadgeDrawable(it, btn) }
badgeMap.remove(btn)
}
}
@OptIn(ExperimentalBadgeUtils::class)
private fun MaterialButton.addBadge(count: Int) {
val badgeDrawable = BadgeDrawable.create(context).apply {
number = count
backgroundColor = colorSecondary
badgeTextColor = colorSecondaryContainer
maxCharacterCount = 3
badgeGravity = BadgeDrawable.TOP_END
verticalOffset = (16).dpToPx()
}
BadgeUtils.attachBadgeDrawable(badgeDrawable, this, null)
badgeMap[this] = badgeDrawable
}
private fun getAllButtons(): List<ToolButton> { private fun getAllButtons(): List<ToolButton> {
return listOf( return listOf(
ToolButton( ToolButton(
@@ -667,12 +699,21 @@ class ReadMenu @JvmOverloads constructor(
onLongClick = { runMenuOut { callBack.openReplaceRule() } }, onLongClick = { runMenuOut { callBack.openReplaceRule() } },
onCheck = { runMenuOut { callBack.changeReplaceRuleState() } }, onCheck = { runMenuOut { callBack.changeReplaceRuleState() } },
onClick = { } onClick = { }
),
ToolButton(
id = "replace_badge",
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) { fun changeReplace(boolean: Boolean) {
buttonMap["replace"]?.isChecked = boolean buttonMap["replace"]?.isChecked = boolean
buttonMap["replace_badge"]?.isChecked = boolean
} }
private fun getUserButtons(): List<ToolButton> { private fun getUserButtons(): List<ToolButton> {
@@ -114,7 +114,7 @@ class ToolButtonConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_too
} }
private fun getAllButtonIds(): List<String> { private fun getAllButtonIds(): List<String> {
return listOf("search", "auto_page", "catalog", "read_aloud", "setting", "addBookmark", "theme", "prev_chapter", "next_chapter", "replace") return listOf("search", "auto_page", "catalog", "read_aloud", "setting", "addBookmark", "theme", "prev_chapter", "next_chapter", "replace", "replace_badge")
} }
private fun getButtonInfo(id: String): Pair<Int, String> { private fun getButtonInfo(id: String): Pair<Int, String> {
@@ -129,6 +129,7 @@ class ToolButtonConfigDialog : BaseBottomSheetDialogFragment(R.layout.dialog_too
"prev_chapter" -> R.drawable.ic_previous to getString(R.string.previous_chapter) "prev_chapter" -> R.drawable.ic_previous to getString(R.string.previous_chapter)
"next_chapter" -> R.drawable.ic_next to getString(R.string.next_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) "replace" -> R.drawable.ic_find_replace to getString(R.string.replace_purify)
"replace_badge" -> R.drawable.ic_find_replace to getString(R.string.replace_purify_badge)
else -> R.drawable.ic_help to id else -> R.drawable.ic_help to id
} }
} }
+1
View File
@@ -1346,4 +1346,5 @@
<string name="underline_height">线段高度</string> <string name="underline_height">线段高度</string>
<string name="title_bar_mode">菜单标题显示方式</string> <string name="title_bar_mode">菜单标题显示方式</string>
<string name="sure_cache_book">是否确认开始缓存?</string> <string name="sure_cache_book">是否确认开始缓存?</string>
<string name="replace_purify_badge">计数替换净化</string>
</resources> </resources>
+1
View File
@@ -1347,4 +1347,5 @@
<string name="underline_height">线段高度</string> <string name="underline_height">线段高度</string>
<string name="title_bar_mode">菜单标题显示方式</string> <string name="title_bar_mode">菜单标题显示方式</string>
<string name="sure_cache_book">是否确认开始缓存?</string> <string name="sure_cache_book">是否确认开始缓存?</string>
<string name="replace_purify_badge">计数替换净化</string>
</resources> </resources>