196 lines
5.4 KiB
C#
196 lines
5.4 KiB
C#
#nullable enable
|
|
using System;
|
|
using UnityEngine.UIElements;
|
|
|
|
namespace UVC.UIToolkit
|
|
{
|
|
/// <summary>
|
|
/// 날짜 속성 아이템
|
|
/// TextField + UTKDatePicker 연동
|
|
/// </summary>
|
|
public class UTKDatePropertyItem : UTKPropertyItemBase<DateTime>
|
|
{
|
|
#region Fields
|
|
private TextField? _dateField;
|
|
private Button? _pickerButton;
|
|
private UTKDatePicker? _currentPicker;
|
|
private string _dateFormat = "yyyy-MM-dd";
|
|
#endregion
|
|
|
|
#region Properties
|
|
public override UTKPropertyType PropertyType => UTKPropertyType.Date;
|
|
|
|
/// <summary>날짜 표시 형식</summary>
|
|
public string DateFormat
|
|
{
|
|
get => _dateFormat;
|
|
set
|
|
{
|
|
_dateFormat = value ?? "yyyy-MM-dd";
|
|
RefreshUI();
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region Constructor
|
|
public UTKDatePropertyItem(string id, string name, DateTime initialValue = default)
|
|
: base(id, name, initialValue == default ? DateTime.Today : initialValue)
|
|
{
|
|
}
|
|
#endregion
|
|
|
|
#region Override Methods
|
|
public override VisualElement CreateUI()
|
|
{
|
|
var container = CreateContainer();
|
|
|
|
var label = CreateNameLabel();
|
|
container.Add(label);
|
|
|
|
var valueContainer = new VisualElement();
|
|
valueContainer.AddToClassList("utk-property-item__value");
|
|
|
|
_dateField = new TextField();
|
|
_dateField.name = "date-field";
|
|
_dateField.value = Value.ToString(_dateFormat);
|
|
_dateField.style.flexGrow = 1;
|
|
valueContainer.Add(_dateField);
|
|
|
|
_pickerButton = new Button();
|
|
_pickerButton.name = "picker-btn";
|
|
_pickerButton.text = "...";
|
|
_pickerButton.AddToClassList("utk-property-item__picker-btn");
|
|
valueContainer.Add(_pickerButton);
|
|
|
|
container.Add(valueContainer);
|
|
|
|
return container;
|
|
}
|
|
|
|
public override void BindUI(VisualElement element)
|
|
{
|
|
base.BindUI(element);
|
|
|
|
_dateField = element.Q<TextField>("date-field");
|
|
_pickerButton = element.Q<Button>("picker-btn");
|
|
|
|
if (_dateField != null)
|
|
{
|
|
_dateField.value = Value.ToString(_dateFormat);
|
|
_dateField.SetEnabled(!IsReadOnly);
|
|
_dateField.RegisterValueChangedCallback(OnDateTextChanged);
|
|
}
|
|
|
|
if (_pickerButton != null)
|
|
{
|
|
_pickerButton.SetEnabled(!IsReadOnly);
|
|
_pickerButton.clicked += OnPickerButtonClicked;
|
|
}
|
|
}
|
|
|
|
public override void UnbindUI(VisualElement element)
|
|
{
|
|
if (_dateField != null)
|
|
{
|
|
_dateField.UnregisterValueChangedCallback(OnDateTextChanged);
|
|
_dateField = null;
|
|
}
|
|
|
|
if (_pickerButton != null)
|
|
{
|
|
_pickerButton.clicked -= OnPickerButtonClicked;
|
|
_pickerButton = null;
|
|
}
|
|
|
|
ClosePicker();
|
|
|
|
base.UnbindUI(element);
|
|
}
|
|
|
|
public override void RefreshUI()
|
|
{
|
|
if (_dateField != null)
|
|
{
|
|
var formatted = Value.ToString(_dateFormat);
|
|
if (_dateField.value != formatted)
|
|
{
|
|
_dateField.SetValueWithoutNotify(formatted);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void UpdateReadOnlyState()
|
|
{
|
|
base.UpdateReadOnlyState();
|
|
|
|
_dateField?.SetEnabled(!IsReadOnly);
|
|
_pickerButton?.SetEnabled(!IsReadOnly);
|
|
}
|
|
#endregion
|
|
|
|
#region Private Methods
|
|
private void OnPickerButtonClicked()
|
|
{
|
|
OpenPicker();
|
|
}
|
|
|
|
private void OpenPicker()
|
|
{
|
|
if (_currentPicker != null || _rootElement == null) return;
|
|
|
|
var root = _rootElement;
|
|
while (root.parent != null)
|
|
{
|
|
root = root.parent;
|
|
}
|
|
|
|
_currentPicker = UTKDatePicker.Show(root, Value, UTKDatePicker.PickerMode.DateOnly, Name);
|
|
_currentPicker.OnDateSelected += OnPickerDateSelected;
|
|
_currentPicker.OnClosed += OnPickerClosed;
|
|
}
|
|
|
|
private void ClosePicker()
|
|
{
|
|
if (_currentPicker != null)
|
|
{
|
|
_currentPicker.OnDateSelected -= OnPickerDateSelected;
|
|
_currentPicker.OnClosed -= OnPickerClosed;
|
|
_currentPicker.Dispose();
|
|
_currentPicker = null;
|
|
}
|
|
}
|
|
|
|
private void OnPickerDateSelected(DateTime date)
|
|
{
|
|
Value = date.Date;
|
|
ClosePicker();
|
|
}
|
|
|
|
private void OnPickerClosed()
|
|
{
|
|
_currentPicker = null;
|
|
}
|
|
|
|
private void OnDateTextChanged(ChangeEvent<string> evt)
|
|
{
|
|
if (DateTime.TryParse(evt.newValue, out DateTime date))
|
|
{
|
|
DebounceValueChange(date.Date, 500).Forget();
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region IDisposable
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if (disposing)
|
|
{
|
|
ClosePicker();
|
|
}
|
|
|
|
base.Dispose(disposing);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|