瀏覽代碼

Fix playlists (#69)

* Fix playlists.
When manually creating TableView's we have to delay Awake() until we set
up the object manually.
Replace use of Image (_coverImage) with RawImage.
Fix Abort Button template.

* Version bump to 4.1.0

* Avoid potential null ptr exceptions in Playlist view if playlist cover
image cannot be loaded.

* Reduce log spam if you have playlists missing songs.
Halsafar 5 年之前
父節點
當前提交
c1a84d1df9

+ 1 - 1
SongBrowserPlugin/DataAccess/SongBrowserModel.cs

@@ -775,7 +775,7 @@ namespace SongBrowser
                 }
                 }
                 else
                 else
                 {
                 {
-                    Logger.Warning("Could not find song in playlist: {0}", ps.songName);
+                    Logger.Debug("Could not find song in playlist: {0}", ps.songName);
                 }
                 }
             }
             }
 
 

+ 1 - 1
SongBrowserPlugin/Plugin.cs

@@ -14,7 +14,7 @@ namespace SongBrowser
 {
 {
     public class Plugin : IPlugin
     public class Plugin : IPlugin
     {
     {
-        public const string VERSION_NUMBER = "4.0.0";
+        public const string VERSION_NUMBER = "4.1.0";
 
 
         public string Name
         public string Name
         {
         {

+ 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("4.0.0")]
-[assembly: AssemblyFileVersion("4.0.0")]
+[assembly: AssemblyVersion("4.1.0")]
+[assembly: AssemblyFileVersion("4.1.0")]

+ 1 - 1
SongBrowserPlugin/UI/Browser/SongBrowserUI.cs

@@ -318,7 +318,7 @@ namespace SongBrowser.UI
                 List<Tuple<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>> filterButtonSetup = new List<Tuple<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>>()
                 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.Favorites, OnFavoriteFilterButtonClickEvent, Base64Sprites.StarFullIcon),
-                    //Tuple.Create<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>(SongFilterMode.Playlist, OnPlaylistButtonClickEvent, Base64Sprites.PlaylistIcon),
+                    Tuple.Create<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>(SongFilterMode.Playlist, OnPlaylistButtonClickEvent, Base64Sprites.PlaylistIcon),
                     Tuple.Create<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>(SongFilterMode.Search, OnSearchButtonClickEvent, Base64Sprites.SearchIcon),
                     Tuple.Create<SongFilterMode, UnityEngine.Events.UnityAction, Sprite>(SongFilterMode.Search, OnSearchButtonClickEvent, Base64Sprites.SearchIcon),
                 };
                 };
 
 

+ 2 - 1
SongBrowserPlugin/UI/DownloadQueue/DownloadQueueTableCell.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Reflection;
 using System.Reflection;
 using TMPro;
 using TMPro;
 using UnityEngine;
 using UnityEngine;
+using Logger = SongBrowser.Logging.Logger;
 
 
 // From: https://github.com/andruzzzhka/BeatSaverDownloader
 // From: https://github.com/andruzzzhka/BeatSaverDownloader
 namespace SongBrowser.UI.DownloadQueue
 namespace SongBrowser.UI.DownloadQueue
@@ -41,7 +42,7 @@ namespace SongBrowser.UI.DownloadQueue
 
 
             _songNameText.text = string.Format("{0}\n<size=80%>{1}</size>", song.songName, song.songSubName);
             _songNameText.text = string.Format("{0}\n<size=80%>{1}</size>", song.songName, song.songSubName);
             _authorText.text = song.authorName;
             _authorText.text = song.authorName;
-            StartCoroutine(LoadScripts.LoadSpriteCoroutine(song.coverUrl, (cover) => { _coverRawImage.texture = cover.texture; }));
+            StartCoroutine(LoadScripts.LoadSpriteCoroutine(song.coverUrl, (cover) => { if (cover != null) _coverRawImage.texture = cover.texture ; }));
 
 
             _bgImage.enabled = true;
             _bgImage.enabled = true;
             _bgImage.sprite = Sprite.Create((new Texture2D(1, 1)), new Rect(0, 0, 1, 1), Vector2.one / 2f);
             _bgImage.sprite = Sprite.Create((new Texture2D(1, 1)), new Rect(0, 0, 1, 1), Vector2.one / 2f);

+ 5 - 6
SongBrowserPlugin/UI/DownloadQueue/DownloadQueueViewController.cs

@@ -64,29 +64,28 @@ namespace SongBrowser.UI.DownloadQueue
                     _queuedSongsTableView.PageScrollDown();
                     _queuedSongsTableView.PageScrollDown();
                 });
                 });
 
 
