LMQT/Assets/TouchScript/Scripts/Behaviors/UI/OverHelper.cs
2024-12-10 09:03:45 +08:00

146 lines
4.8 KiB
C#

/*
* @author Valentin Simonov / http://va.lent.in/
*/
using System;
using System.Collections.Generic;
using TouchScript.Pointers;
using TouchScript.Utils;
using UnityEngine;
namespace TouchScript.Behaviors.UI
{
/// <summary>
/// This component listens for pointer events and dispatches <see cref="Over"/> event when the first touch enters the area of the GameObject it is attached to and <see cref="Out"/> event when the last touch leaves it.
/// </summary>
[AddComponentMenu("TouchScript/Behaviors/OverHelper")]
[HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Behaviors_UI_OverHelper.htm")]
public class OverHelper : MonoBehaviour
{
#region Events
/// <summary>
/// Occurs when the first (non-pressed) touch enters the area of the GameObject.
/// </summary>
public event EventHandler Over;
/// <summary>
/// Occurs when the last touch leaves the area of the GameObject.
/// </summary>
public event EventHandler Out;
#endregion
#region Private variable
private HashSet<int> pointers = new HashSet<int>();
#endregion
#region Unity methods
private void OnEnable()
{
TouchManager.Instance.PointersAdded += pointersAddedHandler;
TouchManager.Instance.PointersUpdated += pointersUpdatedHandler;
TouchManager.Instance.PointersReleased += pointersReleasedHandler;
TouchManager.Instance.PointersRemoved += pointersRemovedHandler;
TouchManager.Instance.PointersCancelled += pointersRemovedHandler;
}
private void OnDisable()
{
if (TouchManager.Instance == null) return;
TouchManager.Instance.PointersAdded -= pointersAddedHandler;
TouchManager.Instance.PointersUpdated -= pointersUpdatedHandler;
TouchManager.Instance.PointersReleased -= pointersReleasedHandler;
TouchManager.Instance.PointersRemoved -= pointersRemovedHandler;
TouchManager.Instance.PointersCancelled -= pointersRemovedHandler;
}
#endregion
#region Private functions
private void dispatchOver()
{
if (Over != null) Over.InvokeHandleExceptions(this, EventArgs.Empty);
}
private void dispatchOut()
{
if (Out != null) Out.InvokeHandleExceptions(this, EventArgs.Empty);
}
#endregion
#region Callbacks
private void pointersAddedHandler(object sender, PointerEventArgs pointerEventArgs)
{
var over = pointers.Count;
var p = pointerEventArgs.Pointers;
var count = p.Count;
for (var i = 0; i < count; i++)
{
var pointer = p[i];
if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id);
}
if (over == 0 && pointers.Count > 0) dispatchOver();
}
private void pointersUpdatedHandler(object sender, PointerEventArgs pointerEventArgs)
{
var over = pointers.Count;
var p = pointerEventArgs.Pointers;
var count = p.Count;
for (var i = 0; i < count; i++)
{
var pointer = p[i];
if ((pointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0) continue; // we ignore pressed pointers
if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id);
else pointers.Remove(pointer.Id);
}
if (over == 0 && pointers.Count > 0) dispatchOver();
else if (over > 0 && pointers.Count == 0) dispatchOut();
}
private void pointersReleasedHandler(object sender, PointerEventArgs pointerEventArgs)
{
var over = pointers.Count;
var p = pointerEventArgs.Pointers;
var count = p.Count;
for (var i = 0; i < count; i++)
{
var pointer = p[i];
if (PointerUtils.IsPointerOnTarget(pointer, transform)) pointers.Add(pointer.Id);
else pointers.Remove(pointer.Id);
}
if (over == 0 && pointers.Count > 0) dispatchOver();
else if (over > 0 && pointers.Count == 0) dispatchOut();
}
private void pointersRemovedHandler(object sender, PointerEventArgs pointerEventArgs)
{
var over = pointers.Count;
var p = pointerEventArgs.Pointers;
var count = p.Count;
for (var i = 0; i < count; i++)
{
var pointer = p[i];
pointers.Remove(pointer.Id);
}
if (over > 0 && pointers.Count == 0) dispatchOut();
}
#endregion
}
}