Prechádzať zdrojové kódy

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 rokov pred
rodič
commit
155ac92214

+ 2 - 2
BeatModsReleaseTemplate.txt

@@ -1,10 +1,10 @@
 SongBrowser
 
-6.0.1
+6.0.2
 
 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
 

+ 4 - 2
SongBrowserPlugin/DataAccess/SongBrowserModel.cs

@@ -324,8 +324,10 @@ namespace SongBrowser
             bool _showPlayerStatsInDetailView = navController.GetPrivateField<bool>("_showPlayerStatsInDetailView");
             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));
         }

+ 4 - 3
SongBrowserPlugin/DataAccess/SongBrowserSettings.cs

@@ -218,9 +218,11 @@ namespace SongBrowser.DataAccess
         /// </summary>
         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);
-            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;
             }
@@ -236,7 +238,6 @@ namespace SongBrowser.DataAccess
                 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);
             File.Move(oldFavoritesPath, migratedPlaylistPath);
 

+ 5 - 5
SongBrowserPlugin/Internals/BeatSaberUI.cs

@@ -241,10 +241,10 @@ namespace SongBrowser.Internals
         {
             HoverHintController hoverHintController = Resources.FindObjectsOfTypeAll<HoverHintController>().First();
             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>
@@ -253,7 +253,7 @@ namespace SongBrowser.Internals
         /// <param name="button"></param>
         public static void DestroyHoverHint(RectTransform button)
         {
-            HoverHint currentHoverHint = button.GetComponentsInChildren<HMUI.HoverHint>().FirstOrDefault();
+            HoverHint currentHoverHint = button.GetComponentsInChildren<HMUI.HoverHint>().First();
             if (currentHoverHint != null)
             {
                 UnityEngine.GameObject.DestroyImmediate(currentHoverHint);

+ 2 - 2
SongBrowserPlugin/Plugin.cs

@@ -9,7 +9,7 @@ namespace SongBrowser
 {
     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 IPA.Logging.Logger Log;
 
@@ -56,7 +56,7 @@ namespace SongBrowser
 
         public void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
         {
- 
+
         }
 
         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 
 // by using the '*' as shown below:
 // [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);
 
             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.SelectCellWithIdx(selectedIndex);            
         }

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

@@ -129,7 +129,7 @@ namespace SongBrowser.UI
                 CreateOuterUi();
                 CreateSortButtons();
                 CreateFilterButtons();
-                //CreateDeleteButton();
+                CreateDeleteButton();
                 CreateFastPageButtons();
 
                 this.InstallHandlers();
@@ -355,7 +355,7 @@ namespace SongBrowser.UI
             _pageUpFastButton = Instantiate(_beatUi.TableViewPageUpButton, _beatUi.LevelCollectionTableViewTransform, false);
             (_pageUpFastButton.transform as RectTransform).anchorMin = 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.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;
@@ -388,6 +388,7 @@ namespace SongBrowser.UI
             _deleteButton.onClick.AddListener(delegate () {
                 HandleDeleteSelectedLevel();
             });
+            BeatSaberUI.DestroyHoverHint(_deleteButton.transform as RectTransform);
         }
 
         /// <summary>
@@ -500,10 +501,6 @@ namespace SongBrowser.UI
             {
                 StartCoroutine(RefreshQuickScrollButtonsAsync());
             });
-
-            // finished level
-            ResultsViewController resultsViewController = _beatUi.LevelSelectionFlowCoordinator.GetPrivateField<ResultsViewController>("_resultsViewController");
-            resultsViewController.continueButtonPressedEvent += ResultsViewController_continueButtonPressedEvent;
         }
 
         /// <summary>
@@ -556,35 +553,6 @@ namespace SongBrowser.UI
         }
 
         /// <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.
         /// </summary>
         /// <param name="arg1"></param>
@@ -878,7 +846,7 @@ namespace SongBrowser.UI
                 return;
             }
 
-            //_deleteButton.interactable = (view.selectedDifficultyBeatmap.level.levelID.Length >= 32);
+            _deleteButton.interactable = (view.selectedDifficultyBeatmap.level.levelID.Length >= 32);
 
             RefreshScoreSaberData(view.selectedDifficultyBeatmap.level);
             RefreshNoteJumpSpeed(beatmap.difficulty);
@@ -898,7 +866,7 @@ namespace SongBrowser.UI
                 return;
             }
 
-            //_deleteButton.interactable = (_beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level.levelID.Length >= 32);
+            _deleteButton.interactable = (_beatUi.LevelDetailViewController.selectedDifficultyBeatmap.level.levelID.Length >= 32);
 
             RefreshScoreSaberData(view.selectedDifficultyBeatmap.level);
             RefreshNoteJumpSpeed(view.selectedDifficultyBeatmap.difficulty);
@@ -912,7 +880,7 @@ namespace SongBrowser.UI
         {
             Logger.Trace("HandleDidSelectLevelRow({0})", level);
 
-            //_deleteButton.interactable = (level.levelID.Length >= 32);
+            _deleteButton.interactable = (level.levelID.Length >= 32);
 
             RefreshQuickScrollButtons();
         }
@@ -922,7 +890,7 @@ namespace SongBrowser.UI
         /// </summary>
         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",
                 (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
                             // the header counts as an index, so if the index came from the level array we have to add 1.
                             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);
 
                             if (selectedIndex > -1)
                             {
                                 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);
                                 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);
                                 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)
@@ -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>
@@ -1178,7 +1153,7 @@ namespace SongBrowser.UI
 
             RefreshOuterUIState(visible == true ? UIState.Main : UIState.Disabled);
 
-            //_deleteButton.gameObject.SetActive(visible);
+            _deleteButton.gameObject.SetActive(visible);
 
             _pageUpFastButton.gameObject.SetActive(visible);
             _pageDownFastButton.gameObject.SetActive(visible);

+ 1 - 1
SongBrowserPlugin/manifest.json

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