#nullable enable using UnityEngine.UIElements; namespace UVC.UIToolkit { /// /// 문자열 속성 아이템 /// TextField를 사용한 텍스트 입력 /// public class UTKStringPropertyItem : UTKPropertyItemBase { #region Fields private UTKInputField? _inputField; private bool _isMultiline; private int _maxLength; #endregion #region Properties public override UTKPropertyType PropertyType => UTKPropertyType.String; /// 멀티라인 모드 여부 public bool IsMultiline { get => _isMultiline; set { _isMultiline = value; if (_inputField != null) { _inputField.multiline = value; } } } /// 최대 문자 길이 (0 = 무제한) public int MaxLength { get => _maxLength; set { _maxLength = value; if (_inputField != null) { _inputField.maxLength = value; } } } #endregion #region Constructor public UTKStringPropertyItem(string id, string name, string initialValue = "") : base(id, name, initialValue ?? string.Empty) { } #endregion #region Override Methods public override VisualElement CreateUI() { var container = CreateUIFromUxml("UTKStringPropertyItem"); if (container == null) { return CreateUIFallback(); } _inputField = container.Q("value-field"); if (_inputField != null) { _inputField.Value = Value; _inputField.multiline = _isMultiline; if (_maxLength > 0) { _inputField.maxLength = _maxLength; } } return container; } private VisualElement CreateUIFallback() { var container = CreateContainer(); var label = CreateNameLabel(); container.Add(label); var valueContainer = new VisualElement(); valueContainer.AddToClassList("utk-property-item__value"); _inputField = new UTKInputField(); _inputField.name = "value-field"; _inputField.Value = Value; _inputField.multiline = _isMultiline; if (_maxLength > 0) { _inputField.maxLength = _maxLength; } valueContainer.Add(_inputField); container.Add(valueContainer); return container; } public override void BindUI(VisualElement element) { base.BindUI(element); _inputField = element.Q("value-field"); if (_inputField != null) { _inputField.Value = Value; _inputField.SetEnabled(!IsReadOnly); _inputField.OnValueChanged += OnTextChanged; } } public override void UnbindUI(VisualElement element) { if (_inputField != null) { _inputField.OnValueChanged -= OnTextChanged; _inputField = null; } base.UnbindUI(element); } public override void RefreshUI() { if (_inputField != null && _inputField.Value != Value) { _inputField.SetValue(Value, false); } } protected override void UpdateReadOnlyState() { base.UpdateReadOnlyState(); if (_inputField != null) { _inputField.SetEnabled(!IsReadOnly); } } #endregion #region Private Methods private void OnTextChanged(string newValue) { DebounceValueChange(newValue).Forget(); } #endregion } }