// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.Toolkit.Utilities.Editor;
using UnityEngine;
using UnityEngine.Events;
namespace Microsoft.MixedReality.Toolkit.UI
{
///
/// Basic hold event receiver
///
[AddComponentMenu("Scripts/MRTK/SDK/InteractableOnHoldReceiver")]
public class InteractableOnHoldReceiver : ReceiverBase
{
///
/// The amount of time to press before triggering event
///
[InspectorField(Type = InspectorField.FieldTypes.Float, Label = "Hold Time", Tooltip = "The amount of time to press before triggering event")]
public float HoldTime = 1f;
private float clickTimer = 0;
private bool hasDown;
///
/// Invoked when interactable has been pressed for HoldTime
///
public UnityEvent OnHold => uEvent;
///
/// Creates receiver that raises OnHold events
///
public InteractableOnHoldReceiver(UnityEvent ev) : base(ev, "OnHold") { }
///
/// Creates receiver that raises OnHold events
///
public InteractableOnHoldReceiver() : this(new UnityEvent()) { }
///
public override void OnUpdate(InteractableStates state, Interactable source)
{
if (state.GetState(InteractableStates.InteractableStateEnum.Pressed).Value > 0 && !hasDown)
{
hasDown = true;
clickTimer = 0;
}
else if (state.GetState(InteractableStates.InteractableStateEnum.Pressed).Value < 1)
{
hasDown = false;
}
if (hasDown && clickTimer < HoldTime)
{
clickTimer += Time.deltaTime;
if (clickTimer >= HoldTime)
{
uEvent.Invoke();
}
}
}
}
}