123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- using HMUI;
- using SongBrowserPlugin.DataAccess;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using TMPro;
- using UnityEngine;
- using UnityEngine.Events;
- using UnityEngine.SceneManagement;
- using UnityEngine.UI;
- using VRUI;
- using Image = UnityEngine.UI.Image;
- namespace SongBrowserPlugin.UI
- {
- public static class UIBuilder
- {
- /// <summary>
- /// Create an empty BeatSaber VRUI view controller.
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="name"></param>
- /// <returns></returns>
- public static T CreateViewController<T>(string name) where T : VRUIViewController
- {
- T vc = new GameObject(name).AddComponent<T>();
- vc.rectTransform.anchorMin = new Vector2(0f, 0f);
- vc.rectTransform.anchorMax = new Vector2(1f, 1f);
- vc.rectTransform.sizeDelta = new Vector2(0f, 0f);
- vc.rectTransform.anchoredPosition = new Vector2(0f, 0f);
- return vc;
- }
- /// <summary>
- /// Create empty FlowCoordinator
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="name"></param>
- /// <returns></returns>
- public static T CreateFlowCoordinator<T>(string name) where T : FlowCoordinator
- {
- T vc = new GameObject(name).AddComponent<T>();
- return vc;
- }
- /// <summary>
- /// Helper, create a UI button from template name.
- /// </summary>
- /// <param name="parent"></param>
- /// <param name="buttonTemplateName"></param>
- /// <returns></returns>
- static public Button CreateUIButton(RectTransform parent, String buttonTemplateName)
- {
- Button b = Resources.FindObjectsOfTypeAll<Button>().First(x => (x.name == buttonTemplateName));
- return CreateUIButton(parent, b);
- }
- /// <summary>
- /// Clone a Unity Button into a Button we control.
- /// </summary>
- /// <param name="parent"></param>
- /// <param name="buttonTemplate"></param>
- /// <param name="buttonInstance"></param>
- /// <returns></returns>
- static public Button CreateUIButton(RectTransform parent, Button buttonTemplate)
- {
- Button btn = UnityEngine.Object.Instantiate(buttonTemplate, parent, false);
- UnityEngine.Object.DestroyImmediate(btn.GetComponent<GameEventOnUIButtonClick>());
- btn.onClick = new Button.ButtonClickedEvent();
- btn.name = "CustomUIButton";
- return btn;
- }
- /// <summary>
- /// Very generic helper create button method.
- /// </summary>
- /// <param name="parent"></param>
- /// <param name="buttonTemplate"></param>
- /// <param name="buttonText"></param>
- /// <param name="x"></param>
- /// <param name="y"></param>
- /// <param name="w"></param>
- /// <param name="h"></param>
- /// <returns></returns>
- static public Button CreateButton(RectTransform parent, Button buttonTemplate, String buttonText, float fontSize, float x, float y, float w, float h)
- {
- Button newButton = UIBuilder.CreateUIButton(parent, buttonTemplate);
- newButton.interactable = true;
- (newButton.transform as RectTransform).anchoredPosition = new Vector2(x, y);
- (newButton.transform as RectTransform).sizeDelta = new Vector2(w, h);
- UIBuilder.SetButtonText(ref newButton, buttonText);
- UIBuilder.SetButtonIconEnabled(ref newButton, false);
- UIBuilder.SetButtonTextSize(ref newButton, fontSize);
- return newButton;
- }
- /// <summary>
- /// Generic create sort button.
- /// </summary>
- /// <param name="rect"></param>
- /// <param name="templateButtonName"></param>
- /// <param name="buttonText"></param>
- /// <param name="iconName"></param>
- /// <param name="x"></param>
- /// <param name="y"></param>
- /// <param name="w"></param>
- /// <param name="h"></param>
- /// <param name="action"></param>
- public static SongSortButton CreateSortButton(RectTransform parent, Button buttonTemplate, Sprite iconSprite, string buttonText, float fontSize, float x, float y, float w, float h, SongSortMode sortMode, System.Action<SongSortMode> onClickEvent)
- {
- SongSortButton sortButton = new SongSortButton();
- Button newButton = UIBuilder.CreateUIButton(parent, buttonTemplate);
- newButton.interactable = true;
- (newButton.transform as RectTransform).anchoredPosition = new Vector2(x, y);
- (newButton.transform as RectTransform).sizeDelta = new Vector2(w, h);
- UIBuilder.SetButtonText(ref newButton, buttonText);
- UIBuilder.SetButtonIconEnabled(ref newButton, false);
- UIBuilder.SetButtonIcon(ref newButton, iconSprite);
- UIBuilder.SetButtonTextSize(ref newButton, fontSize);
- newButton.onClick.RemoveAllListeners();
- newButton.onClick.AddListener(delegate ()
- {
- onClickEvent(sortMode);
- });
-
- sortButton.Button = newButton;
- sortButton.SortMode = sortMode;
- return sortButton;
- }
- /// <summary>
- /// Create a page up/down button.
- /// </summary>
- /// <param name="parent"></param>
- /// <param name="buttonTemplate"></param>
- /// <param name="iconSprite"></param>
- /// <param name="x"></param>
- /// <param name="y"></param>
- /// <param name="w"></param>
- /// <param name="h"></param>
- /// <param name="iconWidth"></param>
- /// <param name="iconHeight"></param>
- /// <param name="iconRotation"></param>
- /// <returns></returns>
- public static Button CreateIconButton(RectTransform parent, Button buttonTemplate, Sprite iconSprite, Vector2 pos, Vector2 size, Vector2 iconPos, Vector2 iconSize, Vector2 iconScale, float iconRotation)
- {
- Button newButton = UIBuilder.CreateUIButton(parent, buttonTemplate);
- newButton.interactable = true;
- (newButton.transform as RectTransform).anchoredPosition = new Vector2(pos.x, pos.y);
- (newButton.transform as RectTransform).sizeDelta = new Vector2(size.x, size.y);
- RectTransform iconTransform = newButton.GetComponentsInChildren<RectTransform>(true).First(c => c.name == "Icon");
- iconTransform.gameObject.SetActive(true);
- HorizontalLayoutGroup hgroup = iconTransform.parent.GetComponent<HorizontalLayoutGroup>();
- UnityEngine.Object.Destroy(hgroup);
- iconTransform.anchoredPosition = new Vector2(iconPos.x, iconPos.y);
- iconTransform.sizeDelta = new Vector2(iconSize.x, iconSize.y);
- iconTransform.localScale = new Vector2(iconScale.x, iconScale.y);
- iconTransform.Rotate(0, 0, iconRotation);
- UnityEngine.Object.Destroy(newButton.GetComponentsInChildren<RectTransform>(true).First(c => c.name == "Text").gameObject);
- UIBuilder.SetButtonBorder(ref newButton, Color.clear);
- UIBuilder.SetButtonIcon(ref newButton, iconSprite);
- return newButton;
- }
- /// <summary>
- /// Create a beat saber dismiss button.
- /// </summary>
- /// <param name="parent"></param>
- /// <returns></returns>
- public static Button CreateBackButton(RectTransform parent)
- {
- Button dismissButton = CreateUIButton(parent, "BackArrowButton");
- dismissButton.onClick.RemoveAllListeners();
- return dismissButton;
- }
- /// <summary>
- /// Generate TextMesh.
- /// </summary>
- /// <param name="parent"></param>
- /// <param name="text"></param>
- /// <param name="position"></param>
- /// <returns></returns>
- static public TextMeshProUGUI CreateText(RectTransform parent, string text, Vector2 position)
- {
- TextMeshProUGUI textMesh = new GameObject("TextMeshProUGUI_GO").AddComponent<TextMeshProUGUI>();
- textMesh.rectTransform.SetParent(parent, false);
- textMesh.text = text;
- textMesh.fontSize = 4;
- textMesh.color = Color.white;
- textMesh.font = Resources.Load<TMP_FontAsset>("Teko-Medium SDF No Glow");
- textMesh.rectTransform.anchorMin = new Vector2(0.5f, 1f);
- textMesh.rectTransform.anchorMax = new Vector2(0.5f, 1f);
- //textMesh.rectTransform.sizeDelta = size;
- textMesh.rectTransform.sizeDelta = new Vector2(60f, 10f);
- textMesh.rectTransform.anchoredPosition = position;
- return textMesh;
- }
- /// <summary>
- /// Adjust a Button text.
- /// </summary>
- /// <param name="button"></param>
- /// <param name="text"></param>
- static public void SetButtonText(ref Button button, string text)
- {
- if (button.GetComponentInChildren<TextMeshProUGUI>() != null)
- {
- button.GetComponentInChildren<TextMeshProUGUI>().text = text;
- }
- }
- /// <summary>
- /// Adjust button text size.
- /// </summary>
- /// <param name="button"></param>
- /// <param name="fontSize"></param>
- static public void SetButtonTextSize(ref Button button, float fontSize)
- {
- if (button.GetComponentInChildren<TextMeshProUGUI>() != null)
- {
- button.GetComponentInChildren<TextMeshProUGUI>().fontSize = fontSize;
- }
- }
- /// <summary>
- /// Set a button icon.
- /// </summary>
- /// <param name="button"></param>
- /// <param name="icon"></param>
- static public void SetButtonIcon(ref Button button, Sprite icon)
- {
- if (button.GetComponentsInChildren<UnityEngine.UI.Image>().Count() > 1)
- {
- button.GetComponentsInChildren<Image>().First(x => x.name == "Icon").sprite = icon;
- }
- }
- /// <summary>
- /// Disable a button icon.
- /// </summary>
- /// <param name="button"></param>
- /// <param name="enabled"></param>
- static public void SetButtonIconEnabled(ref Button button, bool enabled)
- {
- if (button.GetComponentsInChildren<UnityEngine.UI.Image>().Count() > 1)
- {
- button.GetComponentsInChildren<UnityEngine.UI.Image>()[1].enabled = enabled;
- }
- }
- /// <summary>
- /// Adjust button background color.
- /// </summary>
- /// <param name="button"></param>
- /// <param name="background"></param>
- static public void SetButtonBackground(ref Button button, Sprite background)
- {
- if (button.GetComponentsInChildren<Image>().Any())
- {
- button.GetComponentsInChildren<UnityEngine.UI.Image>()[0].sprite = background;
- }
- }
- /// <summary>
- /// Adjust button border.
- /// </summary>
- /// <param name="button"></param>
- /// <param name="color"></param>
- static public void SetButtonBorder(ref Button button, Color color)
- {
- if (button.GetComponentsInChildren<Image>().Any())
- {
- button.GetComponentsInChildren<UnityEngine.UI.Image>()[0].color = color;
- }
- }
- }
- }
|