瀏覽代碼

Fix UI from completely breaking in some cases.
After visiting the playlist selector the UI could completely break down.
Cleaned up the Playlist selector.
Version bump.

Stephen Damm 6 年之前
父節點
當前提交
93d66b442e

+ 1 - 1
SongBrowserPlugin/Plugin.cs

@@ -13,7 +13,7 @@ namespace SongBrowserPlugin
 
 
 		public string Version
 		public string Version
 		{
 		{
-			get { return "v2.2.2"; }
+			get { return "v2.2.3"; }
 		}
 		}
 		
 		
 		public void OnApplicationStart()
 		public void OnApplicationStart()

+ 0 - 8
SongBrowserPlugin/SongBrowserApplication.cs

@@ -157,14 +157,6 @@ namespace SongBrowserPlugin
         /// </summary>
         /// </summary>
         private void LateUpdate()
         private void LateUpdate()
         {
         {
-            // playlists
-            if (Input.GetKeyDown(KeyCode.P))
-            {
-                MainMenuViewController mainView = Resources.FindObjectsOfTypeAll<MainMenuViewController>().First();
-                PlaylistFlowCoordinator view = UIBuilder.CreateFlowCoordinator<PlaylistFlowCoordinator>("PlaylistFlowCoordinator");
-                view.Present(mainView);
-            }
-
             // z,x,c,v can be used to get into a song, b will hit continue button after song ends
             // z,x,c,v can be used to get into a song, b will hit continue button after song ends
             if (Input.GetKeyDown(KeyCode.Z))
             if (Input.GetKeyDown(KeyCode.Z))
             {
             {

+ 62 - 25
SongBrowserPlugin/UI/Playlists/PlaylistFlowCoordinator.cs

@@ -1,11 +1,7 @@
 using SongBrowserPlugin.DataAccess;
 using SongBrowserPlugin.DataAccess;
 using System;
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Reflection;
 using UnityEngine;
 using UnityEngine;
-using UnityEngine.UI;
 using VRUI;
 using VRUI;
 
 
 namespace SongBrowserPlugin.UI
 namespace SongBrowserPlugin.UI
@@ -15,14 +11,19 @@ namespace SongBrowserPlugin.UI
         public const String Name = "PlaylistFlowCoordinator";
         public const String Name = "PlaylistFlowCoordinator";
         private Logger _log = new Logger(Name);
         private Logger _log = new Logger(Name);
 
 
-        private PlaylistSelectionMasterViewController _playlistNavigationController;
-        private PlaylistSelectionListViewController _playlistViewController;
+        private PlaylistSelectionNavigationController _playlistNavigationController;
+        private PlaylistSelectionListViewController _playlistListViewController;
         private PlaylistDetailViewController _playlistDetailViewController;
         private PlaylistDetailViewController _playlistDetailViewController;
 
 
         private bool _initialized;
         private bool _initialized;
 
 
         public Action<Playlist> didSelectPlaylist;
         public Action<Playlist> didSelectPlaylist;
 
 
+        public virtual void OnDestroy()
+        {
+            _log.Trace("OnDestroy()");
+        }
+
         /// <summary>
         /// <summary>
         /// 
         /// 
         /// </summary>
         /// </summary>
@@ -31,30 +32,37 @@ namespace SongBrowserPlugin.UI
         /// <param name="gameplayMode"></param>
         /// <param name="gameplayMode"></param>
         public virtual void Present(VRUIViewController parentViewController)
         public virtual void Present(VRUIViewController parentViewController)
         {
         {
+            _log.Trace("Presenting Playlist Selector! - initialized: {0}", this._initialized);
             if (!this._initialized)
             if (!this._initialized)
             {
             {
-                _playlistNavigationController = UIBuilder.CreateViewController<PlaylistSelectionMasterViewController>("PlaylistSelectionMasterViewController");
-                _playlistViewController = UIBuilder.CreateViewController<PlaylistSelectionListViewController>("PlaylistSelectionListViewController");
+                _playlistNavigationController = UIBuilder.CreateViewController<PlaylistSelectionNavigationController>("PlaylistSelectionMasterViewController");
+                _playlistListViewController = UIBuilder.CreateViewController<PlaylistSelectionListViewController>("PlaylistSelectionListViewController");
                 _playlistDetailViewController = UIBuilder.CreateViewController<PlaylistDetailViewController>("PlaylistDetailViewController");
                 _playlistDetailViewController = UIBuilder.CreateViewController<PlaylistDetailViewController>("PlaylistDetailViewController");
 
 
-                this._playlistViewController.didSelectPlaylistEvent += HandlePlaylistListDidSelectPlaylist;
+                // Set parent view controllers appropriately.
+                _playlistNavigationController.GetType().GetField("_parentViewController", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).SetValue(_playlistNavigationController, parentViewController);
+                _playlistListViewController.GetType().GetField("_parentViewController", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).SetValue(_playlistListViewController, _playlistNavigationController);
+                _playlistDetailViewController.GetType().GetField("_parentViewController", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).SetValue(_playlistDetailViewController, _playlistListViewController);
+
+                this._playlistListViewController.didSelectPlaylistRowEvent += HandlePlaylistListDidSelectPlaylist;
                 this._playlistDetailViewController.didPressPlayPlaylist += HandleDidPlayPlaylist;
                 this._playlistDetailViewController.didPressPlayPlaylist += HandleDidPlayPlaylist;
+                this._playlistNavigationController.didDismissEvent += HandleDidFinish;
 
 
-                this._initialized = true;
-            }
+                _playlistListViewController.rectTransform.anchorMin = new Vector2(0.3f, 0f);
+                _playlistListViewController.rectTransform.anchorMax = new Vector2(0.7f, 1f);
 
 
-            _playlistViewController.rectTransform.anchorMin = new Vector2(0.3f, 0f);
-            _playlistViewController.rectTransform.anchorMax = new Vector2(0.7f, 1f);
+                _playlistDetailViewController.rectTransform.anchorMin = new Vector2(0.3f, 0f);
+                _playlistDetailViewController.rectTransform.anchorMax = new Vector2(0.7f, 1f);
 
 
-            _playlistDetailViewController.rectTransform.anchorMin = new Vector2(0.3f, 0f);
-            _playlistDetailViewController.rectTransform.anchorMax = new Vector2(0.7f, 1f);
+                parentViewController.PresentModalViewController(this._playlistNavigationController, null, parentViewController.isRebuildingHierarchy);
+                this._playlistNavigationController.PushViewController(this._playlistListViewController, parentViewController.isRebuildingHierarchy);
 
 
-            parentViewController.PresentModalViewController(this._playlistNavigationController, null, parentViewController.isRebuildingHierarchy);
-            this._playlistNavigationController.PushViewController(this._playlistViewController, parentViewController.isRebuildingHierarchy);            
+                this._initialized = true;
+            }                        
         }
         }
 
 
         /// <summary>
         /// <summary>
-        /// 
+        /// Update the playlist detail view when a row is selected.
         /// </summary>
         /// </summary>
         /// <param name="songListViewController"></param>
         /// <param name="songListViewController"></param>
         public virtual void HandlePlaylistListDidSelectPlaylist(PlaylistSelectionListViewController playlistListViewController)
         public virtual void HandlePlaylistListDidSelectPlaylist(PlaylistSelectionListViewController playlistListViewController)
@@ -71,23 +79,52 @@ namespace SongBrowserPlugin.UI
             }
             }
         }
         }
 
 
