namespace SRF.UI { using Internal; using UnityEngine; [AddComponentMenu(ComponentMenuPaths.LongPressButton)] public class LongPressButton : UnityEngine.UI.Button { private bool _handled; [SerializeField] private ButtonClickedEvent _onLongPress = new ButtonClickedEvent(); private bool _pressed; private float _pressedTime; public float LongPressDuration = 0.9f; public ButtonClickedEvent onLongPress { get { return _onLongPress; } set { _onLongPress = value; } } public override void OnPointerExit(UnityEngine.EventSystems.PointerEventData eventData) { base.OnPointerExit(eventData); _pressed = false; } public override void OnPointerDown(UnityEngine.EventSystems.PointerEventData eventData) { base.OnPointerDown(eventData); if (eventData.button != UnityEngine.EventSystems.PointerEventData.InputButton.Left) { return; } _pressed = true; _handled = false; _pressedTime = Time.realtimeSinceStartup; } public override void OnPointerUp(UnityEngine.EventSystems.PointerEventData eventData) { if (!_handled) { base.OnPointerUp(eventData); } _pressed = false; } public override void OnPointerClick(UnityEngine.EventSystems.PointerEventData eventData) { if (!_handled) { base.OnPointerClick(eventData); } } private void Update() { if (!_pressed) { return; } if (Time.realtimeSinceStartup - _pressedTime >= LongPressDuration) { _pressed = false; _handled = true; onLongPress.Invoke(); } } } }