Files
XRLib/Assets/Scripts/UVC/UIToolkit/Property/Items/UTKBoolPropertyItem.cs

120 lines
3.1 KiB
C#
Raw Normal View History

2026-01-08 20:15:57 +09:00
#nullable enable
using UnityEngine.UIElements;
2026-01-20 20:18:47 +09:00
namespace UVC.UIToolkit
2026-01-08 20:15:57 +09:00
{
/// <summary>
/// 불리언 속성 아이템
/// Toggle을 사용한 체크박스 형식
/// </summary>
public class UTKBoolPropertyItem : UTKPropertyItemBase<bool>
{
#region Fields
2026-02-02 19:33:27 +09:00
private UTKToggle? _toggle;
2026-01-08 20:15:57 +09:00
#endregion
#region Properties
public override UTKPropertyType PropertyType => UTKPropertyType.Bool;
#endregion
#region Constructor
2026-02-03 20:43:36 +09:00
public UTKBoolPropertyItem(string id, string name, bool initialValue = false, bool isReadOnly = false)
2026-01-08 20:15:57 +09:00
: base(id, name, initialValue)
{
2026-02-03 20:43:36 +09:00
base._isReadOnly = isReadOnly;
2026-01-08 20:15:57 +09:00
}
#endregion
#region Override Methods
public override VisualElement CreateUI()
2026-02-02 19:33:27 +09:00
{
var container = CreateUIFromUxml("UTKBoolPropertyItem");
if (container == null)
{
return CreateUIFallback();
}
_toggle = container.Q<UTKToggle>("value-field");
if (_toggle != null)
{
_toggle.IsOn = Value;
2026-02-03 20:43:36 +09:00
_toggle.IsInteractive = !IsReadOnly;
2026-02-02 19:33:27 +09:00
}
return container;
}
private VisualElement CreateUIFallback()
2026-01-08 20:15:57 +09:00
{
var container = CreateContainer();
var label = CreateNameLabel();
container.Add(label);
var valueContainer = new VisualElement();
valueContainer.AddToClassList("utk-property-item__value");
2026-02-02 19:33:27 +09:00
_toggle = new UTKToggle();
2026-01-08 20:15:57 +09:00
_toggle.name = "value-field";
2026-02-02 19:33:27 +09:00
_toggle.IsOn = Value;
2026-02-03 20:43:36 +09:00
_toggle.IsInteractive = !IsReadOnly;
2026-01-08 20:15:57 +09:00
valueContainer.Add(_toggle);
container.Add(valueContainer);
return container;
}
public override void BindUI(VisualElement element)
{
base.BindUI(element);
2026-02-02 19:33:27 +09:00
_toggle = element.Q<UTKToggle>("value-field");
2026-01-08 20:15:57 +09:00
if (_toggle != null)
{
2026-02-02 19:33:27 +09:00
_toggle.IsOn = Value;
2026-02-03 20:43:36 +09:00
_toggle.IsInteractive = !IsReadOnly;
2026-02-02 19:33:27 +09:00
_toggle.OnValueChanged += OnToggleChanged;
2026-01-08 20:15:57 +09:00
}
}
public override void UnbindUI(VisualElement element)
{
if (_toggle != null)
{
2026-02-02 19:33:27 +09:00
_toggle.OnValueChanged -= OnToggleChanged;
2026-01-08 20:15:57 +09:00
_toggle = null;
}
base.UnbindUI(element);
}
public override void RefreshUI()
{
2026-02-02 19:33:27 +09:00
if (_toggle != null && _toggle.IsOn != Value)
2026-01-08 20:15:57 +09:00
{
2026-02-02 19:33:27 +09:00
_toggle.SetOn(Value, false);
2026-01-08 20:15:57 +09:00
}
}
protected override void UpdateReadOnlyState()
{
base.UpdateReadOnlyState();
if (_toggle != null)
{
2026-02-03 20:43:36 +09:00
_toggle.IsInteractive = !IsReadOnly;
2026-01-08 20:15:57 +09:00
}
}
#endregion
#region Private Methods
2026-02-02 19:33:27 +09:00
private void OnToggleChanged(bool newValue)
2026-01-08 20:15:57 +09:00
{
// Toggle은 디바운스 없이 즉시 적용
2026-02-02 19:33:27 +09:00
Value = newValue;
2026-01-08 20:15:57 +09:00
}
#endregion
}
}