StationObscurum/Assets/Packages/Heat - Complete Modern UI/Scripts/UI Elements/SocialsWidget.cs
2024-02-01 22:45:59 -05:00

267 lines
9.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using TMPro;
namespace Michsky.UI.Heat
{
public class SocialsWidget : MonoBehaviour
{
// Content
public List<Item> socials = new List<Item>();
List<ButtonManager> buttons = new List<ButtonManager>();
// Resources
[SerializeField] private GameObject itemPreset;
[SerializeField] private Transform itemParent;
[SerializeField] private GameObject buttonPreset;
[SerializeField] private Transform buttonParent;
[SerializeField] private Image background;
// Settings
public bool useLocalization = true;
[Range(1, 30)] public float timer = 4;
[Range(0.1f, 3)] public float tintSpeed = 0.5f;
[SerializeField] private AnimationCurve tintCurve = new AnimationCurve(new Keyframe(0.0f, 0.0f), new Keyframe(1.0f, 1.0f));
// Helpers
int currentSliderIndex;
float timerCount = 0;
bool isInitialized;
bool updateTimer;
bool isTransitionInProgress;
Animator currentItemObject;
LocalizedObject localizedObject;
Image raycastImg;
[System.Serializable]
public class Item
{
public string socialID = "News title";
public Sprite icon;
public Color backgroundTint = new Color(255, 255, 255, 255);
[TextArea] public string description = "News description";
public string link;
public UnityEvent onClick = new UnityEvent();
[Header("Localization")]
public string descriptionKey = "DescriptionKey";
}
void OnEnable()
{
if (isInitialized == false) { InitializeItems(); }
else { StartCoroutine(InitCurrentItem()); }
}
void Update()
{
if (isInitialized == false || updateTimer == false)
return;
timerCount += Time.unscaledDeltaTime;
if (timerCount > timer)
{
SetSocialByTimer();
timerCount = 0;
}
}
public void InitializeItems()
{
if (useLocalization == true)
{
localizedObject = gameObject.GetComponent<LocalizedObject>();
if (localizedObject == null || localizedObject.CheckLocalizationStatus() == false) { useLocalization = false; }
}
foreach (Transform child in itemParent) { Destroy(child.gameObject); }
foreach (Transform child in buttonParent) { Destroy(child.gameObject); }
for (int i = 0; i < socials.Count; ++i)
{
int tempIndex = i;
GameObject itemGO = Instantiate(itemPreset, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
itemGO.transform.SetParent(itemParent, false);
itemGO.gameObject.name = socials[i].socialID;
itemGO.SetActive(false);
TextMeshProUGUI itemDescription = itemGO.transform.GetComponentInChildren<TextMeshProUGUI>();
if (useLocalization == false || string.IsNullOrEmpty(socials[i].descriptionKey)) { itemDescription.text = socials[i].description; }
else
{
LocalizedObject tempLoc = itemDescription.GetComponent<LocalizedObject>();
if (tempLoc != null)
{
tempLoc.tableIndex = localizedObject.tableIndex;
tempLoc.localizationKey = socials[i].descriptionKey;
tempLoc.onLanguageChanged.AddListener(delegate { itemDescription.text = tempLoc.GetKeyOutput(tempLoc.localizationKey); });
tempLoc.InitializeItem();
tempLoc.UpdateItem();
}
}
GameObject btnGO = Instantiate(buttonPreset, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
btnGO.transform.SetParent(buttonParent, false);
btnGO.gameObject.name = socials[i].socialID;
ButtonManager btn = btnGO.GetComponent<ButtonManager>();
buttons.Add(btn);
btn.SetIcon(socials[i].icon);
btn.onClick.AddListener(delegate
{
socials[tempIndex].onClick.Invoke();
if (string.IsNullOrEmpty(socials[tempIndex].link) == false) { Application.OpenURL(socials[tempIndex].link); }
});
btn.onHover.AddListener(delegate
{
foreach (ButtonManager tempBtn in buttons)
{
if (tempBtn == btn)
continue;
tempBtn.Interactable(false);
tempBtn.UpdateState();
StopCoroutine("SetSocialByHover");
StartCoroutine("SetSocialByHover", tempIndex);
}
});
btn.onLeave.AddListener(delegate
{
updateTimer = true;
foreach (ButtonManager tempBtn in buttons)
{
if (tempBtn == btn)
{
tempBtn.StartCoroutine("SetHighlight");
continue;
}
tempBtn.Interactable(true);
tempBtn.UpdateState();
}
});
}
StartCoroutine(InitCurrentItem());
isInitialized = true;
// Register raycast with image
if (raycastImg == null)
{
raycastImg = gameObject.AddComponent<Image>();
raycastImg.color = new Color(0, 0, 0, 0);
}
}
public void SetSocialByTimer()
{
if (socials.Count > 1 && currentItemObject != null)
{
currentItemObject.enabled = true;
currentItemObject.Play("Out");
buttons[currentSliderIndex].UpdateState();
if (currentSliderIndex == socials.Count - 1) { currentSliderIndex = 0; }
else { currentSliderIndex++; }
currentItemObject = itemParent.GetChild(currentSliderIndex).GetComponent<Animator>();
currentItemObject.gameObject.SetActive(true);
currentItemObject.enabled = true;
currentItemObject.Play("In");
buttons[currentSliderIndex].StartCoroutine("SetHighlight");
StopCoroutine("DisableItemAnimators");
StartCoroutine("DisableItemAnimators");
if (background != null)
{
StopCoroutine("DoBackgroundColorLerp");
StartCoroutine("DoBackgroundColorLerp");
}
}
}
IEnumerator InitCurrentItem()
{
yield return new WaitForSecondsRealtime(0.02f);
currentItemObject = itemParent.GetChild(currentSliderIndex).GetComponent<Animator>();
currentItemObject.gameObject.SetActive(true);
currentItemObject.enabled = true;
currentItemObject.Play("In");
buttons[currentSliderIndex].StartCoroutine("SetHighlight");
StopCoroutine("DisableItemAnimators");
StartCoroutine("DisableItemAnimators");
if (background != null)
{
StopCoroutine("DoBackgroundColorLerp");
StartCoroutine("DoBackgroundColorLerp");
}
timerCount = 0;
updateTimer = true;
}
IEnumerator SetSocialByHover(int index)
{
updateTimer = false;
timerCount = 0;
if (currentSliderIndex == index) { yield break; }
if (isTransitionInProgress == true) { yield return new WaitForSecondsRealtime(0.15f); isTransitionInProgress = false; }
isTransitionInProgress = true;
currentItemObject.enabled = true;
currentItemObject.Play("Out");
currentSliderIndex = index;
currentItemObject = itemParent.GetChild(currentSliderIndex).GetComponent<Animator>();
currentItemObject.gameObject.SetActive(true);
currentItemObject.enabled = true;
currentItemObject.Play("In");
StopCoroutine("DisableItemAnimators");
StartCoroutine("DisableItemAnimators");
if (background != null)
{
StopCoroutine("DoBackgroundColorLerp");
StartCoroutine("DoBackgroundColorLerp");
}
}
IEnumerator DoBackgroundColorLerp()
{
float elapsedTime = 0;
while (background.color != socials[currentSliderIndex].backgroundTint)
{
elapsedTime += Time.unscaledDeltaTime;
background.color = Color.Lerp(background.color, socials[currentSliderIndex].backgroundTint, tintCurve.Evaluate(elapsedTime * tintSpeed));
yield return null;
}
background.color = socials[currentSliderIndex].backgroundTint;
}
IEnumerator DisableItemAnimators()
{
yield return new WaitForSecondsRealtime(0.6f);
for (int i = 0; i < socials.Count; i++)
{
if (i != currentSliderIndex) { itemParent.GetChild(i).gameObject.SetActive(false); }
itemParent.GetChild(i).GetComponent<Animator>().enabled = false;
}
}
}
}