Selaa lähdekoodia

Use popup menus for reader shortcuts instead of toggling through

arkon 4 vuotta sitten
vanhempi
commit
5f9574541f

+ 3 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadHolder.kt

@@ -81,15 +81,14 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
 
     private fun showPopupMenu(view: View) {
         view.popupMenu(
-            R.menu.download_single,
-            {
+            menuRes = R.menu.download_single,
+            initMenu = {
                 findItem(R.id.move_to_top).isVisible = bindingAdapterPosition != 0
                 findItem(R.id.move_to_bottom).isVisible =
                     bindingAdapterPosition != adapter.itemCount - 1
             },
-            {
+            onMenuItemClick = {
                 adapter.downloadItemListener.onMenuItemClick(bindingAdapterPosition, this)
-                true
             }
         )
     }

+ 3 - 7
app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt

@@ -51,16 +51,12 @@ class ChaptersSettingsSheet(
 
     private fun showPopupMenu(view: View) {
         view.popupMenu(
-            R.menu.default_chapter_filter,
-            {
-            },
-            {
-                when (this.itemId) {
+            menuRes = R.menu.default_chapter_filter,
+            onMenuItemClick = {
+                when (itemId) {
                     R.id.set_as_default -> {
                         SetChapterSettingsDialog(presenter.manga).showDialog(router)
-                        true
                     }
-                    else -> true
                 }
             }
         )

+ 0 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/base/BaseChapterHolder.kt

@@ -29,7 +29,6 @@ open class BaseChapterHolder(
                     },
                     onMenuItemClick = {
                         adapter.clickListener.deleteChapter(position)
-                        true
                     }
                 )
             }

+ 22 - 11
app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt

@@ -58,6 +58,7 @@ import eu.kanade.tachiyomi.util.system.toast
 import eu.kanade.tachiyomi.util.view.defaultBar
 import eu.kanade.tachiyomi.util.view.hideBar
 import eu.kanade.tachiyomi.util.view.isDefaultBar
+import eu.kanade.tachiyomi.util.view.popupMenu
 import eu.kanade.tachiyomi.util.view.setTooltip
 import eu.kanade.tachiyomi.util.view.showBar
 import eu.kanade.tachiyomi.widget.SimpleAnimationListener
@@ -356,13 +357,18 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
             setTooltip(R.string.viewer)
 
             setOnClickListener {
-                val newReadingMode =
-                    ReadingModeType.getNextReadingMode(presenter.getMangaViewer(resolveDefault = false))
-                presenter.setMangaViewer(newReadingMode.prefValue)
+                popupMenu(
+                    items = ReadingModeType.values().map { it.prefValue to it.stringRes },
+                    selectedItemId = presenter.getMangaViewer(resolveDefault = false),
+                ) {
+                    val newReadingMode = ReadingModeType.fromPreference(itemId)
 
-                menuToggleToast?.cancel()
-                if (!preferences.showReadingMode()) {
-                    menuToggleToast = toast(newReadingMode.stringRes)
+                    presenter.setMangaViewer(newReadingMode.prefValue)
+
+                    menuToggleToast?.cancel()
+                    if (!preferences.showReadingMode()) {
+                        menuToggleToast = toast(newReadingMode.stringRes)
+                    }
                 }
             }
         }
@@ -372,13 +378,18 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
             setTooltip(R.string.pref_rotation_type)
 
             setOnClickListener {
-                val newOrientation = OrientationType.getNextOrientation(preferences.rotation().get())
+                popupMenu(
+                    items = OrientationType.values().map { it.prefValue to it.stringRes },
+                    selectedItemId = preferences.rotation().get(),
+                ) {
+                    val newOrientation = OrientationType.fromPreference(itemId)
 
-                preferences.rotation().set(newOrientation.prefValue)
-                setOrientation(newOrientation.flag)
+                    preferences.rotation().set(newOrientation.prefValue)
+                    setOrientation(newOrientation.flag)
 
-                menuToggleToast?.cancel()
-                menuToggleToast = toast(newOrientation.stringRes)
+                    menuToggleToast?.cancel()
+                    menuToggleToast = toast(newOrientation.stringRes)
+                }
             }
         }
         preferences.rotation().asImmediateFlow { updateRotationShortcut(it) }

+ 0 - 6
app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/OrientationType.kt

@@ -4,7 +4,6 @@ import android.content.pm.ActivityInfo
 import androidx.annotation.DrawableRes
 import androidx.annotation.StringRes
 import eu.kanade.tachiyomi.R
-import eu.kanade.tachiyomi.util.lang.next
 
 enum class OrientationType(val prefValue: Int, val flag: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int) {
     FREE(1, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.rotation_free, R.drawable.ic_screen_rotation_24dp),
@@ -17,10 +16,5 @@ enum class OrientationType(val prefValue: Int, val flag: Int, @StringRes val str
     companion object {
         fun fromPreference(preference: Int): OrientationType =
             values().find { it.prefValue == preference } ?: FREE
-
-        fun getNextOrientation(preference: Int): OrientationType {
-            val current = fromPreference(preference)
-            return current.next()
-        }
     }
 }

+ 0 - 6
app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReadingModeType.kt

@@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.ui.reader.setting
 import androidx.annotation.DrawableRes
 import androidx.annotation.StringRes
 import eu.kanade.tachiyomi.R
-import eu.kanade.tachiyomi.util.lang.next
 
 enum class ReadingModeType(val prefValue: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int) {
     DEFAULT(0, R.string.default_viewer, R.drawable.ic_reader_default_24dp),
@@ -17,11 +16,6 @@ enum class ReadingModeType(val prefValue: Int, @StringRes val stringRes: Int, @D
     companion object {
         fun fromPreference(preference: Int): ReadingModeType = values().find { it.prefValue == preference } ?: DEFAULT
 
-        fun getNextReadingMode(preference: Int): ReadingModeType {
-            val current = fromPreference(preference)
-            return current.next()
-        }
-
         fun isPagerType(preference: Int): Boolean {
             val mode = fromPreference(preference)
             return mode == LEFT_TO_RIGHT || mode == RIGHT_TO_LEFT || mode == VERTICAL

+ 0 - 7
app/src/main/java/eu/kanade/tachiyomi/util/lang/EnumExtensions.kt

@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.util.lang
-
-inline fun <reified T : Enum<T>> T.next(): T {
-    val values = enumValues<T>()
-    val nextOrdinal = (ordinal + 1) % values.size
-    return values[nextOrdinal]
-}

+ 50 - 2
app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt

@@ -2,6 +2,7 @@
 
 package eu.kanade.tachiyomi.util.view
 
+import android.annotation.SuppressLint
 import android.graphics.Point
 import android.view.Gravity
 import android.view.Menu
@@ -9,14 +10,18 @@ import android.view.MenuItem
 import android.view.View
 import androidx.annotation.MenuRes
 import androidx.annotation.StringRes
+import androidx.appcompat.view.menu.MenuBuilder
 import androidx.appcompat.widget.PopupMenu
 import androidx.appcompat.widget.TooltipCompat
+import androidx.core.content.ContextCompat
+import androidx.core.view.forEach
 import androidx.recyclerview.widget.RecyclerView
 import com.google.android.material.chip.Chip
 import com.google.android.material.chip.ChipGroup
 import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
 import com.google.android.material.snackbar.Snackbar
 import eu.kanade.tachiyomi.R
+import eu.kanade.tachiyomi.util.system.getResourceColor
 
 /**
  * Returns coordinates of view.
@@ -63,7 +68,7 @@ inline fun View.setTooltip(@StringRes stringRes: Int) {
 inline fun View.popupMenu(
     @MenuRes menuRes: Int,
     noinline initMenu: (Menu.() -> Unit)? = null,
-    noinline onMenuItemClick: MenuItem.() -> Boolean
+    noinline onMenuItemClick: MenuItem.() -> Unit
 ): PopupMenu {
     val popup = PopupMenu(context, this, Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0)
     popup.menuInflater.inflate(menuRes, popup.menu)
@@ -71,7 +76,50 @@ inline fun View.popupMenu(
     if (initMenu != null) {
         popup.menu.initMenu()
     }
-    popup.setOnMenuItemClickListener { it.onMenuItemClick() }
+    popup.setOnMenuItemClickListener {
+        it.onMenuItemClick()
+        true
+    }
+
+    popup.show()
+    return popup
+}
+
+/**
+ * Shows a popup menu on top of this view.
+ *
+ * @param items menu item names to inflate the menu with. List of itemId to stringRes pairs.
+ * @param selectedItemId optionally show a checkmark beside an item with this itemId.
+ * @param onMenuItemClick function to execute when a menu item is clicked.
+ */
+@SuppressLint("RestrictedApi")
+inline fun View.popupMenu(
+    items: List<Pair<Int, Int>>,
+    selectedItemId: Int? = null,
+    noinline onMenuItemClick: MenuItem.() -> Unit
+): PopupMenu {
+    val popup = PopupMenu(context, this, Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0)
+    items.forEach { (id, stringRes) ->
+        popup.menu.add(0, id, 0, stringRes)
+    }
+
+    if (selectedItemId != null) {
+        (popup.menu as? MenuBuilder)?.setOptionalIconsVisible(true)
+        val emptyIcon = ContextCompat.getDrawable(context, R.drawable.ic_blank_24dp)
+        popup.menu.forEach { item ->
+            item.icon = when (item.itemId) {
+                selectedItemId -> ContextCompat.getDrawable(context, R.drawable.ic_check_24dp)?.mutate()?.apply {
+                    setTint(context.getResourceColor(android.R.attr.textColorPrimary))
+                }
+                else -> emptyIcon
+            }
+        }
+    }
+
+    popup.setOnMenuItemClickListener {
+        it.onMenuItemClick()
+        true
+    }
 
     popup.show()
     return popup