Browse Source

Fix auto selecting All Songs or Favorites.
Fix auto selecting the previous selected song index properly (check header status).

Halsafar 4 years ago
parent
commit
75d6162e88

+ 44 - 16
SongBrowserPlugin/UI/Browser/BeatSaberUIController.cs

@@ -160,7 +160,7 @@ namespace SongBrowser.DataAccess
             IAnnotatedBeatmapLevelCollection levelCollection = null;
 
             // search level packs
-            foreach (IBeatmapLevelPack o in BeatmapLevelsModel.allLoadedBeatmapLevelPackCollection.beatmapLevelPacks)
+            foreach (IBeatmapLevelPack o in this.LevelFilteringNavigationController.GetPrivateField<IBeatmapLevelPack[]>("_allBeatmapLevelPacks"))
             {
                 if (String.Equals(o.collectionName, levelCollectionName))
                 {
@@ -202,13 +202,9 @@ namespace SongBrowser.DataAccess
             return levelCollection.beatmapLevelCollection.beatmapLevels;
         }
 
-        /// <summary>
-        /// Select a level collection.
-        /// </summary>
-        /// <param name="levelCollectionName"></param>
-        public void SelectLevelCollection(String levelCategoryName, String levelCollectionName)
+        public bool SelectLevelCategory(String levelCategoryName)
         {
-            Logger.Trace("SelectLevelCollection({0})", levelCollectionName);
+            Logger.Trace("SelectLevelCategory({0})", levelCategoryName);
 
             try
             {
@@ -226,18 +222,16 @@ namespace SongBrowser.DataAccess
                 catch (Exception)
                 {
                     // invalid input
-                    return;
+                    return false;
                 }
 
-
-                IAnnotatedBeatmapLevelCollection collection = GetLevelCollectionByName(levelCollectionName);
-                if (collection == null)
+                if (category == LevelFilteringNavigationController.selectedLevelCategory)
                 {
-                    Logger.Debug("Could not locate requested level collection...");
-                    return;
+                    Logger.Debug($"Level category [{category}] is already selected");
+                    return false;
                 }
 
-                Logger.Info("Selecting level collection: {0}", collection.collectionName);
+                Logger.Info("Selecting level category: {0}", levelCategoryName);
 
                 var selectLeveCategoryViewController = LevelFilteringNavigationController.GetComponentInChildren<SelectLevelCategoryViewController>();
                 var iconSegementController = selectLeveCategoryViewController.GetComponentInChildren<IconSegmentedControl>();
@@ -246,8 +240,42 @@ namespace SongBrowser.DataAccess
                                         select x.levelCategory).ToList().IndexOf(category);
 
                 iconSegementController.SelectCellWithNumber(selectCellNumber);
-                LevelFilteringNavigationController.SelectAnnotatedBeatmapLevelCollection(collection as IBeatmapLevelPack);
+                //selectLeveCategoryViewController.LevelFilterCategoryIconSegmentedControlDidSelectCell(iconSegementController, selectCellNumber);
                 LevelFilteringNavigationController.UpdateSecondChildControllerContent(category);
+                //AnnotatedBeatmapLevelCollectionsViewController.RefreshAvailability();
+
+                Logger.Debug("Done selecting level category.");
+
+                return true;
+
+            } catch (Exception e)
+            {
+                Logger.Exception(e);
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Select a level collection.
+        /// </summary>
+        /// <param name="levelCollectionName"></param>
+        public void SelectLevelCollection(String levelCollectionName)
+        {
+            Logger.Trace("SelectLevelCollection({0})", levelCollectionName);
+
+            try
+            {
+                IAnnotatedBeatmapLevelCollection collection = GetLevelCollectionByName(levelCollectionName);
+                if (collection == null)
+                {
+                    Logger.Debug("Could not locate requested level collection...");
+                    return;
+                }
+
+                Logger.Info("Selecting level collection: {0}", collection.collectionName);
+
+                LevelFilteringNavigationController.SelectAnnotatedBeatmapLevelCollection(collection as IBeatmapLevelPack);                
 
                 Logger.Debug("Done selecting level collection!");
             }
@@ -304,7 +332,7 @@ namespace SongBrowser.DataAccess
                 Logger.Debug("Song is not in the level pack, cannot scroll to it...  Using last known row {0}/{1}", selectedRow, maxCount);
                 selectedIndex = Math.Min(maxCount, selectedRow);
             }
-            else
+            else if (LevelCollectionViewController.GetPrivateField<bool>("_showHeader"))
             {
                 // the header counts as an index, so if the index came from the level array we have to add 1.
                 selectedIndex += 1;

+ 32 - 11
SongBrowserPlugin/UI/Browser/SongBrowserUI.cs

@@ -69,6 +69,7 @@ namespace SongBrowser.UI
         private RectTransform _noteJumpStartBeatOffsetLabel;
 
         private IAnnotatedBeatmapLevelCollection _lastLevelCollection;
+        bool _selectingCategory = false;
 
         private SongBrowserModel _model;
         public SongBrowserModel Model
@@ -582,7 +583,7 @@ namespace SongBrowser.UI
             _lastLevelCollection = annotatedBeatmapLevelCollection;
             Model.Settings.currentLevelCategoryName = _beatUi.LevelFilteringNavigationController.selectedLevelCategory.ToString();
             Model.Settings.Save();
-            Logger.Debug("Selected Level Collection={0}", _lastLevelCollection);
+            Logger.Debug("AnnotatedBeatmapLevelCollection, Selected Level Collection={0}", _lastLevelCollection);
         }
 
         /// <summary>
@@ -615,17 +616,22 @@ namespace SongBrowser.UI
             if (arg2 as PreviewBeatmapLevelPackSO)
             {
                 Logger.Info("Hiding SongBrowser, previewing a song pack.");
-                //CancelFilter();
                 Hide();
                 return;
             }
-            else
+
+            Show();
+
+            // category transition, just record the new collection
+            if (_selectingCategory)
             {
-                Show();
+                Logger.Info("Transitioning level category");
+                _lastLevelCollection = arg2;
+                StartCoroutine(RefreshSongListEndOfFrame());
+                return;
             }
 
-            // Skip the first time - Effectively ignores BeatSaber forcing OST1 on us on first load.
-            // Skip when we have a playlist
+            // Skip the first time - prevents a bunch of reload content spam
             if (_lastLevelCollection == null)
             {
                 return;
@@ -684,6 +690,12 @@ namespace SongBrowser.UI
             RefreshSongUI();
         }
 
+        public IEnumerator RefreshSongListEndOfFrame()
+        {
+            yield return new WaitForEndOfFrame();
+            RefreshSongUI();
+        }
+
         /// <summary>
         /// Remove all filters, update song list, save.
         /// </summary>
@@ -755,7 +767,7 @@ namespace SongBrowser.UI
 
             if (mode == SongFilterMode.Favorites)
             {
-                _beatUi.SelectLevelCollection(SelectLevelCategoryViewController.LevelCategory.Favorites.ToString(), SongBrowserSettings.CUSTOM_SONGS_LEVEL_COLLECTION_NAME);
+                _beatUi.SelectLevelCategory(SelectLevelCategoryViewController.LevelCategory.Favorites.ToString());
             }
             else
             {
@@ -1350,11 +1362,20 @@ namespace SongBrowser.UI
             if (_uiCreated)
             {
                 IAnnotatedBeatmapLevelCollection currentSelected = _beatUi.GetCurrentSelectedAnnotatedBeatmapLevelCollection();
-                Logger.Debug("Current selected level collection: {0}", currentSelected);
+                Logger.Debug("Updating level collection, current selected level collection: {0}", currentSelected);
+
+                // select category
+                if (!String.IsNullOrEmpty(_model.Settings.currentLevelCategoryName))
+                {
+                    _selectingCategory = true;
+                    _beatUi.SelectLevelCategory(_model.Settings.currentLevelCategoryName);
+                    _selectingCategory = false;
+                }
 
+                // select collection
                 if (String.IsNullOrEmpty(_model.Settings.currentLevelCollectionName))
                 {
-                    if (currentSelected == null)
+                    if (currentSelected == null && String.IsNullOrEmpty(_model.Settings.currentLevelCategoryName))
                     {
                         Logger.Debug("No level collection selected, acquiring the first available, likely OST1...");
                         currentSelected = _beatUi.BeatmapLevelsModel.allLoadedBeatmapLevelPackCollection.beatmapLevelPacks[0];
@@ -1370,13 +1391,13 @@ namespace SongBrowser.UI
                     {
                         Hide();
                     }
-                    _beatUi.SelectLevelCollection(_model.Settings.currentLevelCategoryName, _model.Settings.currentLevelCollectionName);
+                    _beatUi.SelectLevelCollection(_model.Settings.currentLevelCollectionName);
                     _beatUi.LevelFilteringNavigationController.didSelectAnnotatedBeatmapLevelCollectionEvent += _levelFilteringNavController_didSelectAnnotatedBeatmapLevelCollectionEvent;
                 }
 
                 if (_lastLevelCollection == null)
                 {
-                    if (currentSelected.collectionName != SongBrowserModel.FilteredSongsCollectionName && currentSelected.collectionName != SongBrowserModel.PlaylistSongsCollectionName)
+                    if (currentSelected != null && currentSelected.collectionName != SongBrowserModel.FilteredSongsCollectionName && currentSelected.collectionName != SongBrowserModel.PlaylistSongsCollectionName)
                     {
                         _lastLevelCollection = currentSelected;
                     }