+        /// <summary>
+        /// Playlist was selected, dismiss view and inform song browser.
+        /// </summary>
+        /// <param name="p"></param>
         public void HandleDidPlayPlaylist(Playlist p)
         public void HandleDidPlayPlaylist(Playlist p)
         {
         {
-            this._playlistNavigationController.DismissModalViewController(delegate ()
+            try
+            {
+                _log.Debug("Playlist selector selected playlist...");
+                this._playlistNavigationController.DismissModalViewController(delegate ()                
+                {
+                    didSelectPlaylist.Invoke(p);
+                }, true);
+            }
+            catch (Exception e)
             {
             {
-                didSelectPlaylist.Invoke(p);
-            });
+                _log.Exception("", e);
+            }
         }
         }
 
 
+        /// <summary>
+        /// Playlist was dismissed, inform song browser (pass in null).
+        /// </summary>
+        public void HandleDidFinish()
+        {
+            try
+            {
+                _log.Debug("Playlist selector dismissed...");
+                this._playlistNavigationController.DismissModalViewController(delegate ()
+                {
+                    didSelectPlaylist.Invoke(null);
+                }, true);
+            }
+            catch (Exception e)
+            {
+                _log.Exception("", e);
+            }
+        }
+        
         public void LateUpdate()
         public void LateUpdate()
         {
         {
             // accept
             // accept
             if (Input.GetKeyDown(KeyCode.Return))
             if (Input.GetKeyDown(KeyCode.Return))
             {
             {
-                HandleDidPlayPlaylist(this._playlistViewController.SelectedPlaylist);
+                HandleDidPlayPlaylist(this._playlistListViewController.SelectedPlaylist);
             }
             }
         }
         }
     }
     }
