Prechádzať zdrojové kódy

Added fast scroll buttons (jump 10% of total song count).

Stephen Damm 6 rokov pred
rodič
commit
50410e0364

+ 4 - 0
SongBrowserPlugin/SongBrowserPlugin.csproj

@@ -66,6 +66,10 @@
     <Reference Include="UnityEngine.JSONSerializeModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
       <HintPath>D:\Games\Steam\SteamApps\common\Beat Saber\Beat Saber_Data\Managed\UnityEngine.JSONSerializeModule.dll</HintPath>
     </Reference>
+    <Reference Include="UnityEngine.TextRenderingModule, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>D:\Games\Steam\SteamApps\common\Beat Saber\Beat Saber_Data\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
+    </Reference>
     <Reference Include="UnityEngine.UI, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>D:\Games\Steam\SteamApps\common\Beat Saber\Beat Saber_Data\Managed\UnityEngine.UI.dll</HintPath>

+ 91 - 32
SongBrowserPlugin/UI/SongBrowserUI.cs

@@ -20,6 +20,9 @@ namespace SongBrowserPlugin.UI
     {
         // Logging
         public const String Name = "SongBrowserUI";
+
+        private const float SEGMENT_PERCENT = 0.1f;
+
         private Logger _log = new Logger(Name);
 
         // Beat Saber UI Elements
@@ -30,6 +33,8 @@ namespace SongBrowserPlugin.UI
         private StandardLevelSelectionNavigationController _levelSelectionNavigationController;
         private StandardLevelListTableView _levelListTableView;
         private RectTransform _tableViewRectTransform;
+        private Button _tableViewPageUpButton;
+        private Button _tableViewPageDownButton;
 
         // New UI Elements
         private List<SongSortButton> _sortButtonGroup;
@@ -37,7 +42,9 @@ namespace SongBrowserPlugin.UI
         private String _addFavoriteButtonText = null;
         private SimpleDialogPromptViewController _simpleDialogPromptViewControllerPrefab;
         private SimpleDialogPromptViewController _deleteDialog;
-        private Button _deleteButton;
+        private Button _deleteButton;        
+        private Button _pageUpTenPercent;
+        private Button _pageDownTenPercent;
 
         // Debug
         private int _sortButtonLastPushedIndex = 0;
@@ -121,18 +128,22 @@ namespace SongBrowserPlugin.UI
 
             try
             {
-                RectTransform parent = this._levelSelectionNavigationController.transform as RectTransform;
+                // Gather some transforms and templates to use.
+                RectTransform sortButtonTransform = this._levelSelectionNavigationController.transform as RectTransform;
+                RectTransform otherButtonTransform = this._levelDetailViewController.transform as RectTransform;
+                Button sortButtonTemplate = Resources.FindObjectsOfTypeAll<Button>().First(x => (x.name == "PlayButton"));
+                Button otherButtonTemplate = Resources.FindObjectsOfTypeAll<Button>().First(x => (x.name == "QuitButton"));
 
                 // Resize some of the UI
                 _tableViewRectTransform = _levelListViewController.GetComponentsInChildren<RectTransform>().First(x => x.name == "TableViewContainer");
                 _tableViewRectTransform.sizeDelta = new Vector2(0f, -20f);
                 _tableViewRectTransform.anchoredPosition = new Vector2(0f, -2.5f);
 
-                Button pageUp = _tableViewRectTransform.GetComponentsInChildren<Button>().First(x => x.name == "PageUpButton");
-                (pageUp.transform as RectTransform).anchoredPosition = new Vector2(0f, -1f);
+                _tableViewPageUpButton = _tableViewRectTransform.GetComponentsInChildren<Button>().First(x => x.name == "PageUpButton");
+                (_tableViewPageUpButton.transform as RectTransform).anchoredPosition = new Vector2(0f, -1f);
 
-                Button pageDown = _tableViewRectTransform.GetComponentsInChildren<Button>().First(x => x.name == "PageDownButton");
-                (pageDown.transform as RectTransform).anchoredPosition = new Vector2(0f, 1f);
+                _tableViewPageDownButton = _tableViewRectTransform.GetComponentsInChildren<Button>().First(x => x.name == "PageDownButton");
+                (_tableViewPageDownButton.transform as RectTransform).anchoredPosition = new Vector2(0f, 1f);
 
                 // Create Sorting Songs By-Buttons
                 _log.Debug("Creating sort by buttons...");
@@ -155,9 +166,6 @@ namespace SongBrowserPlugin.UI
                     RefreshSongList();
                 };
 
-                Button sortButtonTemplate = Resources.FindObjectsOfTypeAll<Button>().First(x => (x.name == "PlayButton"));
-                Button otherButtonTemplate = Resources.FindObjectsOfTypeAll<Button>().First(x => (x.name == "QuitButton"));
-
                 float fontSize = 2.75f;
                 float buttonWidth = 17.0f;
                 float buttonHeight = 5.0f;
@@ -177,19 +185,17 @@ namespace SongBrowserPlugin.UI
                 _sortButtonGroup = new List<SongSortButton>();
                 for (int i = 0; i < buttonNames.Length; i++)
                 {
-                    _sortButtonGroup.Add(UIBuilder.CreateSortButton(parent, sortButtonTemplate, arrowIcon, buttonNames[i], fontSize, buttonX, buttonY, buttonWidth, buttonHeight, sortModes[i], onSortButtonClickEvent));
+                    _sortButtonGroup.Add(UIBuilder.CreateSortButton(sortButtonTransform, sortButtonTemplate, arrowIcon, buttonNames[i], fontSize, buttonX, buttonY, buttonWidth, buttonHeight, sortModes[i], onSortButtonClickEvent));
                     buttonX -= buttonWidth;
                 }
 
                 // Creaate Add to Favorites Button
-                _log.Debug("Creating add to favorites button...");
-
-                RectTransform transform = this._levelDetailViewController.transform as RectTransform;
-                _addFavoriteButton = UIBuilder.CreateUIButton(transform, otherButtonTemplate);
+                _log.Debug("Creating add to favorites button...");                
+                _addFavoriteButton = UIBuilder.CreateUIButton(otherButtonTransform, otherButtonTemplate);
                 (_addFavoriteButton.transform as RectTransform).anchoredPosition = new Vector2(40f, 5.75f);
                 (_addFavoriteButton.transform as RectTransform).sizeDelta = new Vector2(10f, 10f);
                 UIBuilder.SetButtonText(ref _addFavoriteButton, _addFavoriteButtonText);
-                UIBuilder.SetButtonTextSize(ref _addFavoriteButton, 3);
+                UIBuilder.SetButtonTextSize(ref _addFavoriteButton, fontSize);
                 UIBuilder.SetButtonIconEnabled(ref _addFavoriteButton, false);
                 _addFavoriteButton.onClick.RemoveAllListeners();
                 _addFavoriteButton.onClick.AddListener(delegate () {
@@ -207,20 +213,29 @@ namespace SongBrowserPlugin.UI
 
                 // Create delete button
                 _log.Debug("Creating delete button...");
-
-                transform = this._levelDetailViewController.transform as RectTransform;
-                _deleteButton = UIBuilder.CreateUIButton(transform, otherButtonTemplate);
+                _deleteButton = UIBuilder.CreateUIButton(otherButtonTransform, otherButtonTemplate);
                 (_deleteButton.transform as RectTransform).anchoredPosition = new Vector2(46f, 0f);
                 (_deleteButton.transform as RectTransform).sizeDelta = new Vector2(15f, 5f);
                 UIBuilder.SetButtonText(ref _deleteButton, "Delete");
-                UIBuilder.SetButtonTextSize(ref _deleteButton, 3);
+                UIBuilder.SetButtonTextSize(ref _deleteButton, fontSize);
                 UIBuilder.SetButtonIconEnabled(ref _deleteButton, false);
                 _deleteButton.onClick.RemoveAllListeners();
                 _deleteButton.onClick.AddListener(delegate () {
                     HandleDeleteSelectedLevel();
                 });
 
-                RefreshUI();
+                // Create fast scroll buttons
+                _pageUpTenPercent = UIBuilder.CreatePageButton(sortButtonTransform, otherButtonTemplate, arrowIcon, 15, 67.5f, 6.0f, 5.5f, 1.5f, 1.5f, 180);
+                _pageUpTenPercent.onClick.AddListener(delegate () {
+                    this.JumpSongList(-1, SEGMENT_PERCENT);
+                });
+
+                _pageDownTenPercent = UIBuilder.CreatePageButton(sortButtonTransform, otherButtonTemplate, arrowIcon, 15, 0.5f, 6.0f, 5.5f, 1.5f, 1.5f, 0);
+                _pageDownTenPercent.onClick.AddListener(delegate () {
+                    this.JumpSongList(1, SEGMENT_PERCENT);
+                });
+
+                RefreshSortButtonUI();
             }
             catch (Exception e)
             {
@@ -250,6 +265,7 @@ namespace SongBrowserPlugin.UI
             SongBrowserModel.LastSelectedLevelId = level.levelID;
 
             RefreshAddFavoriteButton(level.levelID);
+            RefreshQuickScrollButtons();
         }
 
         /// <summary>
@@ -370,6 +386,30 @@ namespace SongBrowserPlugin.UI
         }
 
         /// <summary>
+        /// Make big jumps in the song list.
+        /// </summary>
+        /// <param name="numJumps"></param>
+        private void JumpSongList(int numJumps, float segmentPercent)
+        {
+            int totalSize = _model.SortedSongList.Count;
+            int segmentSize = (int)(totalSize * segmentPercent);
+
+            TableView tableView = ReflectionUtil.GetPrivateField<TableView>(_levelListTableView, "_tableView");
+            HashSet<int> rows = tableView.GetPrivateField<HashSet<int>>("_selectedRows");
+            int listSegment = (rows.First() / segmentSize);
+            int newSegment = listSegment + numJumps;
+            int newRow = 0;
+            if (newSegment > 0)
+            {
+                newRow = Math.Min(newSegment * segmentSize, totalSize - 1);
+            }                       
+
+            _log.Debug("ListSegment: {0}, newRow: {1}", listSegment, newRow);
+
+            this.SelectAndScrollToLevel(_levelListTableView, _model.SortedSongList[newRow].levelID);
+        }
+
+        /// <summary>
         /// Add/Remove song from favorites depending on if it already exists.
         /// </summary>
         private void ToggleSongInFavorites()
@@ -394,6 +434,16 @@ namespace SongBrowserPlugin.UI
         }
 
         /// <summary>
