OldTerminal/Assets/Scripts/AppLayer.cs

336 lines
11 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using NaughtyAttributes;
using UnityEditor;
public class AppLayer : MonoBehaviour
{
public int layer = 0;
public bool active;
public bool fullscreen;
GameObject detectPanel;
GameObject panel = null;
public Sprite circleSprite;
public Texture2D horizontalCursor;
public Texture2D verticalCursor;
public Texture2D diagonalCursor;
private bool cursorsSet = false;
public Vector2 lastOffsetMin = Vector2.zero;
public Vector2 lastOffsetMax = Vector2.zero;
public Vector2 appMinSize = new Vector2(200, 150);
public Vector2 anchoredPosition = Vector2.zero;
public Vector2 sizeDelta = Vector2.zero;
public Color color = Color.black;
public Sprite background;
public Font font;
public enum AppType
{
None,
Calculator,
Messenger,
Notepad
}
[Header("Set Script")]
public bool manualSet = false;
[ShowIf(nameof(manualSet))]
public AppType appType;
[ShowIf(nameof(appType), AppType.Calculator)]
public GameObject buttonPrefab;
[ShowIf(nameof(appType), AppType.Messenger)]
public GameObject buttonPrefab2;
private void Awake()
{
if (!manualSet) appType = AppType.None;
RectTransform rect = transform.GetComponent<RectTransform>();
sizeDelta = rect.sizeDelta;
anchoredPosition = rect.anchoredPosition;
}
void Start()
{
if (appType == AppType.Calculator)
{
if (GetComponentInChildren <SimpleCalculator>() == null)
{
GameObject panel = new GameObject(
"Panel",
typeof(RectTransform),
typeof(CanvasRenderer),
typeof(Image),
typeof(SimpleCalculator)
);
panel.transform.SetParent(transform, false);
var Rect = panel.GetComponent<RectTransform>();
Rect.anchorMin = Vector2.zero;
Rect.anchorMax = Vector2.one;
Rect.offsetMin = new Vector2(0, 0);
Rect.offsetMax = new Vector2(0, -20);
var calculator = panel.GetComponent<SimpleCalculator>();
calculator.appLayer = GetComponent<AppLayer>();
calculator.buttonPrefab = buttonPrefab;
calculator.font = font;
var image = panel.GetComponent<Image>();
image.sprite = background;
image.color = color;
}
}
else if (appType == AppType.Messenger)
{
if (GetComponentInChildren<Messenger>() == null)
{
GameObject panel = new GameObject(
"Panel",
typeof(RectTransform),
typeof(CanvasRenderer),
typeof(Image),
typeof(Messenger)
);
panel.transform.SetParent(transform, false);
var Rect = panel.GetComponent<RectTransform>();
Rect.anchorMin = Vector2.zero;
Rect.anchorMax = Vector2.one;
Rect.offsetMin = new Vector2(0, 0);
Rect.offsetMax = new Vector2(0, -20);
var messenger = panel.GetComponent<Messenger>();
messenger.appLayer = GetComponent<AppLayer>();
//messenger.buttonPrefab = buttonPrefab2;
//messenger.font = font;
var image = panel.GetComponent<Image>();
image.sprite = background;
image.color = color;
}
}
else if (appType == AppType.Notepad)
{
if (GetComponentInChildren<Notepad>() == null)
{
GameObject panel = new GameObject(
"Panel",
typeof(RectTransform),
typeof(CanvasRenderer),
typeof(Image),
typeof(Notepad)
);
panel.transform.SetParent(transform, false);
var Rect = panel.GetComponent<RectTransform>();
Rect.anchorMin = Vector2.zero;
Rect.anchorMax = Vector2.one;
Rect.offsetMin = new Vector2(0, 0);
Rect.offsetMax = new Vector2(0, -20);
var messenger = panel.GetComponent<Notepad>();
messenger.appLayer = GetComponent<AppLayer>();
//messenger.buttonPrefab = buttonPrefab2;
//messenger.font = font;
var image = panel.GetComponent<Image>();
image.sprite = background;
image.color = color;
}
}
detectPanel = new GameObject("OverlayPanel", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Button));
detectPanel.transform.SetParent(transform, false);
RectTransform rect = detectPanel.GetComponent<RectTransform>();
rect.anchorMin = new Vector2(0, 0);
rect.anchorMax = new Vector2(1, 1);
rect.offsetMin = Vector2.zero;
rect.offsetMax = Vector2.zero;
Image img = detectPanel.GetComponent<Image>();
img.color = new Color(0,0,0,0.001f);
Button childButton = detectPanel.GetComponent<Button>();
childButton.onClick.AddListener(OnDetectClicked);
CreateTopPanel();
}
public void OnSetCursors(Texture2D h, Texture2D v, Texture2D d)
{
if (cursorsSet) { return; }
horizontalCursor = h;
verticalCursor = v;
diagonalCursor = d;
CreateResizeHandles();
cursorsSet = true;
}
private void CreateResizeHandles()
{
RectTransform myRect = GetComponent<RectTransform>();
CreateHandle("Resize_Right", new Vector2(1, 0), new Vector2(1, 1), new Vector2(8, -20),
new Vector2(1, 0.5f), WindowResizer.ResizeEdge.Right);
CreateHandle("Resize_Bottom", new Vector2(0, 0), new Vector2(1, 0), new Vector2(0, 8),
new Vector2(0.5f, 0), WindowResizer.ResizeEdge.Bottom);
CreateHandle("Resize_BottomRight", new Vector2(1, 0), new Vector2(1, 0), new Vector2(10, 10),
new Vector2(1, 0), WindowResizer.ResizeEdge.BottomRight);
}
private void CreateHandle(string name, Vector2 min, Vector2 max, Vector2 size, Vector2 pivot, WindowResizer.ResizeEdge edge)
{
GameObject handle = new GameObject(name, typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(WindowResizer));
handle.transform.SetParent(this.transform, false);
RectTransform rt = handle.GetComponent<RectTransform>();
rt.anchorMin = min;
rt.anchorMax = max;
rt.sizeDelta = size;
rt.pivot = pivot;
if (edge == WindowResizer.ResizeEdge.Right) rt.anchoredPosition = new Vector2(0, -10);
handle.GetComponent<Image>().color = Color.clear;
WindowResizer resizer = handle.GetComponent<WindowResizer>();
resizer.Setup(GetComponent<RectTransform>(), new Vector2(200, 150), edge, horizontalCursor, verticalCursor, diagonalCursor);
}
public void CreateTopPanel()
{
GameObject panelObj = new GameObject("HeaderPanel", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(WindowDragger));
panelObj.transform.SetParent(this.transform, false);
RectTransform panelRect = panelObj.GetComponent<RectTransform>();
panelRect.anchorMin = new Vector2(0, 1);
panelRect.anchorMax = new Vector2(1, 1);
panelRect.pivot = new Vector2(0.5f, 1);
panelRect.sizeDelta = new Vector2(0, 20);
panelRect.anchoredPosition = Vector2.zero;
panelObj.GetComponent<Image>().color = new Color(0.2f, 0.2f, 0.2f, 1f);
HorizontalLayoutGroup layout = panelObj.AddComponent<HorizontalLayoutGroup>();
layout.padding = new RectOffset(5, 5, 2, 2);
layout.spacing = 10;
layout.childAlignment = TextAnchor.MiddleRight;
layout.childControlHeight = true;
layout.childControlWidth = false;
layout.childForceExpandWidth = false;
panelObj.GetComponent<WindowDragger>().windowTransform = transform.gameObject.GetComponent<RectTransform>();
panelObj.GetComponent<WindowDragger>().enabled = true;
CreateCircleButton(panelObj.transform, 0);
GameObject hide = CreateCircleButton(panelObj.transform, 1);
hide.GetComponent<Button>().onClick.AddListener(Hide);
GameObject full = CreateCircleButton(panelObj.transform, 2);
full.GetComponent<Button>().onClick.AddListener(Fullscreen);
}
GameObject CreateCircleButton(Transform parent, int index)
{
GameObject btnObj = new GameObject("Button_" + index, typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Button));
btnObj.transform.SetParent(parent, false);
RectTransform rect = btnObj.GetComponent<RectTransform>();
rect.sizeDelta = new Vector2(16, 16);
Image img = btnObj.GetComponent<Image>();
img.sprite = circleSprite;
if (index == 0) img.color = Color.red;
else if (index == 1) img.color = Color.yellow;
else img.color = Color.green;
return btnObj;
}
void Update()
{
if (!fullscreen)
{
RectTransform rect = transform.GetComponent<RectTransform>();
rect.sizeDelta = sizeDelta;
rect.anchoredPosition = anchoredPosition;
}
if (!active)
{
detectPanel.SetActive(true);
}
else
{
detectPanel.SetActive(false);
}
}
public void OnDetectClicked()
{
LayerController layerController = GetComponentInParent<LayerController>();
if (layerController != null)
{
layerController.ChangeLayerActive(layer);
}
}
public void Hide()
{
LayerController layerController = GetComponentInParent<LayerController>();
if (layerController != null)
{
layerController.SetLayerInactive(layer);
}
}
public void Show()
{
LayerController layerController = GetComponentInParent<LayerController>();
if (layerController != null)
{
layerController.SetLayerActive(layer);
}
}
public void Fullscreen()
{
Show();
RectTransform rect = transform.GetComponent<RectTransform>();
if (fullscreen)
{
fullscreen = false;
rect.anchorMin = new Vector2(0.5f, 0.5f);
rect.anchorMax = new Vector2(0.5f, 0.5f);
rect.offsetMin = lastOffsetMin;
rect.offsetMax = lastOffsetMax;
}
else
{
fullscreen = true;
lastOffsetMin = rect.offsetMin;
lastOffsetMax = rect.offsetMax;
rect.anchorMin = new Vector2(0, 0);
rect.anchorMax = new Vector2(1, 1);
rect.offsetMin = new Vector2(0, 40);
rect.offsetMax = new Vector2(0, 0);
}
}
}