-
-
 }
 }

+ 31 - 12
SongBrowserPlugin/UI/Playlists/PlaylistSelectionListViewController.cs

@@ -1,9 +1,6 @@
 using SongBrowserPlugin.DataAccess;
 using SongBrowserPlugin.DataAccess;
 using System;
 using System;
-using System.Collections.Generic;
 using System.IO;
 using System.IO;
-using System.Linq;
-using System.Text;
 using UnityEngine;
 using UnityEngine;
 using VRUI;
 using VRUI;
 
 
@@ -15,14 +12,19 @@ namespace SongBrowserPlugin.UI
 
 
         private Logger _log = new Logger(Name);
         private Logger _log = new Logger(Name);
 
 
-        private PlaylistTableView _tableView;
+        private PlaylistTableView _playlistTableView;
 
 
-        PlaylistsReader _playlistsReader;        
+        private PlaylistsReader _playlistsReader;        
 
 
-        public Action<PlaylistSelectionListViewController> didSelectPlaylistEvent;
+        public Action<PlaylistSelectionListViewController> didSelectPlaylistRowEvent;
 
 
         public Playlist SelectedPlaylist { get; private set; }
         public Playlist SelectedPlaylist { get; private set; }
 
 
+        /// <summary>
+        /// Instantiate the playlist table view.
+        /// </summary>
+        /// <param name="firstActivation"></param>
+        /// <param name="activationType"></param>
         protected override void DidActivate(bool firstActivation, VRUIViewController.ActivationType activationType)
         protected override void DidActivate(bool firstActivation, VRUIViewController.ActivationType activationType)
         {
         {
             _log.Debug("DidActivate()");
             _log.Debug("DidActivate()");
@@ -37,21 +39,38 @@ namespace SongBrowserPlugin.UI
 
 
             base.DidActivate(firstActivation, activationType);
             base.DidActivate(firstActivation, activationType);
 
 
-            if (_tableView == null)
+            if (_playlistTableView == null)
             {
             {
-                _tableView = new GameObject(name).AddComponent<PlaylistTableView>();
-                _tableView.Init(rectTransform, _playlistsReader);
+                _playlistTableView = new GameObject(name).AddComponent<PlaylistTableView>();
+                _playlistTableView.Init(rectTransform, _playlistsReader);
 
 
-                _tableView.didSelectPlaylistEvent += HandlePlaylistListTableViewDidSelectRow;
+                _playlistTableView.didSelectPlaylistEvent += HandlePlaylistListTableViewDidSelectRow;
             }
             }
         }
         }
 
 