-                _queuedSongsTableView = new GameObject().AddComponent<TableView>();
+                var gameObject = new GameObject();
+                gameObject.SetActive(false);
+                _queuedSongsTableView = gameObject.AddComponent<TableView>();
                 _queuedSongsTableView.transform.SetParent(rectTransform, false);
                 _queuedSongsTableView.transform.SetParent(rectTransform, false);
-
                 _queuedSongsTableView.SetPrivateField("_isInitialized", false);
                 _queuedSongsTableView.SetPrivateField("_isInitialized", false);
                 _queuedSongsTableView.SetPrivateField("_preallocatedCells", new TableView.CellsGroup[0]);
                 _queuedSongsTableView.SetPrivateField("_preallocatedCells", new TableView.CellsGroup[0]);
                 _queuedSongsTableView.Init();
                 _queuedSongsTableView.Init();
+                gameObject.SetActive(true);
 
 
                 RectMask2D viewportMask = Instantiate(Resources.FindObjectsOfTypeAll<RectMask2D>().First(), _queuedSongsTableView.transform, false);
                 RectMask2D viewportMask = Instantiate(Resources.FindObjectsOfTypeAll<RectMask2D>().First(), _queuedSongsTableView.transform, false);
                 viewportMask.transform.DetachChildren();
                 viewportMask.transform.DetachChildren();
                 _queuedSongsTableView.GetComponentsInChildren<RectTransform>().First(x => x.name == "Content").transform.SetParent(viewportMask.rectTransform, false);
                 _queuedSongsTableView.GetComponentsInChildren<RectTransform>().First(x => x.name == "Content").transform.SetParent(viewportMask.rectTransform, false);
-
                 (_queuedSongsTableView.transform as RectTransform).anchorMin = new Vector2(0.3f, 0.5f);
                 (_queuedSongsTableView.transform as RectTransform).anchorMin = new Vector2(0.3f, 0.5f);
                 (_queuedSongsTableView.transform as RectTransform).anchorMax = new Vector2(0.7f, 0.5f);
                 (_queuedSongsTableView.transform as RectTransform).anchorMax = new Vector2(0.7f, 0.5f);
                 (_queuedSongsTableView.transform as RectTransform).sizeDelta = new Vector2(0f, 60f);
                 (_queuedSongsTableView.transform as RectTransform).sizeDelta = new Vector2(0f, 60f);
                 (_queuedSongsTableView.transform as RectTransform).anchoredPosition = new Vector3(0f, -3f);
                 (_queuedSongsTableView.transform as RectTransform).anchoredPosition = new Vector3(0f, -3f);
-
                 ReflectionUtil.SetPrivateField(_queuedSongsTableView, "_pageUpButton", _pageUpButton);
                 ReflectionUtil.SetPrivateField(_queuedSongsTableView, "_pageUpButton", _pageUpButton);
                 ReflectionUtil.SetPrivateField(_queuedSongsTableView, "_pageDownButton", _pageDownButton);
                 ReflectionUtil.SetPrivateField(_queuedSongsTableView, "_pageDownButton", _pageDownButton);
-
                 _queuedSongsTableView.selectionType = TableViewSelectionType.None;
                 _queuedSongsTableView.selectionType = TableViewSelectionType.None;
                 _queuedSongsTableView.dataSource = this;
                 _queuedSongsTableView.dataSource = this;
 
 
-                _abortButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(36f, -30f), new Vector2(20f, 10f), AbortDownloads, "Abort All");
+                _abortButton = BeatSaberUI.CreateUIButton(rectTransform, "PlayButton", new Vector2(36f, -30f), new Vector2(20f, 10f), AbortDownloads, "Abort All");
                 _abortButton.ToggleWordWrapping(false);
                 _abortButton.ToggleWordWrapping(false);
             }
             }
         }
         }

+ 10 - 3
SongBrowserPlugin/UI/Playlists/PlaylistDetailViewController.cs

@@ -33,7 +33,7 @@ namespace SongBrowser.UI
         private StandardLevelDetailView _levelDetails;
         private StandardLevelDetailView _levelDetails;
 
 
         public bool addDownloadButton = true;
         public bool addDownloadButton = true;
-        private Image coverImage;
+        private RawImage coverImage;
 
 
         protected override void DidActivate(bool firstActivation, ActivationType type)
         protected override void DidActivate(bool firstActivation, ActivationType type)
         {
         {
@@ -96,7 +96,7 @@ namespace SongBrowser.UI
                     Destroy(_levelDetails.practiceButton.gameObject);
                     Destroy(_levelDetails.practiceButton.gameObject);
                 }
                 }
 
 
