Pārlūkot izejas kodu

Filter songs by ranked/unranked. (#83)

Halsafar 5 gadi atpakaļ
vecāks
revīzija
f6504c1f2b

+ 35 - 0
SongBrowserPlugin/DataAccess/SongBrowserModel.cs

@@ -485,6 +485,12 @@ namespace SongBrowser
                 case SongFilterMode.Playlist:
                     filteredSongs = FilterPlaylist(pack);
                     break;
+                case SongFilterMode.Ranked:
+                    filteredSongs = FilterRanked(unsortedSongs, true, false);
+                    break;
+                case SongFilterMode.Unranked:
+                    filteredSongs = FilterRanked(unsortedSongs, false, true);
+                    break;
                 case SongFilterMode.Custom:
                     Logger.Info("Song filter mode set to custom. Deferring filter behaviour to another mod.");
                     filteredSongs = CustomFilterHandler != null ? CustomFilterHandler.Invoke(pack) : unsortedSongs;
@@ -655,6 +661,35 @@ namespace SongBrowser
         }
 
         /// <summary>
+        /// Filter songs based on ranked or unranked status.
+        /// </summary>
+        /// <param name="levels"></param>
+        /// <param name="includeRanked"></param>
+        /// <param name="includeUnranked"></param>
+        /// <returns></returns>
+        private List<IPreviewBeatmapLevel> FilterRanked(List<IPreviewBeatmapLevel> levels, bool includeRanked, bool includeUnranked)
+        {
+            return levels.Where(x =>
+            {
+                var hash = CustomHelpers.GetSongHash(x.levelID);
+                double maxPP = 0.0;
+                if (ScoreSaberDatabaseDownloader.ScoreSaberDataFile.SongHashToScoreSaberData.ContainsKey(hash))
+                {
+                     maxPP = ScoreSaberDatabaseDownloader.ScoreSaberDataFile.SongHashToScoreSaberData[hash].diffs.Max(y => y.pp);
+                }
+
+                if (maxPP > 0f)
+                {
+                    return includeRanked;
+                }
+                else
+                {
+                    return includeUnranked;
+                }
+            }).ToList();
+        }
+
+        /// <summary>
         /// Sorting returns original list.
         /// </summary>
         /// <param name="levels"></param>

+ 2 - 0
SongBrowserPlugin/DataAccess/SongBrowserSettings.cs

@@ -40,6 +40,8 @@ namespace SongBrowser.DataAccess
         Favorites,
         Playlist,
         Search,
+        Ranked,
+        Unranked,
 
         // For other mods that extend SongBrowser
         Custom

+ 53 - 18
SongBrowserPlugin/UI/Browser/SongBrowserUI.cs

@@ -277,7 +277,7 @@ namespace SongBrowser.UI
             float sortButtonFontSize = 2.25f;
             float sortButtonX = -23.0f;
             float sortButtonWidth = 12.25f;
-            float buttonSpacing = 0.65f;
+            float buttonSpacing = 0.5f;
             float buttonY = 37f;
             float buttonHeight = 5.0f;
 
@@ -328,32 +328,34 @@ namespace SongBrowser.UI
             float buttonY = 37f;
             float buttonHeight = 5.0f;
 
-            List<Tuple<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>> filterButtonSetup = new List<Tuple<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>>()
-                {
-                    Tuple.Create<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>(SongFilterMode.Favorites, OnFavoriteFilterButtonClickEvent, Base64Sprites.StarFullIcon),
-                    Tuple.Create<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>(SongFilterMode.Playlist, OnPlaylistButtonClickEvent, Base64Sprites.PlaylistIcon),
-                    Tuple.Create<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>(SongFilterMode.Search, OnSearchButtonClickEvent, Base64Sprites.SearchIcon),
-                };
+            string[] filterButtonNames = new string[]
+            {
+                    "Favorites", "Playlist", "Search", "Ranked", "Unranked"
+            };
+
+            SongFilterMode[] filterModes = new SongFilterMode[]
+            {
+                    SongFilterMode.Favorites, SongFilterMode.Playlist, SongFilterMode.Search, SongFilterMode.Ranked, SongFilterMode.Unranked
+            };
 
             _filterButtonGroup = new List<SongFilterButton>();
-            for (int i = 0; i < filterButtonSetup.Count; i++)
+            for (int i = 0; i < filterButtonNames.Length; i++)
             {
-                Tuple<SongFilterMode, UnityEngine.Events.UnityAction, Sprite> t = filterButtonSetup[i];
                 float curButtonX = filterButtonX + (filterButtonWidth * i) + (buttonSpacing * i);
                 SongFilterButton filterButton = new SongFilterButton();
-                filterButton.FilterMode = t.Item1;
+                filterButton.FilterMode = filterModes[i];
                 filterButton.Button = _beatUi.LevelPackLevelsViewController.CreateUIButton("ApplyButton",
                     new Vector2(curButtonX, buttonY), new Vector2(filterButtonWidth, buttonHeight),
-                    t.Item2,
-                    t.Item1.ToString());
+                    () =>
+                    {
+                        OnFilterButtonClickEvent(filterButton.FilterMode);
+                        RefreshOuterUIState(UIState.Main);
+                    },
+                    filterButtonNames[i]);
                 filterButton.Button.SetButtonTextSize(filterButtonFontSize);
                 filterButton.Button.GetComponentsInChildren<HorizontalLayoutGroup>().First(btn => btn.name == "Content").padding = new RectOffset(4, 4, 2, 2);
                 filterButton.Button.ToggleWordWrapping(false);
-                filterButton.Button.onClick.AddListener(() =>
-                {
-                    RefreshOuterUIState(UIState.Main);
-                });
-                filterButton.Button.name = "Filter" + t.Item1.ToString() + "Button";
+                filterButton.Button.name = "Filter" + filterButtonNames[i] + "Button";
 
                 _filterButtonGroup.Add(filterButton);
             }
@@ -698,7 +700,40 @@ namespace SongBrowser.UI
             RefreshSongUI();
 
             // update the display
-            _sortByDisplay.SetButtonText(_model.Settings.sortMode.ToString());
+            //_sortByDisplay.SetButtonText(_model.Settings.sortMode.ToString());
+        }
+
+        /// <summary>
+        /// Handle filter button logic.  Some filters have sub menus that need special logic.
+        /// </summary>
+        /// <param name="mode"></param>
+        private void OnFilterButtonClickEvent(SongFilterMode mode)
+        {
+            switch (mode)
+            {
+                case SongFilterMode.Favorites:
+                    OnFavoriteFilterButtonClickEvent();
+                    break;
+                case SongFilterMode.Playlist:
+                    OnPlaylistButtonClickEvent();
+                    break;
+                case SongFilterMode.Search:
+                    OnSearchButtonClickEvent();
+                    break;
+                default:
+                    if (_model.Settings.filterMode == mode)
+                    {
+                        CancelFilter();
+                    }
+                    else
+                    {
+                        _model.Settings.filterMode = mode;
+                    }
+                    _model.Settings.Save();
+                    ProcessSongList();
+                    RefreshSongUI();
+                    break;
+            }
         }
 
         /// <summary>