Browse Source

V6.0.2 (#100)

* Version bump.
* Update template for Beatmods release.
* Small refactor + small fix for Hoverhint.
* Don't re-migrate if someone manually restores their original SongBrowser
favorites playlist.
* Restore delete button functionality.
* Fix fast scroll up button placement.
* Do not update level selection if level selection is not active.
* Do not SetData on nav controller if it is not active.
Halsafar 5 years ago
parent
commit
155ac92214

+ 2 - 2
BeatModsReleaseTemplate.txt

@@ -1,10 +1,10 @@
 SongBrowser
 SongBrowser
 
 
-6.0.1
+6.0.2
 
 
 SongCore@2.7.2,SongDataCore@1.1.5
 SongCore@2.7.2,SongDataCore@1.1.5
 
 
-Adds various sorting and filtering methods to the UI. Search, favorites, ranked, and unranked filters. Sort by BeatSaver and ScoreSaber statistics. Adds PP and other extra stats to the existing menu.
+Adds various sorting and filtering methods to the UI. Search, favorites, ranked, and unranked filters. Sort by BeatSaver and ScoreSaber statistics. Adds PP and other extra stats to the stat panel.
 
 
 https://github.com/halsafar/BeatSaberSongBrowser
 https://github.com/halsafar/BeatSaberSongBrowser
 
 

+ 4 - 2
SongBrowserPlugin/DataAccess/SongBrowserModel.cs

@@ -324,8 +324,10 @@ namespace SongBrowser
             bool _showPlayerStatsInDetailView = navController.GetPrivateField<bool>("_showPlayerStatsInDetailView");
             bool _showPlayerStatsInDetailView = navController.GetPrivateField<bool>("_showPlayerStatsInDetailView");
             bool _showPracticeButtonInDetailView = navController.GetPrivateField<bool>("_showPracticeButtonInDetailView");
             bool _showPracticeButtonInDetailView = navController.GetPrivateField<bool>("_showPracticeButtonInDetailView");
 
 
-            //levelCollectionViewController.SetData(levelPack.beatmapLevelCollection, _headerText, _headerSprite, false, _noDataText.text);
-            navController.SetData(levelPack, true, _showPlayerStatsInDetailView, _showPracticeButtonInDetailView, _noDataText.text);
+            if (navController.isInViewControllerHierarchy && navController.isActiveAndEnabled)
+            {
+                navController.SetData(levelPack, true, _showPlayerStatsInDetailView, _showPracticeButtonInDetailView, _noDataText.text);
+            }
 
 
             //_sortedSongs.ForEach(x => Logger.Debug(x.levelID));
             //_sortedSongs.ForEach(x => Logger.Debug(x.levelID));
         }
         }

+ 4 - 3
SongBrowserPlugin/DataAccess/SongBrowserSettings.cs

@@ -218,9 +218,11 @@ namespace SongBrowser.DataAccess
         /// </summary>
         /// </summary>
         public static void MigrateFavorites()
         public static void MigrateFavorites()
         {
         {
-            // Always the favorites, never used this feature    
+            String migratedPlaylistPath = Path.Combine(Environment.CurrentDirectory, "Playlists", MigratedFavoritesPlaylistName);
             String oldFavoritesPath = Path.Combine(Environment.CurrentDirectory, "Playlists", DefaultConvertedFavoritesPlaylistName);
             String oldFavoritesPath = Path.Combine(Environment.CurrentDirectory, "Playlists", DefaultConvertedFavoritesPlaylistName);
-            if (!File.Exists(oldFavoritesPath))
+
+            // Skip if already migrated or if the song browser favorites do not exist
+            if (!File.Exists(oldFavoritesPath) || File.Exists(migratedPlaylistPath))
             {
             {
                 return;
                 return;
             }
             }
@@ -236,7 +238,6 @@ namespace SongBrowser.DataAccess
                 playerData.playerData.favoritesLevelIds.Add(levelID);
                 playerData.playerData.favoritesLevelIds.Add(levelID);
             }
             }
 
 
