191 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| 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;
 | |
|         }
 | |
|     }
 | |
| }
 |