Aetheria/Assets/Scripts/UI/FlatFlatButton.cs
hyperion51 1e2b474fc1 Various Fixes
Newly created drones now register their origin colony correctly
Hauling behavior fixed for multiple items
Buttons can't be dragged unless explicitly enabled
Inspecting a colony with lots of compound commodities no longer sets your computer on fire
2020-07-03 01:33:42 +01:00

122 lines
No EOL
3.8 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class FlatFlatButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public event Action<PointerEventData> OnClick;
public float StateDamping;
// public RectTransform Tab;
public Image Fill;
public TextMeshProUGUI Label;
public FlatButtonState CurrentState = FlatButtonState.Unselected;
public bool DisableClickWhenSelected = true;
public RectTransform DragObject;
public Color UnselectedColor;
public Color SelectedColor;
public Color HoverColor;
public Color ClickColor;
public Color DisabledColor;
public Color EnabledTextColor;
public Color DisabledTextColor;
public Func<PointerEventData, bool> DragSuccess;
private int _siblingIndex;
private Transform _dragParent;
private Vector3 _dragPositionOffset;
public void OnPointerEnter(PointerEventData eventData)
{
if (OnClick != null && CurrentState == FlatButtonState.Unselected)
CurrentState = FlatButtonState.Hover;
}
public void OnPointerExit(PointerEventData eventData)
{
if (CurrentState == FlatButtonState.Hover)
CurrentState = FlatButtonState.Unselected;
}
public void OnPointerClick(PointerEventData eventData)
{
if (CurrentState != FlatButtonState.Disabled && (!DisableClickWhenSelected || CurrentState != FlatButtonState.Selected))
{
if (OnClick != null)
{
Fill.color = ClickColor;
OnClick(eventData);
}
}
}
public void OnBeginDrag(PointerEventData eventData)
{
if (DragSuccess == null || DragObject == null)
{
eventData.pointerDrag = null;
return;
}
var canvas = gameObject.FindInParents<Canvas>();
if (canvas == null)
return;
_siblingIndex = DragObject.GetSiblingIndex();
_dragParent = DragObject.parent;
DragObject.SetParent(canvas.transform, true);
_dragPositionOffset = DragObject.position - (Vector3)eventData.position;
DragObject.SetAsLastSibling();
}
public void OnDrag(PointerEventData eventData)
{
var targetPosition = (Vector3)eventData.position + _dragPositionOffset;
//Debug.Log($"Moving drag object to {targetPosition}");
DragObject.position = targetPosition;
}
public void OnEndDrag(PointerEventData eventData)
{
if(DragSuccess(eventData))
Destroy(DragObject.gameObject);
else
{
DragObject.parent = _dragParent;
DragObject.SetSiblingIndex(_siblingIndex);
}
}
private void Update()
{
Color appearance;
switch (CurrentState)
{
case FlatButtonState.Unselected:
appearance = UnselectedColor;
break;
case FlatButtonState.Selected:
appearance = SelectedColor;
break;
case FlatButtonState.Hover:
appearance = HoverColor;
break;
case FlatButtonState.Disabled:
appearance = DisabledColor;
break;
default:
appearance = Color.white;
break;
}
if (Label != null)
Label.color = Color.Lerp(Label.color,
CurrentState == FlatButtonState.Disabled ? DisabledTextColor : EnabledTextColor, StateDamping * Time.deltaTime);
Fill.color = Color.Lerp(Fill.color, appearance, StateDamping * Time.deltaTime);
}
}