-            String migratedPlaylistPath = Path.Combine(Environment.CurrentDirectory, "Playlists", MigratedFavoritesPlaylistName);
             Logger.Info("Moving [{0}->{1}] into the In-Game favorites.", oldFavoritesPath, migratedPlaylistPath);
             Logger.Info("Moving [{0}->{1}] into the In-Game favorites.", oldFavoritesPath, migratedPlaylistPath);
             File.Move(oldFavoritesPath, migratedPlaylistPath);
             File.Move(oldFavoritesPath, migratedPlaylistPath);
 
 

+ 5 - 5
SongBrowserPlugin/Internals/BeatSaberUI.cs

@@ -241,10 +241,10 @@ namespace SongBrowser.Internals
         {
         {
             HoverHintController hoverHintController = Resources.FindObjectsOfTypeAll<HoverHintController>().First();
             HoverHintController hoverHintController = Resources.FindObjectsOfTypeAll<HoverHintController>().First();
             DestroyHoverHint(button);
             DestroyHoverHint(button);
-            HoverHint hoverHint = button.gameObject.AddComponent<HoverHint>();
-            hoverHint.SetPrivateField("_hoverHintController", hoverHintController);
-            hoverHint.text = text;
-            hoverHint.name = name;
+            var newHoverHint = button.gameObject.AddComponent<HoverHint>();
+            newHoverHint.SetPrivateField("_hoverHintController", hoverHintController);
+            newHoverHint.text = text;
+            newHoverHint.name = name;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -253,7 +253,7 @@ namespace SongBrowser.Internals
         /// <param name="button"></param>
         /// <param name="button"></param>
         public static void DestroyHoverHint(RectTransform button)
         public static void DestroyHoverHint(RectTransform button)
         {
         {
-            HoverHint currentHoverHint = button.GetComponentsInChildren<HMUI.HoverHint>().FirstOrDefault();
+            HoverHint currentHoverHint = button.GetComponentsInChildren<HMUI.HoverHint>().First();
             if (currentHoverHint != null)
             if (currentHoverHint != null)
             {
             {
                 UnityEngine.GameObject.DestroyImmediate(currentHoverHint);
                 UnityEngine.GameObject.DestroyImmediate(currentHoverHint);

+ 2 - 2
SongBrowserPlugin/Plugin.cs

@@ -9,7 +9,7 @@ namespace SongBrowser
 {
 {
     public class Plugin : IBeatSaberPlugin
     public class Plugin : IBeatSaberPlugin
     {
     {
-        public const string VERSION_NUMBER = "6.0.1";
+        public const string VERSION_NUMBER = "6.0.2";
         public static Plugin Instance;
         public static Plugin Instance;
         public static IPA.Logging.Logger Log;
         public static IPA.Logging.Logger Log;
 
 
@@ -56,7 +56,7 @@ namespace SongBrowser
 
 
         public void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
         public void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
         {
         {
- 
+
         }
         }
 
 
         public void OnSceneUnloaded(Scene scene)
         public void OnSceneUnloaded(Scene scene)

+ 2 - 2
SongBrowserPlugin/Properties/AssemblyInfo.cs

@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers 
 // You can specify all the values or you can default the Build and Revision Numbers 
 // by using the '*' as shown below:
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("6.0.1")]
-[assembly: AssemblyFileVersion("6.0.1")]
+[assembly: AssemblyVersion("6.0.2")]
+[assembly: AssemblyFileVersion("6.0.2")]

+ 5 - 1
SongBrowserPlugin/UI/Browser/BeatSaberUIController.cs

@@ -253,7 +253,11 @@ namespace SongBrowser.DataAccess
             Logger.Debug("Scrolling level list to idx: {0}", selectedIndex);
             Logger.Debug("Scrolling level list to idx: {0}", selectedIndex);
 
 
             TableView tableView = LevelCollectionTableView.GetPrivateField<TableView>("_tableView");
             TableView tableView = LevelCollectionTableView.GetPrivateField<TableView>("_tableView");
-            LevelCollectionTableView.HandleDidSelectRowEvent(tableView, selectedIndex);
+
+            if (LevelCollectionTableView.selectedRow != selectedIndex && LevelCollectionTableView.isActiveAndEnabled)
+            {
+                LevelCollectionTableView.HandleDidSelectRowEvent(tableView, selectedIndex);
+            }
             tableView.ScrollToCellWithIdx(selectedIndex, TableViewScroller.ScrollPositionType.Beginning, true);
             tableView.ScrollToCellWithIdx(selectedIndex, TableViewScroller.ScrollPositionType.Beginning, true);
             tableView.SelectCellWithIdx(selectedIndex);            
             tableView.SelectCellWithIdx(selectedIndex);            
         }
         }

+ 24 - 49
SongBrowserPlugin/UI/Browser/SongBrowserUI.cs

@@ -129,7 +129,7 @@ namespace SongBrowser.UI
                 CreateOuterUi();
                 CreateOuterUi();
                 CreateSortButtons();
                 CreateSortButtons();
                 CreateFilterButtons();
                 CreateFilterButtons();
-                //CreateDeleteButton();
+                CreateDeleteButton();
                 CreateFastPageButtons();
                 CreateFastPageButtons();
 
 
                 this.InstallHandlers();
                 this.InstallHandlers();
@@ -355,7 +355,7 @@ namespace SongBrowser.UI
             _pageUpFastButton = Instantiate(_beatUi.TableViewPageUpButton, _beatUi.LevelCollectionTableViewTransform, false);
             _pageUpFastButton = Instantiate(_beatUi.TableViewPageUpButton, _beatUi.LevelCollectionTableViewTransform, false);
             (_pageUpFastButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 1f);
             (_pageUpFastButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 1f);
             (_pageUpFastButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 1f);
             (_pageUpFastButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 1f);
-            (_pageUpFastButton.transform as RectTransform).anchoredPosition = new Vector2(-26f, 0.25f);
+            (_pageUpFastButton.transform as RectTransform).anchoredPosition = new Vector2(-26f, 1f);
             (_pageUpFastButton.transform as RectTransform).sizeDelta = new Vector2(8f, 6f);
             (_pageUpFastButton.transform as RectTransform).sizeDelta = new Vector2(8f, 6f);
             _pageUpFastButton.GetComponentsInChildren<RectTransform>().First(x => x.name == "BG").sizeDelta = new Vector2(8f, 6f);
             _pageUpFastButton.GetComponentsInChildren<RectTransform>().First(x => x.name == "BG").sizeDelta = new Vector2(8f, 6f);
             _pageUpFastButton.GetComponentsInChildren<UnityEngine.UI.Image>().First(x => x.name == "Arrow").sprite = Base64Sprites.DoubleArrow;
             _pageUpFastButton.GetComponentsInChildren<UnityEngine.UI.Image>().First(x => x.name == "Arrow").sprite = Base64Sprites.DoubleArrow;
@@ -388,6 +388,7 @@ namespace SongBrowser.UI
             _deleteButton.onClick.AddListener(delegate () {
             _deleteButton.onClick.AddListener(delegate () {
                 HandleDeleteSelectedLevel();
                 HandleDeleteSelectedLevel();
             });
             });
+            BeatSaberUI.DestroyHoverHint(_deleteButton.transform as RectTransform);
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -500,10 +501,6 @@ namespace SongBrowser.UI
             {
             {
                 StartCoroutine(RefreshQuickScrollButtonsAsync());
                 StartCoroutine(RefreshQuickScrollButtonsAsync());
             });
             });
-
-            // finished level
-            ResultsViewController resultsViewController = _beatUi.LevelSelectionFlowCoordinator.GetPrivateField<ResultsViewController>("_resultsViewController");
-            resultsViewController.continueButtonPressedEvent += ResultsViewController_continueButtonPressedEvent;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -556,35 +553,6 @@ namespace SongBrowser.UI
         }
         }
 
 
         /// <summary>
         /// <summary>
-        /// Handle updating the level pack selection after returning from a song.
-        /// </summary>SongBrowserPlugin/UI/Browser/SongBrowserUI.cs 
-        /// <param name="obj"></param>
-        private void ResultsViewController_continueButtonPressedEvent(ResultsViewController obj)
-        {
-            StartCoroutine(this.UpdateLevelPackSelectionEndOfFrame());
-        }
-
-        /// <summary>
-        /// TODO - evaluate this sillyness...
-        /// </summary>
-        /// <returns></returns>
-        public IEnumerator UpdateLevelPackSelectionEndOfFrame()
-        {
-            yield return new WaitForEndOfFrame();
-
-            try
-            {
-                UpdateLevelPackSelection();
-                _beatUi.SelectAndScrollToLevel(_model.LastSelectedLevelId);
-                RefreshQuickScrollButtons();
-            }
-            catch (Exception e)
-            {
-                Logger.Exception("Exception:", e);
-            }
-        }
-
-        /// <summary>
         /// Handler for level pack selection.
         /// Handler for level pack selection.
         /// </summary>
         /// </summary>
         /// <param name="arg1"></param>
         /// <param name="arg1"></param>
@@ -878,7 +846,7 @@ namespace SongBrowser.UI
                 return;
                 return;
             }
             }
 
 
-            //_deleteButton.interactable = (view.selectedDifficultyBeatmap.level.levelID.Length >= 32);
+            _deleteButton.interactable = (view.selectedDifficultyBeatmap.level.levelID.Length >= 32);
 
 
             RefreshScoreSaberData(view.selectedDifficultyBeatmap.level);
             RefreshScoreSaberData(view.selectedDifficultyBeatmap.level);
             RefreshNoteJumpSpeed(beatmap.difficulty);
             RefreshNoteJumpSpeed(beatmap.difficulty);
@@ -898,7 +866,7 @@ namespace SongBrowser.UI
                 return;
                 return;
             }
             }
 
 
