Nicklas Bourelius b15f3b7391 Color now working.
Need to implement: Slider and logic for it and UI and the logic for that as well.
2024-05-23 18:36:51 +02:00

229 lines
6.5 KiB
C#

#if UNITY_TMPRO
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Proxima
{
[HelpURL("https://www.unityproxima.com/docs")]
public class ProximaConnectUI : MonoBehaviour
{
// Insepctor to start and stop.
[SerializeField]
private ProximaInspector _proximaInspector;
public ProximaInspector ProximaInspector
{
get => _proximaInspector;
set => _proximaInspector = value;
}
// Input field to enter the display name.
[SerializeField]
private TMP_InputField _displayNameInputField;
public TMP_InputField DisplayNameInputField
{
get => _displayNameInputField;
set => _displayNameInputField = value;
}
// Input field to enter the password.
[SerializeField]
private TMP_InputField _passwordInputField;
public TMP_InputField PasswordInputField
{
get => _passwordInputField;
set => _passwordInputField = value;
}
// Text to display errors.
[SerializeField]
private TMP_Text _errorLabel;
public TMP_Text ErrorLabel
{
get => _errorLabel;
set => _errorLabel = value;
}
// Button to start Proxima.
[SerializeField]
private Button _startButton;
public Button StartButton
{
get => _startButton;
set => _startButton = value;
}
// Button to open Proxima in the browser.
[SerializeField]
private Button _openButton;
public Button OpenButton
{
get => _openButton;
set => _openButton = value;
}
// Button to stop Proxima.
[SerializeField]
private Button _stopButton;
public Button StopButton
{
get => _stopButton;
set => _stopButton = value;
}
// GameObject to show when Proxima is not started.
[SerializeField]
private GameObject _connectUIRoot;
public GameObject ConnectUIRoot
{
get => _connectUIRoot;
set => _connectUIRoot = value;
}
// GameObject to show when Proxima is started.
[SerializeField]
private GameObject _startedUIRoot;
public GameObject StartedUIRoot
{
get => _startedUIRoot;
set => _startedUIRoot = value;
}
// Button to show/hide the UI.
[SerializeField]
private Button _showHideButton;
public Button ShowHideButton
{
get => _showHideButton;
set => _showHideButton = value;
}
void Start()
{
if (EventSystem.current == null)
{
gameObject.AddComponent<EventSystem>();
gameObject.AddComponent<StandaloneInputModule>();
}
_proximaInspector.Status.Changed += OnStatusChanged;
_displayNameInputField.text = _proximaInspector.DisplayName;
_displayNameInputField.onSubmit.AddListener((s) => _passwordInputField.Select());
_startButton.onClick.AddListener(OnStartButtonClicked);
if (_openButton)
{
#if UNITY_WEBGL && !UNITY_EDITOR
var trigger = _openButton.gameObject.AddComponent<EventTrigger>();
var pointerDown = new EventTrigger.Entry();
pointerDown.eventID = EventTriggerType.PointerDown;
pointerDown.callback.AddListener((e) => {
ProximaWebGLConnection.OpenOnMouseUp(_proximaInspector.Status.ConnectInfo);
});
trigger.triggers.Add(pointerDown);
#else
_openButton.onClick.AddListener(() => {
Application.OpenURL(_proximaInspector.Status.ConnectInfo);
});
#endif
}
_stopButton.onClick.AddListener(OnStopButtonClicked);
_showHideButton.onClick.AddListener(TogglePanel);
_passwordInputField.onSubmit.AddListener((s) => OnStartButtonClicked());
OnStatusChanged();
}
private void OnDestroy()
{
if (_proximaInspector)
{
_proximaInspector.Status.Changed -= OnStatusChanged;
}
}
private void OnStatusChanged()
{
_startButton.interactable = !_proximaInspector.Status.IsRunning;
if (_proximaInspector.Status.Listening)
{
_startedUIRoot.SetActive(true);
_connectUIRoot.SetActive(false);
}
else
{
_startedUIRoot.SetActive(false);
_connectUIRoot.SetActive(true);
}
if (_errorLabel != null)
{
_errorLabel.text = _proximaInspector.Status.Error;
_errorLabel.gameObject.SetActive(!string.IsNullOrWhiteSpace(_proximaInspector.Status.Error));
}
}
private void OnStartButtonClicked()
{
if (_proximaInspector != null &&
_passwordInputField != null &&
_displayNameInputField != null &&
!_proximaInspector.Status.IsRunning)
{
_proximaInspector.Password = _passwordInputField.text;
_proximaInspector.DisplayName = _displayNameInputField.text;
_proximaInspector.Run();
}
}
private void OnStopButtonClicked()
{
if (_proximaInspector != null)
{
_proximaInspector.Stop();
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
HidePanel();
}
}
public void ShowPanel()
{
var panel = transform.GetChild(0).gameObject;
panel.SetActive(true);
}
public void HidePanel()
{
var panel = transform.GetChild(0).gameObject;
panel.SetActive(false);
}
public void TogglePanel()
{
var panel = transform.GetChild(0).gameObject;
panel.SetActive(!panel.activeSelf);
}
}
}
#else
namespace Proxima
{
public class ProximaConnectUI : UnityEngine.MonoBehaviour
{
public ProximaInspector ProximaInspector;
}
}
#endif