namespace XFEEDToolBox.Core.Galaxy;
/// <summary>Separates a deliberate star hold from camera dragging, using a monotonic clock.</summary>
public sealed class StarHoldGesture
{
public const double HoldMilliseconds=600,MovementTolerance=6;
private double x,y,started;
private bool pending;
public void Begin(double atX,double atY,double milliseconds,bool canChoose)
{
x=atX;y=atY;started=milliseconds;
pending=canChoose&&double.IsFinite(x)&&double.IsFinite(y)&&double.IsFinite(started);
}
public void Move(double atX,double atY)
{
if(!double.IsFinite(atX)||!double.IsFinite(atY)||Math.Pow(atX-x,2)+Math.Pow(atY-y,2)>MovementTolerance*MovementTolerance)pending=false;
}
public bool TryConfirm(double milliseconds)
{
if(!pending||!double.IsFinite(milliseconds)||milliseconds-started<HoldMilliseconds)return false;
pending=false;return true;
}
public void Cancel()=>pending=false;
public double Progress(double milliseconds)=>pending&&double.IsFinite(milliseconds)?Math.Clamp((milliseconds-started)/HoldMilliseconds,0,1):0;
}
namespace XFEEDToolBox.Core.Galaxy;
/// <summary>Separates a deliberate star hold from camera dragging, using a monotonic clock.</summary>
public sealed class StarHoldGesture
{
public const double HoldMilliseconds=600,MovementTolerance=6;
private double x,y,started;
private bool pending;
public void Begin(double atX,double atY,double milliseconds,bool canChoose)
{
x=atX;y=atY;started=milliseconds;
pending=canChoose&&double.IsFinite(x)&&double.IsFinite(y)&&double.IsFinite(started);
}
public void Move(double atX,double atY)
{
if(!double.IsFinite(atX)||!double.IsFinite(atY)||Math.Pow(atX-x,2)+Math.Pow(atY-y,2)>MovementTolerance*MovementTolerance)pending=false;
}
public bool TryConfirm(double milliseconds)
{
if(!pending||!double.IsFinite(milliseconds)||milliseconds-started<HoldMilliseconds)return false;
pending=false;return true;
}
public void Cancel()=>pending=false;
public double Progress(double milliseconds)=>pending&&double.IsFinite(milliseconds)?Math.Clamp((milliseconds-started)/HoldMilliseconds,0,1):0;
}