BITKit/Src/Unity/Scripts/UX/Input/OnScreenButton.cs

115 lines
3.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace BITKit.UX
{
public class OnScreenButton : OnScreenControl
{
public new class UxmlTraits : VisualElement.UxmlTraits
{
private readonly UxmlFloatAttributeDescription m_PressedValueAttribute = new ()
{
name = "PressedValue",
defaultValue = 1f,
};
private readonly UxmlBoolAttributeDescription m_ReleasePressAttribute = new()
{
name = "ReleasePress"
};
public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
{
base.Init(ve, bag, cc);
var table = (OnScreenButton)ve;
table.PressedValue = m_PressedValueAttribute.GetValueFromBag(bag, cc);
table.ReleasePress = m_ReleasePressAttribute.GetValueFromBag(bag, cc);
}
}
public new class UxmlFactory : UxmlFactory<OnScreenButton, UxmlTraits> { }
public float PressedValue { get; set; }= 1f;
public bool ReleasePress { get; set; }
private bool _isPressed;
private int _pointerId=-1;
private Label _label;
private readonly ValidHandle _isTriggered = new();
public OnScreenButton()
{
RegisterCallback<PointerUpEvent>(OnPointerUp);
RegisterCallback<PointerDownEvent>(OnPointerDown);
RegisterCallback<PointerMoveEvent>(OnPointerMove);
this.AddManipulator(new Clickable(OnClick));
_label = this.Create<Label>();
_isTriggered.AddListener(x =>
{
if (x)
{
AddToClassList("selected");
}
else
{
RemoveFromClassList("selected");
}
var value = x?PressedValue : 0f;
SendValueToControl( value);
});
}
private void OnClick()
{
}
private void OnPointerMove(PointerMoveEvent evt)
{
if(_pointerId!=evt.pointerId)return;
if (ReleasePress)
{
_isPressed = true;
return;
}
if (_isPressed is false)
{
_isTriggered.AddElement(0);
_isPressed = true;
;
}
}
private void OnPointerDown(PointerDownEvent evt)
{
if(_pointerId is not -1)return;
_pointerId = evt.pointerId;
_isPressed = true;
_isTriggered.AddElement(0);
}
private void OnPointerUp(PointerUpEvent evt)
{
if(_pointerId!=evt.pointerId)return;
if (ReleasePress && _isPressed)
{
_isTriggered.AddElement(0);
_pointerId = -1;
return;
}
_pointerId = -1;
_isTriggered.RemoveElement(0);
}
protected override string ControlPathInternal { get; set; }
}
}