UTKIntPropertyItemView 수정중
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
|
||||
namespace UVC.UIToolkit
|
||||
{
|
||||
@@ -10,8 +11,10 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
#region Fields
|
||||
private bool _useSlider;
|
||||
private bool _useStepper;
|
||||
private int _minValue;
|
||||
private int _maxValue = 100;
|
||||
private int _step = 1;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
@@ -22,7 +25,31 @@ namespace UVC.UIToolkit
|
||||
public bool UseSlider
|
||||
{
|
||||
get => _useSlider;
|
||||
set => _useSlider = value;
|
||||
set
|
||||
{
|
||||
_useSlider = value;
|
||||
// UseSlider가 true이면 UseStepper는 false로
|
||||
if (value) _useStepper = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼(증감 버튼) 사용 여부</summary>
|
||||
public bool UseStepper
|
||||
{
|
||||
get => _useStepper;
|
||||
set
|
||||
{
|
||||
_useStepper = value;
|
||||
// UseStepper가 true이면 UseSlider는 false로
|
||||
if (value) _useSlider = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 증감 단위 (기본값: 1)</summary>
|
||||
public int Step
|
||||
{
|
||||
get => _step;
|
||||
set => _step = Math.Max(1, value);
|
||||
}
|
||||
|
||||
/// <summary>최소값 (슬라이더 모드)</summary>
|
||||
@@ -62,12 +89,13 @@ namespace UVC.UIToolkit
|
||||
/// <param name="maxValue">최대값</param>
|
||||
/// <param name="useSlider">슬라이더 사용 여부</param>
|
||||
/// <param name="isReadOnly">읽기 전용 여부</param>
|
||||
public UTKIntPropertyItem(string id, string name, int initialValue, int minValue, int maxValue, bool useSlider = true, bool isReadOnly = false)
|
||||
public UTKIntPropertyItem(string id, string name, int initialValue, int minValue, int maxValue, bool useSlider = false, bool useStepper = false, bool isReadOnly = false)
|
||||
: base(id, name, initialValue)
|
||||
{
|
||||
_minValue = minValue;
|
||||
_maxValue = maxValue;
|
||||
_useSlider = useSlider;
|
||||
_useStepper = useStepper;
|
||||
IsReadOnly = isReadOnly;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// Int 속성 View 클래스입니다.
|
||||
/// UTKIntegerField 또는 UTKSliderInt를 사용하여 int 값을 표시/편집합니다.
|
||||
/// UTKIntegerField, UTKSliderInt, 또는 UTKNumberStepper를 사용하여 int 값을 표시/편집합니다.
|
||||
///
|
||||
/// <para><b>사용법 (단독 사용):</b></para>
|
||||
/// <code>
|
||||
@@ -20,8 +20,14 @@ namespace UVC.UIToolkit
|
||||
/// view.MaxValue = 100;
|
||||
/// parent.Add(view);
|
||||
///
|
||||
/// // 스테퍼 모드
|
||||
/// var stepperView = new UTKIntPropertyItemView();
|
||||
/// stepperView.UseStepper = true;
|
||||
/// stepperView.Step = 5;
|
||||
///
|
||||
/// // UXML에서 사용
|
||||
/// <utk:UTKIntPropertyItemView label="수량" value="10" use-slider="true" min-value="0" max-value="100" />
|
||||
/// <utk:UTKIntPropertyItemView label="개수" value="1" use-stepper="true" step="1" />
|
||||
/// </code>
|
||||
/// </summary>
|
||||
[UxmlElement]
|
||||
@@ -30,11 +36,14 @@ namespace UVC.UIToolkit
|
||||
#region Fields
|
||||
private UTKIntegerField? _intField;
|
||||
private UTKSliderInt? _slider;
|
||||
private UTKNumberStepper? _stepper;
|
||||
|
||||
private int _value;
|
||||
private int _minValue;
|
||||
private int _maxValue = 100;
|
||||
private int _step = 1;
|
||||
private bool _useSlider;
|
||||
private bool _useStepper;
|
||||
|
||||
private IUTKPropertyItem<int>? _boundData;
|
||||
#endregion
|
||||
@@ -103,7 +112,39 @@ namespace UVC.UIToolkit
|
||||
if (_useSlider != value)
|
||||
{
|
||||
_useSlider = value;
|
||||
UpdateSliderClass();
|
||||
if (value) _useStepper = false;
|
||||
UpdateModeClass();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼(증감 버튼) 사용 여부</summary>
|
||||
[UxmlAttribute("use-stepper")]
|
||||
public bool UseStepper
|
||||
{
|
||||
get => _useStepper;
|
||||
set
|
||||
{
|
||||
if (_useStepper != value)
|
||||
{
|
||||
_useStepper = value;
|
||||
if (value) _useSlider = false;
|
||||
UpdateModeClass();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>스테퍼 증감 단위</summary>
|
||||
[UxmlAttribute("step")]
|
||||
public int Step
|
||||
{
|
||||
get => _step;
|
||||
set
|
||||
{
|
||||
_step = Math.Max(1, value);
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.Step = _step;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -168,7 +209,7 @@ namespace UVC.UIToolkit
|
||||
RegisterEvents();
|
||||
|
||||
// 슬라이더 클래스 업데이트
|
||||
UpdateSliderClass();
|
||||
UpdateModeClass();
|
||||
|
||||
UpdateValueUI();
|
||||
UpdateReadOnlyState();
|
||||
@@ -178,6 +219,7 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_slider = this.Q<UTKSliderInt>("slider-field");
|
||||
_intField = this.Q<UTKIntegerField>("value-field");
|
||||
_stepper = this.Q<UTKNumberStepper>("stepper-field");
|
||||
|
||||
// Fallback: UXML에서 못 찾으면 생성
|
||||
if (_valueContainer != null)
|
||||
@@ -198,6 +240,16 @@ namespace UVC.UIToolkit
|
||||
_intField.AddToClassList("utk-property-item-view__field");
|
||||
_valueContainer.Add(_intField);
|
||||
}
|
||||
|
||||
if (_stepper == null)
|
||||
{
|
||||
_stepper = new UTKNumberStepper(_minValue, _maxValue, _value, _step, IsReadOnly)
|
||||
{
|
||||
name = "stepper-field"
|
||||
};
|
||||
_stepper.AddToClassList("utk-property-item-view__stepper");
|
||||
_valueContainer.Add(_stepper);
|
||||
}
|
||||
}
|
||||
|
||||
// 초기 값 설정
|
||||
@@ -212,10 +264,19 @@ namespace UVC.UIToolkit
|
||||
_intField.SetValueWithoutNotify(_value);
|
||||
_intField.isReadOnly = IsReadOnly;
|
||||
}
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.MinValue = _minValue;
|
||||
_stepper.MaxValue = _maxValue;
|
||||
_stepper.Step = _step;
|
||||
_stepper.SetValue(_value, false);
|
||||
_stepper.IsReadOnly = IsReadOnly;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateSliderClass()
|
||||
private void UpdateModeClass()
|
||||
{
|
||||
// 슬라이더 클래스
|
||||
if (_useSlider)
|
||||
{
|
||||
AddToClassList("utk-property-item-view--slider");
|
||||
@@ -224,6 +285,16 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
RemoveFromClassList("utk-property-item-view--slider");
|
||||
}
|
||||
|
||||
// 스테퍼 클래스
|
||||
if (_useStepper)
|
||||
{
|
||||
AddToClassList("utk-property-item-view--stepper");
|
||||
}
|
||||
else
|
||||
{
|
||||
RemoveFromClassList("utk-property-item-view--stepper");
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -249,6 +320,11 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_slider.IsEnabled = !isReadOnly;
|
||||
}
|
||||
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.IsReadOnly = isReadOnly;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -264,6 +340,11 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_slider.OnValueChanged += OnSliderChanged;
|
||||
}
|
||||
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.OnValueChanged += OnStepperChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void UnregisterEvents()
|
||||
@@ -277,6 +358,11 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_slider.OnValueChanged -= OnSliderChanged;
|
||||
}
|
||||
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.OnValueChanged -= OnStepperChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnIntFieldChanged(int newValue)
|
||||
@@ -323,6 +409,20 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnStepperChanged(int newValue)
|
||||
{
|
||||
if (_value != newValue)
|
||||
{
|
||||
_value = newValue;
|
||||
OnValueChanged?.Invoke(newValue);
|
||||
|
||||
if (_boundData != null && _boundData.Value != newValue)
|
||||
{
|
||||
_boundData.Value = newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Value Update
|
||||
@@ -337,6 +437,11 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_slider.SetValueWithoutNotify(_value);
|
||||
}
|
||||
|
||||
if (_stepper != null && _stepper.Value != _value)
|
||||
{
|
||||
_stepper.SetValue(_value, false);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -369,11 +474,23 @@ namespace UVC.UIToolkit
|
||||
{
|
||||
_minValue = intItem.MinValue;
|
||||
_maxValue = intItem.MaxValue;
|
||||
_step = intItem.Step;
|
||||
|
||||
// 모드 변경 확인
|
||||
bool modeChanged = false;
|
||||
if (_useSlider != intItem.UseSlider)
|
||||
{
|
||||
_useSlider = intItem.UseSlider;
|
||||
UpdateSliderClass();
|
||||
modeChanged = true;
|
||||
}
|
||||
if (_useStepper != intItem.UseStepper)
|
||||
{
|
||||
_useStepper = intItem.UseStepper;
|
||||
modeChanged = true;
|
||||
}
|
||||
if (modeChanged)
|
||||
{
|
||||
UpdateModeClass();
|
||||
}
|
||||
|
||||
// 슬라이더 범위 업데이트
|
||||
@@ -382,6 +499,14 @@ namespace UVC.UIToolkit
|
||||
_slider.lowValue = _minValue;
|
||||
_slider.highValue = _maxValue;
|
||||
}
|
||||
|
||||
// 스테퍼 설정 업데이트
|
||||
if (_stepper != null)
|
||||
{
|
||||
_stepper.MinValue = _minValue;
|
||||
_stepper.MaxValue = _maxValue;
|
||||
_stepper.Step = _step;
|
||||
}
|
||||
}
|
||||
|
||||
data.OnTypedValueChanged += OnDataValueChanged;
|
||||
@@ -422,6 +547,8 @@ namespace UVC.UIToolkit
|
||||
OnValueChanged = null;
|
||||
_intField = null;
|
||||
_slider = null;
|
||||
_stepper?.Dispose();
|
||||
_stepper = null;
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
|
||||
Reference in New Issue
Block a user