SongBrowserApplication.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using SongBrowser.DataAccess;
  2. using SongBrowser.UI;
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using UnityEngine;
  8. using UnityEngine.UI;
  9. using Logger = SongBrowser.Logging.Logger;
  10. namespace SongBrowser
  11. {
  12. public class SongBrowserApplication : MonoBehaviour
  13. {
  14. public static SongBrowserApplication Instance;
  15. // Song Browser UI Elements
  16. private SongBrowserUI _songBrowserUI;
  17. private SongBrowserModel _songBrowserModel;
  18. public static SongBrowser.UI.ProgressBar MainProgressBar;
  19. public SongBrowserModel Model
  20. {
  21. get
  22. {
  23. return _songBrowserModel;
  24. }
  25. }
  26. /// <summary>
  27. /// Load the main song browser app.
  28. /// </summary>
  29. internal static void OnLoad()
  30. {
  31. if (Instance != null)
  32. {
  33. return;
  34. }
  35. new GameObject("Beat Saber SongBrowser Plugin").AddComponent<SongBrowserApplication>();
  36. SongBrowserApplication.MainProgressBar = SongBrowser.UI.ProgressBar.Create();
  37. Console.WriteLine("SongBrowser Plugin Loaded()");
  38. }
  39. /// <summary>
  40. /// It has awaken!
  41. /// </summary>
  42. private void Awake()
  43. {
  44. Logger.Trace("Awake-SongBrowserApplication()");
  45. Instance = this;
  46. // Init Model, load settings
  47. _songBrowserModel = new SongBrowserModel();
  48. _songBrowserModel.Init();
  49. // Init browser UI
  50. _songBrowserUI = gameObject.AddComponent<SongBrowserUI>();
  51. _songBrowserUI.Model = _songBrowserModel;
  52. }
  53. /// <summary>
  54. /// Acquire any UI elements from Beat saber that we need. Wait for the song list to be loaded.
  55. /// </summary>
  56. public void Start()
  57. {
  58. Logger.Trace("Start-SongBrowserApplication()");
  59. InstallHandlers();
  60. SongDataCore.Plugin.Songs.OnDataFinishedProcessing += OnScoreSaberDataDownloaded;
  61. if (SongCore.Loader.AreSongsLoaded)
  62. {
  63. OnSongLoaderLoadedSongs(null, SongCore.Loader.CustomLevels);
  64. }
  65. else
  66. {
  67. SongCore.Loader.SongsLoadedEvent += OnSongLoaderLoadedSongs;
  68. }
  69. // Useful to dump game objects.
  70. /*foreach (RectTransform rect in Resources.FindObjectsOfTypeAll<RectTransform>())
  71. {
  72. Logger.Debug("RectTransform: {0}", rect.name);
  73. }*/
  74. /*foreach (Sprite sprite in Resources.FindObjectsOfTypeAll<Sprite>())
  75. {
  76. Logger.Debug("Adding Icon: {0}", sprite.name);
  77. }*/
  78. }
  79. /// <summary>
  80. /// Only gets called once during boot of BeatSaber.
  81. /// </summary>
  82. /// <param name="loader"></param>
  83. /// <param name="levels"></param>
  84. private void OnSongLoaderLoadedSongs(SongCore.Loader loader, Dictionary<string, CustomPreviewBeatmapLevel> levels)
  85. {
  86. Logger.Trace("OnSongLoaderLoadedSongs-SongBrowserApplication()");
  87. try
  88. {
  89. _songBrowserUI.UpdateLevelDataModel();
  90. _songBrowserUI.RefreshSongList();
  91. }
  92. catch (Exception e)
  93. {
  94. Logger.Exception("Exception during OnSongLoaderLoadedSongs: ", e);
  95. }
  96. }
  97. /// <summary>
  98. /// Inform browser score saber data is available.
  99. /// </summary>
  100. /// <param name="loader"></param>
  101. /// <param name="levels"></param>
  102. private void OnScoreSaberDataDownloaded()
  103. {
  104. Logger.Trace("OnScoreSaberDataDownloaded");
  105. try
  106. {
  107. StartCoroutine(_songBrowserUI.AsyncWaitForSongUIUpdate());
  108. }
  109. catch (Exception e)
  110. {
  111. Logger.Exception("Exception during OnScoreSaberDataDownloaded: ", e);
  112. }
  113. }
  114. /// <summary>
  115. /// Install Our Handlers so we can react to ingame events.
  116. /// </summary>
  117. private void InstallHandlers()
  118. {
  119. // Append our own event to appropriate events so we can refresh the song list before the user sees it.
  120. MainFlowCoordinator mainFlow = Resources.FindObjectsOfTypeAll<MainFlowCoordinator>().First();
  121. Button soloFreePlayButton = Resources.FindObjectsOfTypeAll<Button>().First(x => x.name == "SoloFreePlayButton");
  122. Button partyFreePlayButton = Resources.FindObjectsOfTypeAll<Button>().First(x => x.name == "PartyFreePlayButton");
  123. Button campaignButton = Resources.FindObjectsOfTypeAll<Button>().First(x => x.name == "CampaignButton");
  124. soloFreePlayButton.onClick.AddListener(HandleSoloModeSelection);
  125. partyFreePlayButton.onClick.AddListener(HandlePartyModeSelection);
  126. campaignButton.onClick.AddListener(HandleCampaignModeSelection);
  127. }
  128. /// <summary>
  129. /// Handle Solo Mode
  130. /// </summary>
  131. /// <param name="arg1"></param>
  132. /// <param name="arg2"></param>
  133. private void HandleSoloModeSelection()
  134. {
  135. Logger.Trace("HandleSoloModeSelection()");
  136. HandleModeSelection(MainMenuViewController.MenuButton.SoloFreePlay);
  137. _songBrowserUI.Show();
  138. }
  139. /// <summary>
  140. /// Handle Party Mode
  141. /// </summary>
  142. /// <param name="arg1"></param>
  143. /// <param name="arg2"></param>
  144. private void HandlePartyModeSelection()
  145. {
  146. Logger.Trace("HandlePartyModeSelection()");
  147. HandleModeSelection(MainMenuViewController.MenuButton.Party);
  148. _songBrowserUI.Show();
  149. }
  150. /// <summary>
  151. /// Handle Party Mode
  152. /// </summary>
  153. /// <param name="arg1"></param>
  154. /// <param name="arg2"></param>
  155. private void HandleCampaignModeSelection()
  156. {
  157. Logger.Trace("HandleCampaignModeSelection()");
  158. HandleModeSelection(MainMenuViewController.MenuButton.SoloCampaign);
  159. _songBrowserUI.Hide();
  160. }
  161. /// <summary>
  162. /// Handle Mode
  163. /// </summary>
  164. /// <param name="arg1"></param>
  165. /// <param name="arg2"></param>
  166. private void HandleModeSelection(MainMenuViewController.MenuButton mode)
  167. {
  168. Logger.Trace("HandleModeSelection()");
  169. _songBrowserUI.CreateUI(mode);
  170. SongBrowserApplication.MainProgressBar.ShowMessage("");
  171. StartCoroutine(UpdateBrowserUI());
  172. }
  173. /// <summary>
  174. /// Wait until the end of the frame to finish updating everything.
  175. /// </summary>
  176. /// <returns></returns>
  177. public IEnumerator UpdateBrowserUI()
  178. {
  179. yield return new WaitForEndOfFrame();
  180. _songBrowserUI.UpdateLevelDataModel();
  181. _songBrowserUI.UpdateLevelPackSelection();
  182. _songBrowserUI.RefreshSongList();
  183. }
  184. }
  185. }