73 lines
2.0 KiB
C#
73 lines
2.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
|
|
using Barotrauma;
|
|
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Input;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
|
|
namespace QICrabUI
|
|
{
|
|
public class CUIDragHandle : ICUIVitalizable
|
|
{
|
|
public void SetHost(CUIComponent host) => Host = host;
|
|
public CUIComponent Host;
|
|
public Vector2 GrabOffset;
|
|
public bool Grabbed;
|
|
public bool Draggable;
|
|
public CUIMouseEvent Trigger = CUIMouseEvent.Down;
|
|
/// <summary>
|
|
/// If true, will change relative prop instead of Absolute
|
|
/// </summary>
|
|
public bool DragRelative { get; set; } = false;
|
|
public bool OutputRealPos { get; set; } = false;
|
|
|
|
public bool ShouldStart(CUIInput input)
|
|
{
|
|
return Draggable && (
|
|
(Trigger == CUIMouseEvent.Down && input.MouseDown) ||
|
|
(Trigger == CUIMouseEvent.DClick && input.DoubleClick)
|
|
);
|
|
}
|
|
public void BeginDrag(Vector2 cursorPos)
|
|
{
|
|
Grabbed = true;
|
|
GrabOffset = cursorPos - CUIAnchor.PosIn(Host);
|
|
}
|
|
|
|
public void EndDrag()
|
|
{
|
|
Grabbed = false;
|
|
Host.MainComponent?.OnDragEnd(this);
|
|
}
|
|
|
|
//TODO test in 3d child offset
|
|
public void DragTo(Vector2 to)
|
|
{
|
|
Vector2 pos = Host.Parent.ChildrenOffset.ToPlaneCoords(
|
|
to - GrabOffset - CUIAnchor.PosIn(Host.Parent.Real, Host.ParentAnchor ?? Host.Anchor)
|
|
);
|
|
|
|
if (DragRelative)
|
|
{
|
|
Vector2 newRelPos = new Vector2(
|
|
pos.X / Host.Parent.Real.Width,
|
|
pos.Y / Host.Parent.Real.Height
|
|
);
|
|
Host.CUIProps.Relative.SetValue(Host.Relative with { Position = newRelPos });
|
|
Host.InvokeOnDrag(newRelPos.X, newRelPos.Y);
|
|
}
|
|
else
|
|
{
|
|
Host.CUIProps.Absolute.SetValue(Host.Absolute with { Position = pos });
|
|
if (OutputRealPos) Host.InvokeOnDrag(to.X, to.Y);
|
|
else Host.InvokeOnDrag(pos.X, pos.Y);
|
|
}
|
|
}
|
|
|
|
public CUIDragHandle() { }
|
|
public CUIDragHandle(CUIComponent host) => Host = host;
|
|
}
|
|
} |