+        /// 
+        /// </summary>
+        private void RefreshQuickScrollButtons()
+        {
+            // Refresh the fast scroll buttons
+            _pageUpTenPercent.interactable = _tableViewPageUpButton.interactable;
+            _pageDownTenPercent.interactable = _tableViewPageDownButton.interactable;
+        }
+
+        /// <summary>
         /// Helper to quickly refresh add to favorites button
         /// </summary>
         /// <param name="levelId"></param>
@@ -420,7 +470,7 @@ namespace SongBrowserPlugin.UI
         /// <summary>
         /// Adjust the UI colors.
         /// </summary>
-        public void RefreshUI()
+        public void RefreshSortButtonUI()
         {
             // So far all we need to refresh is the sort buttons.
             foreach (SongSortButton sortButton in _sortButtonGroup)
@@ -460,10 +510,10 @@ namespace SongBrowserPlugin.UI
 
                 StandardLevelSO[] levels = _model.SortedSongList.ToArray();
                 StandardLevelListViewController songListViewController = this._levelSelectionFlowCoordinator.GetPrivateField<StandardLevelListViewController>("_levelListViewController");
-                StandardLevelListTableView _songListTableView = songListViewController.GetComponentInChildren<StandardLevelListTableView>();
-                ReflectionUtil.SetPrivateField(_songListTableView, "_levels", levels);
+                //StandardLevelListTableView _songListTableView = songListViewController.GetComponentInChildren<StandardLevelListTableView>();
+                ReflectionUtil.SetPrivateField(_levelListTableView, "_levels", levels);
                 ReflectionUtil.SetPrivateField(songListViewController, "_levels", levels);            
-                TableView tableView = ReflectionUtil.GetPrivateField<TableView>(_songListTableView, "_tableView");
+                TableView tableView = ReflectionUtil.GetPrivateField<TableView>(_levelListTableView, "_tableView");
                 tableView.ReloadData();
 
                 String selectedLevelID = null;
@@ -479,10 +529,10 @@ namespace SongBrowserPlugin.UI
 
                 if (levels.Any(x => x.levelID == selectedLevelID))
                 {
-                    SelectAndScrollToLevel(_songListTableView, selectedLevelID);
+                    SelectAndScrollToLevel(_levelListTableView, selectedLevelID);
                 }
-                
-                RefreshUI();                
+
+                RefreshSortButtonUI();                
             }
             catch (Exception e)
             {
@@ -531,7 +581,9 @@ namespace SongBrowserPlugin.UI
         private void CheckDebugUserInput()
         {
             try
-            {                
+            {
+                bool isShiftKeyDown = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
+
                 // back
                 if (Input.GetKeyDown(KeyCode.Escape))
                 {
@@ -581,20 +633,27 @@ namespace SongBrowserPlugin.UI
                 }
 
                 // change song index
-                if (Input.GetKeyDown(KeyCode.N))
+                if (isShiftKeyDown && Input.GetKeyDown(KeyCode.N))
+                {
+                    _pageUpTenPercent.onClick.Invoke();
+                }
+                else if (Input.GetKeyDown(KeyCode.N))
                 {
                     _lastRow = (_lastRow - 1) != -1 ? (_lastRow - 1) % this._model.SortedSongList.Count : 0;
-
                     this.SelectAndScrollToLevel(_levelListTableView, _model.SortedSongList[_lastRow].levelID);
                 }
 
-                if (Input.GetKeyDown(KeyCode.M))
+                if (isShiftKeyDown && Input.GetKeyDown(KeyCode.M))
+                {
+                    _pageDownTenPercent.onClick.Invoke();
+                }
+                else if (Input.GetKeyDown(KeyCode.M))
                 {
                     _lastRow = (_lastRow + 1) % this._model.SortedSongList.Count;
-
                     this.SelectAndScrollToLevel(_levelListTableView, _model.SortedSongList[_lastRow].levelID);
                 }
 
+
                 // add to favorites
                 if (Input.GetKeyDown(KeyCode.F))
                 {

+ 42 - 17
SongBrowserPlugin/UI/UIBuilder.cs

@@ -78,26 +78,15 @@ namespace SongBrowserPlugin.UI
         /// <param name="w"></param>
         /// <param name="h"></param>
         /// <param name="action"></param>
-        public static SongSortButton CreateSortButton(RectTransform rect, Button buttonTemplate, Sprite iconSprite, string buttonText, float fontSize, float x, float y, float w, float h, SongSortMode sortMode, System.Action<SongSortMode> onClickEvent)
+        public static SongSortButton CreateSortButton(RectTransform parent, Button buttonTemplate, Sprite iconSprite, string buttonText, float fontSize, float x, float y, float w, float h, SongSortMode sortMode, System.Action<SongSortMode> onClickEvent)
         {
             SongSortButton sortButton = new SongSortButton();
-            Button newButton = UIBuilder.CreateUIButton(rect, buttonTemplate);
+            Button newButton = UIBuilder.CreateUIButton(parent, buttonTemplate);
 
             newButton.interactable = true;
             (newButton.transform as RectTransform).anchoredPosition = new Vector2(x, y);
             (newButton.transform as RectTransform).sizeDelta = new Vector2(w, h);
 
-            /*RectTransform iconTransform = newButton.GetComponentsInChildren<RectTransform>(true).First(c => c.name == "Icon");
-            iconTransform.gameObject.SetActive(false);
-
-            HorizontalLayoutGroup hgroup = iconTransform.parent.GetComponent<HorizontalLayoutGroup>();
-            hgroup.padding = new RectOffset();
-            hgroup.childForceExpandWidth = true;
-            hgroup.childForceExpandHeight = true;
-            iconTransform.sizeDelta = new Vector2(5f, 5f);
-            iconTransform.localScale = new Vector2(1f, 1f);
-            iconTransform.anchoredPosition = new Vector2(x, y);*/
-
             UIBuilder.SetButtonText(ref newButton, buttonText);
             UIBuilder.SetButtonIconEnabled(ref newButton, false);
             UIBuilder.SetButtonIcon(ref newButton, iconSprite);
@@ -115,6 +104,45 @@ namespace SongBrowserPlugin.UI
             return sortButton;
         }
 
+        public static Button CreatePageButton(RectTransform parent, Button buttonTemplate, Sprite iconSprite, float x, float y, float w, float h, float iconWidth, float iconHeight, float iconRotation)
+        {
+            Button newButton = UIBuilder.CreateUIButton(parent, buttonTemplate);
+
+            newButton.interactable = true;
+            (newButton.transform as RectTransform).anchoredPosition = new Vector2(x, y);
+            (newButton.transform as RectTransform).sizeDelta = new Vector2(w, h);
+
+            RectTransform iconTransform = newButton.GetComponentsInChildren<RectTransform>(true).First(c => c.name == "Icon");
+            iconTransform.gameObject.SetActive(true);
+
+            HorizontalLayoutGroup hgroup = iconTransform.parent.GetComponent<HorizontalLayoutGroup>();
+            UnityEngine.Object.Destroy(hgroup);
+
+            iconTransform.sizeDelta = new Vector2(iconWidth, iconHeight);
+            iconTransform.localScale = new Vector2(2f, 2f);
+            iconTransform.anchoredPosition = new Vector2(0, 0);
+            iconTransform.Rotate(0, 0, iconRotation);
+            //button.GetComponentsInChildren<Image>().First(x => x.name == "Icon").transform.Rotate(0, 0, 90);
+            //  iconTransform.anchoredPosition = new Vector2(buttonTransform.anchoredPosition.x, buttonTransform.anchoredPosition.y);
+
+            UnityEngine.Object.Destroy(newButton.GetComponentsInChildren<RectTransform>(true).First(c => c.name == "Text").gameObject);
+
+            UIBuilder.SetButtonIcon(ref newButton, iconSprite);
+
+            return newButton;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="button"></param>
+        /// <param name="s"></param>
+        public static void CreateIconForButton(ref Button button, Sprite s)
+        {
+            RectTransform buttonTransform = button.transform as RectTransform;
+            
+        }
+
         /// <summary>
         /// Generate TextMesh.
         /// </summary>
@@ -147,7 +175,6 @@ namespace SongBrowserPlugin.UI
         {
             if (button.GetComponentInChildren<TextMeshProUGUI>() != null)
             {
-
                 button.GetComponentInChildren<TextMeshProUGUI>().text = text;
             }
 
@@ -175,9 +202,7 @@ namespace SongBrowserPlugin.UI
         {
             if (button.GetComponentsInChildren<UnityEngine.UI.Image>().Count() > 1)
             {
-                Console.WriteLine("SETTING ICONS");
-                button.GetComponentsInChildren<Image>().First(x => x.name == "Icon").sprite = icon;
-                //button.GetComponentsInChildren<Image>().First(x => x.name == "Icon").transform.Rotate(0, 0, 90);
+                button.GetComponentsInChildren<Image>().First(x => x.name == "Icon").sprite = icon;                
             }            
         }