Files
Vocaluxe/Vocaluxe.UI.Unity/Assets/ScreenHandler.cs
T

170 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Facebook.Yoga;
using UnityEngine;
using UnityEngine.UI;
using Vocaluxe.UI;
using Vocaluxe.UI.AbstractElements;
using Vocaluxe.UI.BasicElements.Button;
using Vocaluxe.UI.BasicElements.Text;
using Vocaluxe.UI.Screens;
public class ScreenHandler : MonoBehaviour
{
private CUiConnector _connector;
private Dictionary<EUiScreenType, GameObject> _screens = new Dictionary<EUiScreenType, GameObject>();
private EUiScreenType _currentScreen = EUiScreenType.None;
public GameObject ScreenPrefab;
public GameObject ButtonPrefab;
public GameObject TextPrefab;
// Use this for initialization
void Start ()
{
useGUILayout = false;
RectTransform rt = (RectTransform)transform;
_connector = new CUiConnector(Convert.ToInt32(rt.rect.width), Convert.ToInt32(rt.rect.height));
foreach (var screenInfo in _connector.GetAllScreens())
{
_CreateScreen(screenInfo);
}
}
// Update is called once per frame
void Update ()
{
if (_currentScreen == DummyClass.CurrentScreen)
return;
ChangeScreen(_currentScreen, DummyClass.CurrentScreen);
}
private void ChangeScreen(EUiScreenType currentScreen, EUiScreenType targetScreen)
{
if (currentScreen == targetScreen)
return;
DeactivateScreen(currentScreen);
ActivateScreen(targetScreen);
}
private void ActivateScreen(EUiScreenType screen)
{
if(screen == EUiScreenType.None)
return;
_screens[screen].SetActive(true);
_currentScreen = screen;
}
private void DeactivateScreen(EUiScreenType screen)
{
if (screen == EUiScreenType.None)
return;
_screens[screen].SetActive(false);
_currentScreen = DummyClass.CurrentScreen;
}
private void _CreateScreen(KeyValuePair<EUiScreenType, CUiScreen> screenNameAndInfo)
{
GameObject newScreen = CreateElement(screenNameAndInfo.Value, screenNameAndInfo.Key.ToString());
_screens.Add(screenNameAndInfo.Key, newScreen);
newScreen.GetComponent<RectTransform>().SetParent(this.transform);
newScreen.SetActive(false);
}
private GameObject CreateElement(CUiScreen screenInfo, string screenName = "")
{
GameObject screen = Instantiate(ScreenPrefab);
screen.name = screenName;
SetProperties(screenInfo, screen);
return screen;
}
private void SetProperties(CUiScreen screenInfo, GameObject screen)
{
PositionElement(screenInfo, screen);
AddChildren(screenInfo, screen);
}
private GameObject CreateElement(CUiElementButton buttonInfo)
{
var button = Instantiate(ButtonPrefab);
SetProperties(buttonInfo, button);
return button;
}
private void SetProperties(CUiElementButton buttonInfo, GameObject button, bool setPosition = true)
{
Button btnComponent = button.GetComponent<Button>();
btnComponent.onClick.AddListener(buttonInfo.Controller.RaiseClicked);
if(setPosition)
PositionElement(buttonInfo, button);
// TODO: Remove: making test buttons green
button.GetComponent<Image>().color = Color.green;
var buttonText = button.GetComponentInChildren<Text>().gameObject;
SetProperties((CUiElementText)buttonInfo.FirstOrDefault(x => x is CUiElementText), buttonText, setPosition:false);
}
private GameObject CreateElement(CUiElementText textInfo)
{
var text = Instantiate(TextPrefab);
SetProperties(textInfo, text);
return text;
}
private void SetProperties(CUiElementText textInfo, GameObject text, bool setPosition=true)
{
var textComponent = text.GetComponent<Text>();
// Add text to the text component
textComponent.text = textInfo.Controller.Text;
if(setPosition)
PositionElement(textInfo, text);
}
private GameObject CreateElement(YogaNode node)
{
var screen = node as CUiScreen;
if (screen != null)
{
return CreateElement(screen);
}
var button = node as CUiElementButton;
if (button != null)
{
return CreateElement(button);
}
var text = node as CUiElementText;
if (text != null)
{
return CreateElement(text);
}
throw new NotSupportedException();
}
private void AddChildren(CUiElement uiElement, GameObject gameObj)
{
foreach (YogaNode child in uiElement)
{
var newObj = CreateElement(child);
newObj.GetComponent<RectTransform>().SetParent(gameObj.transform);
}
}
private static void PositionElement(CUiElement element, GameObject newGameObject)
{
RectTransform rectTransform = newGameObject.GetComponent<RectTransform>();
rectTransform.anchoredPosition.Set(0f, 0f);
rectTransform.position = new Vector2(element.LayoutX, element.LayoutY);
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, element.LayoutWidth);
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, element.LayoutHeight);
}
}