+        /// <summary>
+        /// Deactivate - Destroy!
+        /// </summary>
+        /// <param name="deactivationType"></param>
+        protected override void DidDeactivate(VRUIViewController.DeactivationType deactivationType)
+        {
+            _log.Debug("DidDeactivate()");
+            this._playlistTableView.gameObject.SetActive(false);
+            Destroy(this._playlistTableView);
+            base.DidDeactivate(deactivationType);
+        }
+
+        /// <summary>
+        /// Did select a playlist row.
+        /// </summary>
+        /// <param name="tableView"></param>
+        /// <param name="row"></param>
         public virtual void HandlePlaylistListTableViewDidSelectRow(PlaylistTableView tableView, int row)
         public virtual void HandlePlaylistListTableViewDidSelectRow(PlaylistTableView tableView, int row)
         {
         {
             this.SelectedPlaylist = _playlistsReader.Playlists[row];
             this.SelectedPlaylist = _playlistsReader.Playlists[row];
-            if (this.didSelectPlaylistEvent != null)
+            if (this.didSelectPlaylistRowEvent != null)
             {
             {
-                this.didSelectPlaylistEvent(this);
+                this.didSelectPlaylistRowEvent(this);
             }
             }
         }
         }
     }
     }

+ 17 - 12
SongBrowserPlugin/UI/Playlists/PlaylistSelectionNavigationController.cs

