UTKIntPropertyItemView, UTKIntRangePropertyItemView UTKNumberStepper 적용
This commit is contained in:
@@ -15,14 +15,70 @@ namespace UVC.UIToolkit
|
||||
#region Fields
|
||||
private UTKIntegerField? _minField;
|
||||
private UTKIntegerField? _maxField;
|
||||
private UTKNumberStepper? _minStepper;
|
||||
private UTKNumberStepper? _maxStepper;
|
||||
|
||||
private UTKIntRange _value;
|
||||
private bool _useStepper;
|
||||
private int _stepperMinValue = int.MinValue;
|
||||
private int _stepperMaxValue = int.MaxValue;
|
||||
private int _stepperStep = 1;
|
||||
private IUTKPropertyItem<UTKIntRange>? _boundData;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
protected override string ViewTypeName => "UTKIntRangePropertyItemView";
|
||||
|
||||
/// <summary>스테퍼(증감 버튼) 사용 여부</summary>
|
||||
public bool UseStepper
|
||||
{
|
||||
get => _useStepper;
|
||||
set
|
||||
{
|
||||
if (_useStepper != value)
|
||||
{
|
||||
_useStepper = value;
|
||||
UpdateModeClass();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 최소값</summary>
|
||||
public int StepperMinValue
|
||||
{
|
||||
get => _stepperMinValue;
|
||||
set
|
||||
{
|
||||
_stepperMinValue = value;
|
||||
if (_minStepper != null) _minStepper.MinValue = value;
|
||||
if (_maxStepper != null) _maxStepper.MinValue = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 최대값</summary>
|
||||
public int StepperMaxValue
|
||||
{
|
||||
get => _stepperMaxValue;
|
||||
set
|
||||
{
|
||||
_stepperMaxValue = value;
|
||||
if (_minStepper != null) _minStepper.MaxValue = value;
|
||||
if (_maxStepper != null) _maxStepper.MaxValue = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 증감 단위</summary>
|
||||
public int StepperStep
|
||||
{
|
||||
get => _stepperStep;
|
||||
set
|
||||
{
|
||||
_stepperStep = Math.Max(1, value);
|
||||
if (_minStepper != null) _minStepper.Step = _stepperStep;
|
||||
if (_maxStepper != null) _maxStepper.Step = _stepperStep;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>현재 값</summary>
|
||||
public UTKIntRange Value
|
||||
{
|
||||
@@ -94,31 +150,57 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_minField = this.Q<UTKIntegerField>("min-field");
|
||||
_maxField = this.Q<UTKIntegerField>("max-field");
|
||||
_minStepper = this.Q<UTKNumberStepper>("min-stepper");
|
||||
_maxStepper = this.Q<UTKNumberStepper>("max-stepper");
|
||||
|
||||
// Fallback: UXML에서 못 찾으면 생성
|
||||
if (_valueContainer != null)
|
||||
{
|
||||
_valueContainer.style.flexDirection = FlexDirection.Row;
|
||||
|
||||
// IntegerField 생성
|
||||
if (_minField == null)
|
||||
{
|
||||
_minField = new UTKIntegerField { name = "min-field" };
|
||||
_minField.style.flexGrow = 1;
|
||||
_minField.AddToClassList("utk-property-item-view__field");
|
||||
_valueContainer.Add(_minField);
|
||||
|
||||
var separator = new UTKLabel("~", UTKLabel.LabelSize.Body2);
|
||||
separator.AddToClassList("utk-property-item-view__range-separator");
|
||||
_valueContainer.Add(separator);
|
||||
}
|
||||
|
||||
if (_maxField == null)
|
||||
{
|
||||
var separator = new UTKLabel("~", UTKLabel.LabelSize.Body2);
|
||||
separator.AddToClassList("utk-property-item-view__range-separator");
|
||||
_valueContainer.Add(separator);
|
||||
|
||||
_maxField = new UTKIntegerField { name = "max-field" };
|
||||
_maxField.style.flexGrow = 1;
|
||||
_maxField.AddToClassList("utk-property-item-view__field");
|
||||
_valueContainer.Add(_maxField);
|
||||
}
|
||||
|
||||
// NumberStepper 생성
|
||||
if (_minStepper == null)
|
||||
{
|
||||
_minStepper = new UTKNumberStepper(_stepperMinValue, _stepperMaxValue, _value.Min, _stepperStep, IsReadOnly)
|
||||
{
|
||||
name = "min-stepper"
|
||||
};
|
||||
_minStepper.style.flexGrow = 1;
|
||||
_minStepper.AddToClassList("utk-property-item-view__stepper");
|
||||
_valueContainer.Add(_minStepper);
|
||||
}
|
||||
|
||||
if (_maxStepper == null)
|
||||
{
|
||||
_maxStepper = new UTKNumberStepper(_stepperMinValue, _stepperMaxValue, _value.Max, _stepperStep, IsReadOnly)
|
||||
{
|
||||
name = "max-stepper"
|
||||
};
|
||||
_maxStepper.style.flexGrow = 1;
|
||||
_maxStepper.AddToClassList("utk-property-item-view__stepper");
|
||||
_valueContainer.Add(_maxStepper);
|
||||
}
|
||||
}
|
||||
|
||||
// 초기 값 설정
|
||||
@@ -132,6 +214,25 @@ namespace UVC.UIToolkit
|
||||
_maxField.SetValueWithoutNotify(_value.Max);
|
||||
_maxField.isReadOnly = IsReadOnly;
|
||||
}
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.MinValue = _stepperMinValue;
|
||||
_minStepper.MaxValue = _stepperMaxValue;
|
||||
_minStepper.Step = _stepperStep;
|
||||
_minStepper.SetValue(_value.Min, false);
|
||||
_minStepper.IsReadOnly = IsReadOnly;
|
||||
}
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.MinValue = _stepperMinValue;
|
||||
_maxStepper.MaxValue = _stepperMaxValue;
|
||||
_maxStepper.Step = _stepperStep;
|
||||
_maxStepper.SetValue(_value.Max, false);
|
||||
_maxStepper.IsReadOnly = IsReadOnly;
|
||||
}
|
||||
|
||||
// 컨트롤 가시성 업데이트
|
||||
UpdateControlVisibility();
|
||||
}
|
||||
|
||||
private void RegisterEvents()
|
||||
@@ -144,6 +245,14 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_maxField.OnValueChanged += OnMaxChanged;
|
||||
}
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.OnValueChanged += OnMinStepperChanged;
|
||||
}
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.OnValueChanged += OnMaxStepperChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void UnregisterEvents()
|
||||
@@ -156,6 +265,65 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_maxField.OnValueChanged -= OnMaxChanged;
|
||||
}
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.OnValueChanged -= OnMinStepperChanged;
|
||||
}
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.OnValueChanged -= OnMaxStepperChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateModeClass()
|
||||
{
|
||||
// ReadOnly 상태에서는 무조건 IntegerField만 표시
|
||||
if (IsReadOnly)
|
||||
{
|
||||
RemoveFromClassList("utk-property-item-view--stepper");
|
||||
UpdateControlVisibility();
|
||||
return;
|
||||
}
|
||||
|
||||
// 스테퍼 클래스
|
||||
if (_useStepper)
|
||||
{
|
||||
AddToClassList("utk-property-item-view--stepper");
|
||||
}
|
||||
else
|
||||
{
|
||||
RemoveFromClassList("utk-property-item-view--stepper");
|
||||
}
|
||||
|
||||
UpdateControlVisibility();
|
||||
}
|
||||
|
||||
/// <summary>컨트롤 가시성을 업데이트합니다.</summary>
|
||||
private void UpdateControlVisibility()
|
||||
{
|
||||
bool isReadOnlyMode = IsReadOnly;
|
||||
bool showStepper = !isReadOnlyMode && _useStepper;
|
||||
bool showIntField = isReadOnlyMode || !_useStepper;
|
||||
|
||||
if (_minField != null)
|
||||
{
|
||||
_minField.style.display = showIntField ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
if (_maxField != null)
|
||||
{
|
||||
_maxField.style.display = showIntField ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.style.display = showStepper ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.style.display = showStepper ? DisplayStyle.Flex : DisplayStyle.None;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -174,6 +342,11 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
if (_minField != null) _minField.isReadOnly = isReadOnly;
|
||||
if (_maxField != null) _maxField.isReadOnly = isReadOnly;
|
||||
if (_minStepper != null) _minStepper.IsReadOnly = isReadOnly;
|
||||
if (_maxStepper != null) _maxStepper.IsReadOnly = isReadOnly;
|
||||
|
||||
// ReadOnly 상태 변경 시 모드 클래스 업데이트
|
||||
UpdateModeClass();
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -207,6 +380,36 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnMinStepperChanged(int newMin)
|
||||
{
|
||||
var newValue = new UTKIntRange(newMin, _value.Max);
|
||||
if (!_value.Equals(newValue))
|
||||
{
|
||||
_value = newValue;
|
||||
OnValueChanged?.Invoke(newValue);
|
||||
|
||||
if (_boundData != null && !_boundData.Value.Equals(newValue))
|
||||
{
|
||||
_boundData.Value = newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnMaxStepperChanged(int newMax)
|
||||
{
|
||||
var newValue = new UTKIntRange(_value.Min, newMax);
|
||||
if (!_value.Equals(newValue))
|
||||
{
|
||||
_value = newValue;
|
||||
OnValueChanged?.Invoke(newValue);
|
||||
|
||||
if (_boundData != null && !_boundData.Value.Equals(newValue))
|
||||
{
|
||||
_boundData.Value = newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Value Update
|
||||
@@ -221,6 +424,16 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_maxField.SetValueWithoutNotify(_value.Max);
|
||||
}
|
||||
|
||||
if (_minStepper != null && _minStepper.Value != _value.Min)
|
||||
{
|
||||
_minStepper.SetValue(_value.Min, false);
|
||||
}
|
||||
|
||||
if (_maxStepper != null && _maxStepper.Value != _value.Max)
|
||||
{
|
||||
_maxStepper.SetValue(_value.Max, false);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -249,6 +462,31 @@ namespace UVC.UIToolkit
|
||||
IsVisible = data.IsVisible;
|
||||
TooltipText = data.Tooltip;
|
||||
|
||||
// UTKIntRangePropertyItem의 스테퍼 설정 적용
|
||||
if (data is UTKIntRangePropertyItem rangeItem)
|
||||
{
|
||||
_useStepper = rangeItem.UseStepper;
|
||||
_stepperMinValue = rangeItem.StepperMinValue;
|
||||
_stepperMaxValue = rangeItem.StepperMaxValue;
|
||||
_stepperStep = rangeItem.StepperStep;
|
||||
|
||||
// 스테퍼에 값 적용
|
||||
if (_minStepper != null)
|
||||
{
|
||||
_minStepper.MinValue = _stepperMinValue;
|
||||
_minStepper.MaxValue = _stepperMaxValue;
|
||||
_minStepper.Step = _stepperStep;
|
||||
}
|
||||
if (_maxStepper != null)
|
||||
{
|
||||
_maxStepper.MinValue = _stepperMinValue;
|
||||
_maxStepper.MaxValue = _stepperMaxValue;
|
||||
_maxStepper.Step = _stepperStep;
|
||||
}
|
||||
|
||||
UpdateModeClass();
|
||||
}
|
||||
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
|
||||
UpdateValueUI();
|
||||
@@ -287,6 +525,8 @@ namespace UVC.UIToolkit
|
||||
OnValueChanged = null;
|
||||
_minField = null;
|
||||
_maxField = null;
|
||||
_minStepper = null;
|
||||
_maxStepper = null;
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
|
||||
Reference in New Issue
Block a user