Files
5.24BuYu/Assets/Plugins/ImageCropper/Scripts/SelectionMovementHandler.cs
T

116 lines
3.0 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
using Direction = ImageCropper.Direction;
namespace ImageCropperNamespace
{
public class SelectionMovementHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, ISelectionHandler
{
private const float SCROLL_DISTANCE = 5f;
[SerializeField]
private ImageCropper manager;
private RectTransform selection;
private Vector2 initialPosition;
private Vector2 initialTouchPosition;
private int draggingPointer;
private void Awake()
{
selection = manager.Selection;
}
private void OnDisable()
{
manager.StopModifySelectionWith( this );
}
public void OnBeginDrag( PointerEventData eventData )
{
if( !manager.CanModifySelectionWith( this ) )
{
eventData.pointerDrag = null;
return;
}
draggingPointer = eventData.pointerId;
initialPosition = selection.anchoredPosition;
initialTouchPosition = manager.GetTouchPosition( eventData.pressPosition, eventData.pressEventCamera );
}
public void OnDrag( PointerEventData eventData )
{
if( eventData.pointerId != draggingPointer )
{
eventData.pointerDrag = null;
return;
}
manager.UpdateSelection( initialPosition + manager.GetTouchPosition( eventData.position, eventData.pressEventCamera ) - initialTouchPosition );
}
public void OnEndDrag( PointerEventData eventData )
{
if( eventData.pointerId == draggingPointer )
manager.StopModifySelectionWith( this );
}
public void OnUpdate()
{
bool shouldUpdateViewport = false;
float scale = manager.ImageHolder.localScale.z;
Vector2 imagePosition = manager.ImageHolder.anchoredPosition;
Vector2 selectionBottomLeft = imagePosition + selection.anchoredPosition * scale;
Vector2 selectionTopRight = selectionBottomLeft + selection.sizeDelta * scale;
Vector2 selectionSize = selectionTopRight - selectionBottomLeft;
Vector2 viewportSize = manager.ViewportSize;
if( selectionBottomLeft.x <= SCROLL_DISTANCE )
{
imagePosition = manager.ScrollImage( imagePosition, Direction.Left );
selectionBottomLeft.x = 0f;
shouldUpdateViewport = true;
}
else if( selectionTopRight.x >= viewportSize.x - SCROLL_DISTANCE )
{
imagePosition = manager.ScrollImage( imagePosition, Direction.Right );
selectionBottomLeft.x = viewportSize.x - selectionSize.x;
shouldUpdateViewport = true;
}
if( selectionBottomLeft.y <= SCROLL_DISTANCE )
{
imagePosition = manager.ScrollImage( imagePosition, Direction.Bottom );
selectionBottomLeft.y = 0f;
shouldUpdateViewport = true;
}
else if( selectionTopRight.y >= viewportSize.y - SCROLL_DISTANCE )
{
imagePosition = manager.ScrollImage( imagePosition, Direction.Top );
selectionBottomLeft.y = viewportSize.y - selectionSize.y;
shouldUpdateViewport = true;
}
if( shouldUpdateViewport )
{
manager.ImageHolder.anchoredPosition = imagePosition;
manager.UpdateSelection( ( selectionBottomLeft - imagePosition ) / scale );
}
}
public void Stop()
{
draggingPointer--;
}
}
}