115 lines
3.3 KiB
C#
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; }
|
|
}
|
|
} |