@@ -1,19 +1,18 @@
-using HMUI;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using TMPro;
+using System;
 using UnityEngine;
 using UnityEngine;
 using UnityEngine.UI;
 using UnityEngine.UI;
 using VRUI;
 using VRUI;
 
 
 namespace SongBrowserPlugin.UI
 namespace SongBrowserPlugin.UI
 {
 {
-    class PlaylistSelectionMasterViewController : VRUINavigationController
+    class PlaylistSelectionNavigationController : VRUINavigationController
     {
     {
-        private Button _dismissButton;
         public const String Name = "PlaylistSelectionMasterViewController";
         public const String Name = "PlaylistSelectionMasterViewController";
+
+        public Action didDismissEvent;
+
+        private Button _dismissButton;        
+
         private Logger _log = new Logger(Name);
         private Logger _log = new Logger(Name);
 
 
         /// <summary>
         /// <summary>
@@ -32,8 +31,7 @@ namespace SongBrowserPlugin.UI
             if (activationType == VRUIViewController.ActivationType.AddedToHierarchy)
             if (activationType == VRUIViewController.ActivationType.AddedToHierarchy)
             {
             {
                 _log.Debug("Adding Dismiss Button");
                 _log.Debug("Adding Dismiss Button");
-                _dismissButton = Instantiate(Resources.FindObjectsOfTypeAll<Button>().First(x => (x.name == "BackArrowButton")), this.rectTransform, false);
-                _dismissButton.onClick.RemoveAllListeners();
+                _dismissButton = UIBuilder.CreateBackButton(this.rectTransform);
                 _dismissButton.onClick.AddListener(HandleDismissButton);               
                 _dismissButton.onClick.AddListener(HandleDismissButton);               
             }
             }
         }
         }
@@ -43,8 +41,15 @@ namespace SongBrowserPlugin.UI
         /// </summary>
         /// </summary>
         private void HandleDismissButton()
         private void HandleDismissButton()
         {
         {
-            _log.Debug("Dismissing!");
-            this.DismissModalViewController(null, false);
+            try
+            {
+                _log.Debug("Dismissing...");
+                didDismissEvent.Invoke();
+            }
+            catch (Exception e)
+            {
+                _log.Exception("HandleDismissButton Exception: ", e);
+            }
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 6 - 0
SongBrowserPlugin/UI/Playlists/PlaylistTableView.cs

@@ -40,6 +40,12 @@ namespace SongBrowserPlugin.UI
             
             
         }
         }
 
 
+        public virtual void OnDestroy()
+        {
+            _log.Trace("OnDestroy()");
+            Destroy(this._tableView);
+        }
+
         /// <summary>
         /// <summary>
         /// Setup the tableview.
         /// Setup the tableview.
         /// </summary>
         /// </summary>

+ 26 - 7
SongBrowserPlugin/UI/SongBrowserUI.cs

@@ -49,6 +49,7 @@ namespace SongBrowserPlugin.UI
         private Button _enterFolderButton;
         private Button _enterFolderButton;
         private Button _upFolderButton;
         private Button _upFolderButton;
         private SearchKeyboardViewController _searchViewController;
         private SearchKeyboardViewController _searchViewController;
+        private PlaylistFlowCoordinator _playListFlowCoordinator;
 
 
         // Cached items
         // Cached items
         private Sprite _addFavoriteSprite;
         private Sprite _addFavoriteSprite;
@@ -402,9 +403,12 @@ namespace SongBrowserPlugin.UI
 
 
             if (_model.Settings.filterMode != SongFilterMode.Playlist)
             if (_model.Settings.filterMode != SongFilterMode.Playlist)
             {
             {
-                PlaylistFlowCoordinator view = UIBuilder.CreateFlowCoordinator<PlaylistFlowCoordinator>("PlaylistFlowCoordinator");
-                view.didSelectPlaylist += HandleDidSelectPlaylist;
-                view.Present(_levelSelectionNavigationController);
+                if (_playListFlowCoordinator == null || !_playListFlowCoordinator.isActiveAndEnabled)
+                {
+                    _playListFlowCoordinator = UIBuilder.CreateFlowCoordinator<PlaylistFlowCoordinator>("PlaylistFlowCoordinator");
+                    _playListFlowCoordinator.didSelectPlaylist += HandleDidSelectPlaylist;
+                    _playListFlowCoordinator.Present(_levelSelectionNavigationController);
+                }                
             }
             }
             else
             else
             {
             {
@@ -609,10 +613,25 @@ namespace SongBrowserPlugin.UI
         /// <param name="p"></param>
         /// <param name="p"></param>
         private void HandleDidSelectPlaylist(Playlist p)
         private void HandleDidSelectPlaylist(Playlist p)
         {
         {
-            _log.Debug("Showing songs for playlist: {0}", p.playlistTitle);
-            _model.Settings.filterMode = SongFilterMode.Playlist;
-            _model.CurrentPlaylist = p;
-            _model.Settings.Save();
+            if (_playListFlowCoordinator != null)
+            {
+                _levelSelectionNavigationController.PopViewControllerImmediately();
+                _playListFlowCoordinator.gameObject.SetActive(false);
+                UnityEngine.Object.DestroyImmediate(_playListFlowCoordinator);
+            }
+
+            if (p != null)
+            {
+                _log.Debug("Showing songs for playlist: {0}", p.playlistTitle);
+                _model.Settings.filterMode = SongFilterMode.Playlist;
+                _model.CurrentPlaylist = p;
+                _model.Settings.Save();
+            }
+            else
+            {
+                _log.Debug("No playlist selected");
+            }
+
             this.UpdateSongList();
             this.UpdateSongList();
             this.RefreshSongList();
             this.RefreshSongList();
         }
         }

+ 4 - 1
SongBrowserPlugin/UI/UIBuilder.cs

@@ -190,7 +190,10 @@ namespace SongBrowserPlugin.UI
         public static Button CreateBackButton(RectTransform parent)
         public static Button CreateBackButton(RectTransform parent)
         {
         {
             Button dismissButton = CreateUIButton(parent, "BackArrowButton");
             Button dismissButton = CreateUIButton(parent, "BackArrowButton");
-            dismissButton.onClick.RemoveAllListeners();            
+            UnityEngine.Object.DestroyImmediate(dismissButton.GetComponent<GameEventOnUIButtonClick>());
+            dismissButton.onClick = new Button.ButtonClickedEvent();
+            dismissButton.name = "CustomUIButton";
+
             return dismissButton;
             return dismissButton;
         }
         }