Files
Ultimate-Fishing-Simulator-…/Assets/Scripts/Assembly-CSharp/Michsky/UI/Heat/ModalWindowManager.cs
2026-03-04 09:37:33 +08:00

325 lines
7.3 KiB
C#

using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;
namespace Michsky.UI.Heat
{
[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(CanvasGroup))]
public class ModalWindowManager : MonoBehaviour
{
public enum StartBehaviour
{
Enable = 0,
Disable = 1
}
public enum CloseBehaviour
{
Disable = 0,
Destroy = 1
}
public enum InputType
{
Focused = 0,
Free = 1
}
public Image windowIcon;
public TextMeshProUGUI windowTitle;
public TextMeshProUGUI windowDescription;
public ButtonManager confirmButton;
public ButtonManager cancelButton;
[SerializeField]
private Animator mwAnimator;
public Sprite icon;
public string titleText = "Title";
[TextArea(0, 4)]
public string descriptionText = "Description here";
public string titleKey;
public string descriptionKey;
public bool useCustomContent;
public bool isOn;
public bool closeOnCancel = true;
public bool closeOnConfirm = true;
public bool showCancelButton = true;
public bool showConfirmButton = true;
public bool useLocalization = true;
[Range(0.5f, 2f)]
public float animationSpeed = 1f;
public StartBehaviour startBehaviour = StartBehaviour.Disable;
public CloseBehaviour closeBehaviour;
public InputType inputType;
public UnityEvent onConfirm = new UnityEvent();
public UnityEvent onCancel = new UnityEvent();
public UnityEvent onOpen = new UnityEvent();
public UnityEvent onClose = new UnityEvent();
private string animIn = "In";
private string animOut = "Out";
private string animSpeedKey = "AnimSpeed";
private bool canProcessEventSystem;
private float openStateLength;
private float closeStateLength;
private GameObject latestEventSystemObject;
private void Awake()
{
InitModalWindow();
InitEventSystem();
UpdateUI();
}
private void Start()
{
if (startBehaviour == StartBehaviour.Disable)
{
isOn = false;
base.gameObject.SetActive(value: false);
}
else if (startBehaviour == StartBehaviour.Enable)
{
isOn = false;
OpenWindow();
}
}
private void Update()
{
if (inputType != InputType.Free && isOn && canProcessEventSystem && ControllerManager.instance.gamepadEnabled)
{
CheckForEventButtons();
}
}
private void InitModalWindow()
{
if (mwAnimator == null)
{
mwAnimator = base.gameObject.GetComponent<Animator>();
}
if (closeOnCancel)
{
onCancel.AddListener(CloseWindow);
}
if (closeOnConfirm)
{
onConfirm.AddListener(CloseWindow);
}
if (confirmButton != null)
{
confirmButton.onClick.AddListener(onConfirm.Invoke);
}
if (cancelButton != null)
{
cancelButton.onClick.AddListener(onCancel.Invoke);
}
if (useLocalization && !useCustomContent)
{
LocalizedObject component = GetComponent<LocalizedObject>();
if (component == null || !component.CheckLocalizationStatus())
{
useLocalization = false;
}
else
{
if (windowTitle != null && !string.IsNullOrEmpty(titleKey))
{
LocalizedObject component2 = windowTitle.gameObject.GetComponent<LocalizedObject>();
if (component2 != null)
{
component2.tableIndex = component.tableIndex;
component2.localizationKey = titleKey;
component2.UpdateItem();
}
}
if (windowDescription != null && !string.IsNullOrEmpty(descriptionKey))
{
LocalizedObject component3 = windowDescription.gameObject.GetComponent<LocalizedObject>();
if (component3 != null)
{
component3.tableIndex = component.tableIndex;
component3.localizationKey = descriptionKey;
component3.UpdateItem();
}
}
}
}
openStateLength = HeatUIInternalTools.GetAnimatorClipLength(mwAnimator, "ModalWindow_In");
closeStateLength = HeatUIInternalTools.GetAnimatorClipLength(mwAnimator, "ModalWindow_Out");
}
private void InitEventSystem()
{
if (ControllerManager.instance == null)
{
canProcessEventSystem = false;
}
else if (cancelButton == null && confirmButton == null)
{
canProcessEventSystem = false;
}
else
{
canProcessEventSystem = true;
}
}
private void CheckForEventButtons()
{
if (cancelButton != null && EventSystem.current.currentSelectedGameObject != cancelButton.gameObject && EventSystem.current.currentSelectedGameObject != confirmButton.gameObject)
{
ControllerManager.instance.SelectUIObject(cancelButton.gameObject);
}
else if (confirmButton != null && EventSystem.current.currentSelectedGameObject != cancelButton.gameObject && EventSystem.current.currentSelectedGameObject != confirmButton.gameObject)
{
ControllerManager.instance.SelectUIObject(confirmButton.gameObject);
}
}
public void UpdateUI()
{
if (!useCustomContent)
{
if (windowIcon != null)
{
windowIcon.sprite = icon;
}
if (windowTitle != null && (!useLocalization || string.IsNullOrEmpty(titleKey)))
{
windowTitle.text = titleText;
}
if (windowDescription != null && (!useLocalization || string.IsNullOrEmpty(titleKey)))
{
windowDescription.text = descriptionText;
}
}
if (showCancelButton && cancelButton != null)
{
cancelButton.gameObject.SetActive(value: true);
}
else if (cancelButton != null)
{
cancelButton.gameObject.SetActive(value: false);
}
if (showConfirmButton && confirmButton != null)
{
confirmButton.gameObject.SetActive(value: true);
}
else if (confirmButton != null)
{
confirmButton.gameObject.SetActive(value: false);
}
}
public void OpenWindow()
{
if (!isOn)
{
if (EventSystem.current.currentSelectedGameObject != null)
{
latestEventSystemObject = EventSystem.current.currentSelectedGameObject;
}
base.gameObject.SetActive(value: true);
isOn = true;
StopCoroutine("DisableObject");
StopCoroutine("DisableAnimator");
StartCoroutine("DisableAnimator");
mwAnimator.enabled = true;
mwAnimator.SetFloat(animSpeedKey, animationSpeed);
mwAnimator.Play(animIn);
onOpen.Invoke();
}
}
public void CloseWindow()
{
if (isOn)
{
if (base.gameObject.activeSelf)
{
StopCoroutine("DisableObject");
StopCoroutine("DisableAnimator");
StartCoroutine("DisableObject");
}
isOn = false;
mwAnimator.enabled = true;
mwAnimator.SetFloat(animSpeedKey, animationSpeed);
mwAnimator.Play(animOut);
onClose.Invoke();
if (ControllerManager.instance != null && latestEventSystemObject != null && latestEventSystemObject.activeInHierarchy)
{
ControllerManager.instance.SelectUIObject(latestEventSystemObject);
}
}
}
public void AnimateWindow()
{
if (!isOn)
{
OpenWindow();
}
else
{
CloseWindow();
}
}
private IEnumerator DisableObject()
{
yield return new WaitForSecondsRealtime(closeStateLength);
if (closeBehaviour == CloseBehaviour.Disable)
{
base.gameObject.SetActive(value: false);
}
else if (closeBehaviour == CloseBehaviour.Destroy)
{
Object.Destroy(base.gameObject);
}
mwAnimator.enabled = false;
}
private IEnumerator DisableAnimator()
{
yield return new WaitForSecondsRealtime(openStateLength + 0.1f);
mwAnimator.enabled = false;
}
}
}