Ver Fonte

替换按键角标

HapeLee há 1 ano atrás
pai
commit
697a7b461e

+ 43 - 2
app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt

@@ -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> {

+ 2 - 1
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<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 - 0
app/src/main/res/values-zh/strings.xml

@@ -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 - 0
app/src/main/res/values/strings.xml

@@ -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>