Files
XRLib/Assets/Scripts/UVC/UIToolkit/Property/Items/UTKVector3PropertyItem.cs
2026-02-02 19:33:27 +09:00

122 lines
3.3 KiB
C#

#nullable enable
using UnityEngine;
using UnityEngine.UIElements;
namespace UVC.UIToolkit
{
/// <summary>
/// 3D 벡터 속성 아이템
/// UTKVector3Field 사용
/// </summary>
public class UTKVector3PropertyItem : UTKPropertyItemBase<Vector3>
{
#region Fields
private UTKVector3Field? _vectorField;
#endregion
#region Properties
public override UTKPropertyType PropertyType => UTKPropertyType.Vector3;
#endregion
#region Constructor
public UTKVector3PropertyItem(string id, string name, Vector3 initialValue = default)
: base(id, name, initialValue)
{
}
#endregion
#region Override Methods
public override VisualElement CreateUI()
{
var container = CreateUIFromUxml("UTKVector3PropertyItem");
if (container == null)
{
return CreateUIFallback();
}
_vectorField = container.Q<UTKVector3Field>("value-field");
if (_vectorField != null)
{
_vectorField.Value = Value;
_vectorField.label = "";
}
return container;
}
private VisualElement CreateUIFallback()
{
var container = CreateContainer();
var label = CreateNameLabel();
container.Add(label);
var valueContainer = new VisualElement();
valueContainer.AddToClassList("utk-property-item__value");
_vectorField = new UTKVector3Field();
_vectorField.name = "value-field";
_vectorField.label = "";
_vectorField.Value = Value;
_vectorField.AddToClassList("utk-property-item__vector3-field");
valueContainer.Add(_vectorField);
container.Add(valueContainer);
return container;
}
public override void BindUI(VisualElement element)
{
base.BindUI(element);
_vectorField = element.Q<UTKVector3Field>("value-field");
if (_vectorField != null)
{
_vectorField.Value = Value;
_vectorField.label = "";
_vectorField.IsEnabled = !IsReadOnly;
_vectorField.OnValueChanged += OnVectorChanged;
}
}
public override void UnbindUI(VisualElement element)
{
if (_vectorField != null)
{
_vectorField.OnValueChanged -= OnVectorChanged;
_vectorField = null;
}
base.UnbindUI(element);
}
public override void RefreshUI()
{
if (_vectorField != null && _vectorField.Value != Value)
{
_vectorField.SetValueWithoutNotify(Value);
}
}
protected override void UpdateReadOnlyState()
{
base.UpdateReadOnlyState();
if (_vectorField != null)
{
_vectorField.IsEnabled = !IsReadOnly;
}
}
#endregion
#region Private Methods
private void OnVectorChanged(Vector3 newValue)
{
DebounceValueChange(newValue, 100).Forget();
}
#endregion
}
}