Add quick interactions locally
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user