using CustomUI.BeatSaber;
|
|
using System.Collections;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
using UnityEngine.UI;
|
|
|
|
namespace BSIPA_ModList.UI
|
|
{
|
|
internal class FloatingNotification : MonoBehaviour
|
|
{
|
|
private Canvas _canvas;
|
|
private TMP_Text _authorNameText;
|
|
private TMP_Text _pluginNameText;
|
|
private TMP_Text _headerText;
|
|
private Image _loadingBackg;
|
|
private Image _loadingBar;
|
|
|
|
private static readonly Vector3 Position = new Vector3(2.3f, 2.3f, 1.35f);
|
|
private static readonly Vector3 Rotation = new Vector3(0, 60, 0);
|
|
private static readonly Vector3 Scale = new Vector3(0.01f, 0.01f, 0.01f);
|
|
|
|
private static readonly Vector2 CanvasSize = new Vector2(100, 50);
|
|
|
|
private const string AuthorNameText = "BSIPA";
|
|
private const float AuthorNameFontSize = 7f;
|
|
private static readonly Vector2 AuthorNamePosition = new Vector2(10, 31);
|
|
|
|
private const string PluginNameText = "Mod Updater";
|
|
private const float PluginNameFontSize = 9f;
|
|
private static readonly Vector2 PluginNamePosition = new Vector2(10, 23);
|
|
|
|
private static readonly Vector2 HeaderPosition = new Vector2(10, 15);
|
|
private static readonly Vector2 HeaderSize = new Vector2(100, 20);
|
|
private const string HeaderText = "Checking for updates...";
|
|
private const float HeaderFontSize = 15f;
|
|
|
|
private static readonly Vector2 LoadingBarSize = new Vector2(100, 10);
|
|
private static readonly Color BackgroundColor = new Color(0, 0, 0, 0.2f);
|
|
|
|
private bool _showingMessage;
|
|
|
|
public static FloatingNotification Create()
|
|
{
|
|
return new GameObject("Mod List Floating Notification").AddComponent<FloatingNotification>();
|
|
}
|
|
|
|
public void ShowMessage(string message, float time)
|
|
{
|
|
StopAllCoroutines();
|
|
_showingMessage = true;
|
|
_headerText.text = message;
|
|
_headerText.alignment = TextAlignmentOptions.Left;
|
|
_loadingBar.enabled = false;
|
|
_loadingBackg.enabled = false;
|
|
_canvas.enabled = true;
|
|
StartCoroutine(DisableCanvasRoutine(time));
|
|
}
|
|
|
|
public void ShowMessage(string message)
|
|
{
|
|
StopAllCoroutines();
|
|
_showingMessage = true;
|
|
_headerText.text = message;
|
|
_headerText.alignment = TextAlignmentOptions.Left;
|
|
_loadingBar.enabled = false;
|
|
_loadingBackg.enabled = false;
|
|
_canvas.enabled = true;
|
|
}
|
|
|
|
protected void OnEnable()
|
|
{
|
|
SceneManager.activeSceneChanged += SceneManagerOnActiveSceneChanged;
|
|
DownloadController.Instance.OnDownloadStateChanged += DownloaderStateChanged;
|
|
DownloadController.Instance.OnCheckForUpdates += CheckForUpdatesStart;
|
|
DownloadController.Instance.OnCheckForUpdatesComplete += CheckForUpdatesDone;
|
|
}
|
|
|
|
protected void OnDisable()
|
|
{
|
|
SceneManager.activeSceneChanged -= SceneManagerOnActiveSceneChanged;
|
|
DownloadController.Instance.OnDownloadStateChanged -= DownloaderStateChanged;
|
|
DownloadController.Instance.OnCheckForUpdates -= CheckForUpdatesStart;
|
|
DownloadController.Instance.OnCheckForUpdatesComplete -= CheckForUpdatesDone;
|
|
}
|
|
|
|
private void CheckForUpdatesStart()
|
|
{
|
|
_showingMessage = false;
|
|
_headerText.text = HeaderText;
|
|
_headerText.alignment = TextAlignmentOptions.Left;
|
|
_loadingBar.enabled = false;
|
|
_loadingBackg.enabled = false;
|
|
_canvas.enabled = true;
|
|
}
|
|
|
|
private bool updatesZero = false;
|
|
private void CheckForUpdatesDone(int count)
|
|
{
|
|
if (count == 0) updatesZero = true;
|
|
else updatesZero = false;
|
|
|
|
_showingMessage = false;
|
|
_headerText.text = $"{count} updates found";
|
|
_headerText.alignment = TextAlignmentOptions.Left;
|
|
_loadingBar.enabled = false;
|
|
_loadingBackg.enabled = false;
|
|
_canvas.enabled = true;
|
|
|
|
StartCoroutine(DisableCanvasRoutine(5f));
|
|
}
|
|
|
|
private void SceneManagerOnActiveSceneChanged(Scene oldScene, Scene newScene)
|
|
{
|
|
if (newScene.name == "MenuCore")
|
|
{
|
|
if (_showingMessage)
|
|
{
|
|
_canvas.enabled = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_canvas.enabled = false;
|
|
}
|
|
}
|
|
|
|
private void DownloaderStateChanged()
|
|
{
|
|
if (DownloadController.Instance.IsDownloading)
|
|
{
|
|
StopAllCoroutines();
|
|
_showingMessage = false;
|
|
_headerText.text = "Downloading updates...";
|
|
_headerText.alignment = TextAlignmentOptions.Left;
|
|
_loadingBar.enabled = false;
|
|
_loadingBackg.enabled = false;
|
|
_canvas.enabled = true;
|
|
}
|
|
if (DownloadController.Instance.IsDone && !updatesZero)
|
|
{
|
|
StopAllCoroutines();
|
|
_showingMessage = false;
|
|
_headerText.text = "Update complete. Restart to finish installation.";
|
|
_headerText.alignment = TextAlignmentOptions.Center;
|
|
_loadingBar.enabled = false;
|
|
_loadingBackg.enabled = false;
|
|
}
|
|
}
|
|
|
|
internal void Close()
|
|
{
|
|
StartCoroutine(DisableCanvasRoutine(0f));
|
|
}
|
|
|
|
private IEnumerator DisableCanvasRoutine(float time)
|
|
{
|
|
yield return new WaitForSecondsRealtime(time);
|
|
_canvas.enabled = false;
|
|
_showingMessage = false;
|
|
}
|
|
|
|
internal static FloatingNotification instance;
|
|
|
|
protected void Awake()
|
|
{
|
|
if (instance != null)
|
|
{
|
|
Destroy(this);
|
|
return;
|
|
}
|
|
|
|
instance = this;
|
|
|
|
gameObject.transform.position = Position;
|
|
gameObject.transform.eulerAngles = Rotation;
|
|
gameObject.transform.localScale = Scale;
|
|
|
|
_canvas = gameObject.AddComponent<Canvas>();
|
|
_canvas.renderMode = RenderMode.WorldSpace;
|
|
_canvas.enabled = false;
|
|
var rectTransform = _canvas.transform as RectTransform;
|
|
rectTransform.sizeDelta = CanvasSize;
|
|
|
|
_authorNameText = BeatSaberUI.CreateText(_canvas.transform as RectTransform, AuthorNameText, AuthorNamePosition);
|
|
rectTransform = _authorNameText.transform as RectTransform;
|
|
rectTransform.SetParent(_canvas.transform, false);
|
|
rectTransform.anchoredPosition = AuthorNamePosition;
|
|
rectTransform.sizeDelta = HeaderSize;
|
|
_authorNameText.text = AuthorNameText;
|
|
_authorNameText.fontSize = AuthorNameFontSize;
|
|
|
|
_pluginNameText = BeatSaberUI.CreateText(_canvas.transform as RectTransform, PluginNameText, PluginNamePosition);
|
|
rectTransform = _pluginNameText.transform as RectTransform;
|
|
rectTransform.SetParent(_canvas.transform, false);
|
|
rectTransform.sizeDelta = HeaderSize;
|
|
rectTransform.anchoredPosition = PluginNamePosition;
|
|
_pluginNameText.text = PluginNameText;
|
|
_pluginNameText.fontSize = PluginNameFontSize;
|
|
|
|
_headerText = BeatSaberUI.CreateText(_canvas.transform as RectTransform, HeaderText, HeaderPosition);
|
|
rectTransform = _headerText.transform as RectTransform;
|
|
rectTransform.SetParent(_canvas.transform, false);
|
|
rectTransform.anchoredPosition = HeaderPosition;
|
|
rectTransform.sizeDelta = HeaderSize;
|
|
_headerText.text = HeaderText;
|
|
_headerText.fontSize = HeaderFontSize;
|
|
|
|
_loadingBackg = new GameObject("Background").AddComponent<Image>();
|
|
rectTransform = _loadingBackg.transform as RectTransform;
|
|
rectTransform.SetParent(_canvas.transform, false);
|
|
rectTransform.sizeDelta = LoadingBarSize;
|
|
_loadingBackg.color = BackgroundColor;
|
|
|
|
_loadingBar = new GameObject("Loading Bar").AddComponent<Image>();
|
|
rectTransform = _loadingBar.transform as RectTransform;
|
|
rectTransform.SetParent(_canvas.transform, false);
|
|
rectTransform.sizeDelta = LoadingBarSize;
|
|
var tex = Texture2D.whiteTexture;
|
|
var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.one * 0.5f, 100, 1);
|
|
_loadingBar.sprite = sprite;
|
|
_loadingBar.type = Image.Type.Filled;
|
|
_loadingBar.fillMethod = Image.FillMethod.Horizontal;
|
|
_loadingBar.color = new Color(1, 1, 1, 0.5f);
|
|
|
|
DontDestroyOnLoad(gameObject);
|
|
}
|
|
|
|
/*private void Update()
|
|
{
|
|
if (!_canvas.enabled) return;
|
|
_loadingBar.fillAmount = SongLoader.LoadingProgress;
|
|
}*/
|
|
}
|
|
}
|