#nullable enable
using System;
using UnityEngine.UIElements;
namespace UVC.UIToolkit
{
///
/// 열거형 속성 아이템
/// UTKEnumDropDown을 사용한 열거형 선택
///
public class UTKEnumPropertyItem : UTKPropertyItemBase
{
#region Fields
private UTKEnumDropDown? _enumDropdown;
private Type _enumType;
#endregion
#region Properties
public override UTKPropertyType PropertyType => UTKPropertyType.Enum;
/// 열거형 타입
public Type EnumType => _enumType;
#endregion
#region Constructor
public UTKEnumPropertyItem(string id, string name, Enum initialValue, bool isReadOnly = false)
: base(id, name, initialValue ?? throw new ArgumentNullException(nameof(initialValue)))
{
_enumType = initialValue.GetType();
base._isReadOnly = isReadOnly;
}
#endregion
#region Override Methods
public override VisualElement CreateUI()
{
var container = CreateUIFromUxml("UTKEnumPropertyItem");
if (container == null)
{
return CreateUIFallback();
}
_enumDropdown = container.Q("enum-dropdown");
if (_enumDropdown != null)
{
_enumDropdown.Init(Value);
_enumDropdown.IsEnabled = !IsReadOnly;
}
return container;
}
private VisualElement CreateUIFallback()
{
var container = CreateContainer();
var label = CreateNameLabel();
container.Add(label);
var valueContainer = new VisualElement();
valueContainer.AddToClassList("utk-property-item__value");
_enumDropdown = new UTKEnumDropDown();
_enumDropdown.name = "enum-dropdown";
_enumDropdown.Init(Value);
_enumDropdown.IsEnabled = !IsReadOnly;
valueContainer.Add(_enumDropdown);
container.Add(valueContainer);
return container;
}
public override void BindUI(VisualElement element)
{
base.BindUI(element);
_enumDropdown = element.Q("enum-dropdown");
if (_enumDropdown != null)
{
_enumDropdown.Value = Value;
_enumDropdown.IsEnabled = !IsReadOnly;
_enumDropdown.OnValueChanged += OnEnumDropdownChanged;
}
}
public override void UnbindUI(VisualElement element)
{
if (_enumDropdown != null)
{
_enumDropdown.OnValueChanged -= OnEnumDropdownChanged;
_enumDropdown = null;
}
base.UnbindUI(element);
}
public override void RefreshUI()
{
if (_enumDropdown != null && _enumDropdown.Value != Value)
{
_enumDropdown.Value = Value;
}
}
protected override void UpdateReadOnlyState()
{
base.UpdateReadOnlyState();
if (_enumDropdown != null)
{
_enumDropdown.IsEnabled = !IsReadOnly;
}
}
#endregion
#region Private Methods
private void OnEnumDropdownChanged(Enum? newValue)
{
if (newValue != null)
{
Value = newValue;
}
}
#endregion
}
}