-                coverImage = _levelDetails.GetPrivateField<Image>("_coverImage");
+                coverImage = _levelDetails.GetPrivateField<RawImage>("_coverImage");
             }
             }
         }
         }
 
 
@@ -127,7 +127,14 @@ namespace SongBrowser.UI
 
 
             authorText.text = newPlaylist.playlistAuthor;
             authorText.text = newPlaylist.playlistAuthor;
 
 
-            coverImage.sprite = _currentPlaylist.icon;
+            if (_currentPlaylist.icon != null)
+            {
+                coverImage.texture = _currentPlaylist.icon.texture;
+            }
+            else
+            {
+                coverImage.texture = null;
+            }
 
 
             if (newPlaylist.songs.Count > 0)
             if (newPlaylist.songs.Count > 0)
             {
             {

+ 9 - 4
SongBrowserPlugin/UI/Playlists/PlaylistSelectionListViewController.cs

@@ -10,6 +10,7 @@ using TMPro;
 using UnityEngine;
 using UnityEngine;
 using UnityEngine.UI;
 using UnityEngine.UI;
 using VRUI;
 using VRUI;
+using Logger = SongBrowser.Logging.Logger;
 
 
 namespace SongBrowser.UI
 namespace SongBrowser.UI
 {
 {
@@ -69,13 +70,15 @@ namespace SongBrowser.UI
                 container.sizeDelta = new Vector2(0f, 0f);
                 container.sizeDelta = new Vector2(0f, 0f);
                 container.anchoredPosition = new Vector2(0f, 0f);
                 container.anchoredPosition = new Vector2(0f, 0f);
 
 
-                _songsTableView = new GameObject("CustomTableView", typeof(RectTransform)).AddComponent<TableView>();
+                var gameObject = new GameObject("CustomTableView", typeof(RectTransform));
+                gameObject.SetActive(false);
+                _songsTableView = gameObject.AddComponent<TableView>();
                 _songsTableView.gameObject.AddComponent<RectMask2D>();
                 _songsTableView.gameObject.AddComponent<RectMask2D>();
                 _songsTableView.transform.SetParent(container, false);
                 _songsTableView.transform.SetParent(container, false);
-
                 _songsTableView.SetPrivateField("_isInitialized", false);
                 _songsTableView.SetPrivateField("_isInitialized", false);
                 _songsTableView.SetPrivateField("_preallocatedCells", new TableView.CellsGroup[0]);
                 _songsTableView.SetPrivateField("_preallocatedCells", new TableView.CellsGroup[0]);
                 _songsTableView.Init();
                 _songsTableView.Init();
+                gameObject.SetActive(true);
 
 
                 (_songsTableView.transform as RectTransform).anchorMin = new Vector2(0f, 0f);
                 (_songsTableView.transform as RectTransform).anchorMin = new Vector2(0f, 0f);
                 (_songsTableView.transform as RectTransform).anchorMax = new Vector2(1f, 1f);
                 (_songsTableView.transform as RectTransform).anchorMax = new Vector2(1f, 1f);
@@ -144,8 +147,10 @@ namespace SongBrowser.UI
             songNameText.text = playlistList[row].playlistTitle;
             songNameText.text = playlistList[row].playlistTitle;
             songNameText.overflowMode = TextOverflowModes.Overflow;
             songNameText.overflowMode = TextOverflowModes.Overflow;
             _tableCell.GetPrivateField<TextMeshProUGUI>("_authorText").text = playlistList[row].playlistAuthor;
             _tableCell.GetPrivateField<TextMeshProUGUI>("_authorText").text = playlistList[row].playlistAuthor;
-            _tableCell.GetPrivateField<UnityEngine.UI.Image>("_coverImage").sprite = playlistList[row].icon;
-
+            if (playlistList[row].icon != null)
+            {
+                _tableCell.GetPrivateField<RawImage>("_coverRawImage").texture = playlistList[row].icon.texture;
+            }
             _tableCell.SetPrivateField("_beatmapCharacteristicAlphas", new float[0]);
             _tableCell.SetPrivateField("_beatmapCharacteristicAlphas", new float[0]);
             _tableCell.SetPrivateField("_beatmapCharacteristicImages", new UnityEngine.UI.Image[0]);
             _tableCell.SetPrivateField("_beatmapCharacteristicImages", new UnityEngine.UI.Image[0]);
             _tableCell.SetPrivateField("_bought", true);
             _tableCell.SetPrivateField("_bought", true);