Преглед изворни кода

android: Scroll shortcut for games list

If you reselect the "Games" menu item in the bottom navigation menu, the list smoothly scrolls to the top.
Charles Lombardo пре 3 година
родитељ
комит
0d16805445

+ 7 - 0
src/android/app/src/main/java/org/yuzu/yuzu_emu/model/GamesViewModel.kt

@@ -26,6 +26,9 @@ class GamesViewModel : ViewModel() {
     private val _shouldSwapData = MutableLiveData(false)
     private val _shouldSwapData = MutableLiveData(false)
     val shouldSwapData: LiveData<Boolean> get() = _shouldSwapData
     val shouldSwapData: LiveData<Boolean> get() = _shouldSwapData
 
 
+    private val _shouldScrollToTop = MutableLiveData(false)
+    val shouldScrollToTop: LiveData<Boolean> get() = _shouldScrollToTop
+
     init {
     init {
         reloadGames(false)
         reloadGames(false)
     }
     }
@@ -38,6 +41,10 @@ class GamesViewModel : ViewModel() {
         _shouldSwapData.postValue(shouldSwap)
         _shouldSwapData.postValue(shouldSwap)
     }
     }
 
 
+    fun setShouldScrollToTop(shouldScroll: Boolean) {
+        _shouldScrollToTop.postValue(shouldScroll)
+    }
+
     fun reloadGames(directoryChanged: Boolean) {
     fun reloadGames(directoryChanged: Boolean) {
         if (isReloading.value == true)
         if (isReloading.value == true)
             return
             return

+ 14 - 0
src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/GamesFragment.kt

@@ -138,6 +138,14 @@ class GamesFragment : Fragment() {
             searchHidden()
             searchHidden()
         }
         }
 
 
+        // Check if the user reselected the games menu item and then scroll to top of the list
+        gamesViewModel.shouldScrollToTop.observe(viewLifecycleOwner) { shouldScroll ->
+            if (shouldScroll) {
+                scrollToTop()
+                gamesViewModel.setShouldScrollToTop(false)
+            }
+        }
+
         setInsets()
         setInsets()
 
 
         // Make sure the loading indicator appears even if the layout is told to refresh before being fully drawn
         // Make sure the loading indicator appears even if the layout is told to refresh before being fully drawn
@@ -191,6 +199,12 @@ class GamesFragment : Fragment() {
         }
         }
     }
     }
 
 
+    fun scrollToTop() {
+        if (_binding != null) {
+            binding.gridGames.smoothScrollToPosition(0)
+        }
+    }
+
     private fun setInsets() =
     private fun setInsets() =
         ViewCompat.setOnApplyWindowInsetsListener(binding.gridGames) { view: View, windowInsets: WindowInsetsCompat ->
         ViewCompat.setOnApplyWindowInsetsListener(binding.gridGames) { view: View, windowInsets: WindowInsetsCompat ->
             val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
             val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())

+ 13 - 1
src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt

@@ -25,6 +25,7 @@ import androidx.preference.PreferenceManager
 import com.google.android.material.color.MaterialColors
 import com.google.android.material.color.MaterialColors
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.google.android.material.elevation.ElevationOverlayProvider
 import com.google.android.material.elevation.ElevationOverlayProvider
+import com.google.android.material.navigation.NavigationBarView
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withContext
@@ -73,6 +74,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
         val navHostFragment =
         val navHostFragment =
             supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
             supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
         setUpNavigation(navHostFragment.navController)
         setUpNavigation(navHostFragment.navController)
+        (binding.navigationBar as NavigationBarView).setOnItemReselectedListener {
+            if (it.itemId == R.id.gamesFragment) {
+                gamesViewModel.setShouldScrollToTop(true)
+            }
+        }
 
 
         binding.statusBarShade.setBackgroundColor(
         binding.statusBarShade.setBackgroundColor(
             MaterialColors.getColor(
             MaterialColors.getColor(
@@ -243,7 +249,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider {
             )
             )
 
 
             val dstPath = DirectoryInitialization.userDirectory + "/keys/"
             val dstPath = DirectoryInitialization.userDirectory + "/keys/"
-            if (FileUtil.copyUriToInternalStorage(applicationContext, result, dstPath, "prod.keys")) {
+            if (FileUtil.copyUriToInternalStorage(
+                    applicationContext,
+                    result,
+                    dstPath,
+                    "prod.keys"
+                )
+            ) {
                 if (NativeLibrary.reloadKeys()) {
                 if (NativeLibrary.reloadKeys()) {
                     Toast.makeText(
                     Toast.makeText(
                         applicationContext,
                         applicationContext,