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; | |||
|  |         } | |||
|  |     } | |||
|  | } |