-            //_deleteButton.interactable = (_beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level.levelID.Length >= 32);
+            _deleteButton.interactable = (_beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level.levelID.Length >= 32);
 
 
             RefreshScoreSaberData(view.selectedDifficultyBeatmap.level);
             RefreshScoreSaberData(view.selectedDifficultyBeatmap.level);
             RefreshNoteJumpSpeed(view.selectedDifficultyBeatmap.difficulty);
             RefreshNoteJumpSpeed(view.selectedDifficultyBeatmap.difficulty);
@@ -912,7 +880,7 @@ namespace SongBrowser.UI
         {
         {
             Logger.Trace("HandleDidSelectLevelRow({0})", level);
             Logger.Trace("HandleDidSelectLevelRow({0})", level);
 
 
-            //_deleteButton.interactable = (level.levelID.Length >= 32);
+            _deleteButton.interactable = (level.levelID.Length >= 32);
 
 
             RefreshQuickScrollButtons();
             RefreshQuickScrollButtons();
         }
         }
@@ -922,7 +890,7 @@ namespace SongBrowser.UI
         /// </summary>
         /// </summary>
         private void HandleDeleteSelectedLevel()
         private void HandleDeleteSelectedLevel()
         {
         {
-            /*IBeatmapLevel level = _beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level;
+            IBeatmapLevel level = _beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level;
             _deleteDialog.Init("Delete song", $"Do you really want to delete \"{ level.songName} {level.songSubName}\"?", "Delete", "Cancel",
             _deleteDialog.Init("Delete song", $"Do you really want to delete \"{ level.songName} {level.songSubName}\"?", "Delete", "Cancel",
                 (selectedButton) =>
                 (selectedButton) =>
                 {
                 {
@@ -934,25 +902,32 @@ namespace SongBrowser.UI
                             // determine the index we are deleting so we can keep the cursor near the same spot after
                             // determine the index we are deleting so we can keep the cursor near the same spot after
                             // the header counts as an index, so if the index came from the level array we have to add 1.
                             // the header counts as an index, so if the index came from the level array we have to add 1.
                             var levelsTableView = _beatUi.LevelCollectionTableView;
                             var levelsTableView = _beatUi.LevelCollectionTableView;
-                            List<IPreviewBeatmapLevel> levels = levelsTableView.GetPrivateField<IBeatmapLevelPack>("_pack").beatmapLevelCollection.beatmapLevels.ToList();
+                            List<IPreviewBeatmapLevel> levels = _beatUi.GetCurrentLevelPackLevels().ToList();
                             int selectedIndex = levels.FindIndex(x => x.levelID == _beatUi.StandardLevelDetailView.selectedDifficultyBeatmap.level.levelID);
                             int selectedIndex = levels.FindIndex(x => x.levelID == _beatUi.StandardLevelDetailView.selectedDifficultyBeatmap.level.levelID);
 
 
                             if (selectedIndex > -1)
                             if (selectedIndex > -1)
                             {
                             {
                                 var song = SongCore.Loader.CustomLevels.First(x => x.Value.levelID == _beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level.levelID).Value;
                                 var song = SongCore.Loader.CustomLevels.First(x => x.Value.levelID == _beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level.levelID).Value;
+
+                                Logger.Info($"Deleting song: {song.customLevelPath}");
                                 SongCore.Loader.Instance.DeleteSong(song.customLevelPath);
                                 SongCore.Loader.Instance.DeleteSong(song.customLevelPath);
                                 this._model.RemoveSongFromLevelPack(_beatUi.GetCurrentSelectedLevelPack(), _beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level.levelID);
                                 this._model.RemoveSongFromLevelPack(_beatUi.GetCurrentSelectedLevelPack(), _beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level.levelID);
 
 
-                                this.UpdateLevelDataModel();
-                                this.RefreshSongList();
-
                                 int removedLevels = levels.RemoveAll(x => x.levelID == _beatUi.StandardLevelDetailView.selectedDifficultyBeatmap.level.levelID);
                                 int removedLevels = levels.RemoveAll(x => x.levelID == _beatUi.StandardLevelDetailView.selectedDifficultyBeatmap.level.levelID);
                                 Logger.Info("Removed " + removedLevels + " level(s) from song list!");
                                 Logger.Info("Removed " + removedLevels + " level(s) from song list!");
 
 
-                                TableView listTableView = levelsTableView.GetPrivateField<TableView>("_tableView");
-                                listTableView.ScrollToCellWithIdx(selectedIndex, TableViewScroller.ScrollPositionType.Beginning, false);
-                                levelsTableView.SetPrivateField("_selectedRow", selectedIndex);
-                                listTableView.SelectCellWithIdx(selectedIndex, true);
+                                this.UpdateLevelDataModel();
+
+                                // if we have a song to select at the same index, set the last selected level id, UI updates takes care of the rest.
+                                if (selectedIndex < levels.Count)
+                                {
+                                    if (levels[selectedIndex].levelID != null)
+                                    {
+                                        _model.LastSelectedLevelId = levels[selectedIndex].levelID;
+                                    }
+                                }
+
+                                this.RefreshSongList();
                             }
                             }
                         }
                         }
                         catch (Exception e)
                         catch (Exception e)
@@ -961,7 +936,7 @@ namespace SongBrowser.UI
                         }
                         }
                     }
                     }
                 });
                 });
-            _beatUi.LevelSelectionFlowCoordinator.InvokePrivateMethod("PresentViewController", new object[] { _deleteDialog, null, false });*/
+            _beatUi.LevelSelectionFlowCoordinator.InvokePrivateMethod("PresentViewController", new object[] { _deleteDialog, null, false });
         }        
         }        
 
 
         /// <summary>
         /// <summary>
@@ -1178,7 +1153,7 @@ namespace SongBrowser.UI
 
 
             RefreshOuterUIState(visible == true ? UIState.Main : UIState.Disabled);
             RefreshOuterUIState(visible == true ? UIState.Main : UIState.Disabled);
 
 
-            //_deleteButton.gameObject.SetActive(visible);
+            _deleteButton.gameObject.SetActive(visible);
 
 
             _pageUpFastButton.gameObject.SetActive(visible);
             _pageUpFastButton.gameObject.SetActive(visible);
             _pageDownFastButton.gameObject.SetActive(visible);
             _pageDownFastButton.gameObject.SetActive(visible);

+ 1 - 1
SongBrowserPlugin/manifest.json

@@ -5,7 +5,7 @@
   "gameVersion": "1.6.0",
   "gameVersion": "1.6.0",
   "id": "SongBrowser",
   "id": "SongBrowser",
   "name": "Song Browser",
   "name": "Song Browser",
-  "version": "6.0.1",
+  "version": "6.0.2",
   "dependsOn": {
   "dependsOn": {
     "SongCore": "^2.7.2",
     "SongCore": "^2.7.2",
     "SongDataCore": "^1.1.5"
     "SongDataCore": "^1.1.5"