You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRF/Scripts/UI/DragHandle.cs

191 lines
4.9 KiB
C#

1 month ago
namespace SRF.UI
{
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DragHandle : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
private CanvasScaler _canvasScaler;
private float _delta;
private float _startValue;
public RectTransform.Axis Axis = RectTransform.Axis.Horizontal;
public bool Invert = false;
public float MaxSize = -1;
public LayoutElement TargetLayoutElement;
public RectTransform TargetRectTransform;
private float Mult
{
get { return Invert ? -1 : 1; }
}
public void OnBeginDrag(PointerEventData eventData)
{
if (!Verify())
{
return;
}
//Debug.Log("OnBeginDrag");
_startValue = GetCurrentValue();
_delta = 0;
}
public void OnDrag(PointerEventData eventData)
{
if (!Verify())
{
return;
}
//Debug.Log("OnDrag");
var delta = 0f;
if (Axis == RectTransform.Axis.Horizontal)
{
delta += eventData.delta.x;
}
else
{
delta += eventData.delta.y;
}
if (_canvasScaler != null)
{
delta /= _canvasScaler.scaleFactor;
}
delta *= Mult;
_delta += delta;
SetCurrentValue(Mathf.Clamp(_startValue + _delta, GetMinSize(), GetMaxSize()));
}
public void OnEndDrag(PointerEventData eventData)
{
if (!Verify())
{
return;
}
//Debug.Log("OnEndDrag");
SetCurrentValue(Mathf.Max(_startValue + _delta, GetMinSize()));
_delta = 0;
CommitCurrentValue();
}
private void Start()
{
Verify();
_canvasScaler = GetComponentInParent<CanvasScaler>();
}
private bool Verify()
{
if (TargetLayoutElement == null && TargetRectTransform == null)
{
Debug.LogWarning(
"DragHandle: TargetLayoutElement and TargetRectTransform are both null. Disabling behaviour.");
enabled = false;
return false;
}
return true;
}
private float GetCurrentValue()
{
if (TargetLayoutElement != null)
{
return Axis == RectTransform.Axis.Horizontal
? TargetLayoutElement.preferredWidth
: TargetLayoutElement.preferredHeight;
}
if (TargetRectTransform != null)
{
return Axis == RectTransform.Axis.Horizontal
? TargetRectTransform.sizeDelta.x
: TargetRectTransform.sizeDelta.y;
}
throw new InvalidOperationException();
}
private void SetCurrentValue(float value)
{
if (TargetLayoutElement != null)
{
if (Axis == RectTransform.Axis.Horizontal)
{
TargetLayoutElement.preferredWidth = value;
}
else
{
TargetLayoutElement.preferredHeight = value;
}
return;
}
if (TargetRectTransform != null)
{
var d = TargetRectTransform.sizeDelta;
if (Axis == RectTransform.Axis.Horizontal)
{
d.x = value;
}
else
{
d.y = value;
}
TargetRectTransform.sizeDelta = d;
return;
}
throw new InvalidOperationException();
}
private void CommitCurrentValue()
{
if (TargetLayoutElement != null)
{
if (Axis == RectTransform.Axis.Horizontal)
{
TargetLayoutElement.preferredWidth = ((RectTransform) TargetLayoutElement.transform).sizeDelta.x;
}
else
{
TargetLayoutElement.preferredHeight = ((RectTransform) TargetLayoutElement.transform).sizeDelta.y;
}
}
}
private float GetMinSize()
{
if (TargetLayoutElement == null)
{
return 0;
}
return Axis == RectTransform.Axis.Horizontal ? TargetLayoutElement.minWidth : TargetLayoutElement.minHeight;
}
private float GetMaxSize()
{
if (MaxSize > 0)
{
return MaxSize;
}
return float.MaxValue;
}
}
}