1
This commit is contained in:
115
Src/Unity/Scripts/UX/Input/OnScreenButton.cs
Normal file
115
Src/Unity/Scripts/UX/Input/OnScreenButton.cs
Normal file
@@ -0,0 +1,115 @@
|
||||
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; }
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user