UTKToolBar 개발 완료
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
|
||||
namespace UVC.UIToolkit
|
||||
{
|
||||
/// <summary>
|
||||
/// On/Off 상태를 가지는 토글 버튼 데이터입니다.
|
||||
/// 클릭 시 IsSelected 상태가 반전되고, OnToggleStateChanged 이벤트가 발생합니다.
|
||||
/// </summary>
|
||||
public class UTKToolBarToggleButtonData : UTKToolBarButtonData
|
||||
{
|
||||
#region Fields
|
||||
|
||||
private bool _isSelected;
|
||||
private string? _offIconPath;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// 현재 선택(On) 상태. 변경 시 OnToggleStateChanged, OnStateChanged 이벤트 발생.
|
||||
/// </summary>
|
||||
public bool IsSelected
|
||||
{
|
||||
get => _isSelected;
|
||||
set
|
||||
{
|
||||
if (_isSelected != value)
|
||||
{
|
||||
_isSelected = value;
|
||||
OnToggle?.Invoke(_isSelected);
|
||||
OnToggleStateChanged?.Invoke(_isSelected);
|
||||
NotifyStateChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>Off 상태 아이콘 경로</summary>
|
||||
public string? OffIconPath
|
||||
{
|
||||
get => _offIconPath;
|
||||
set
|
||||
{
|
||||
if (_offIconPath != value)
|
||||
{
|
||||
_offIconPath = value;
|
||||
NotifyStateChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>토글 상태 변경 시 콜백</summary>
|
||||
public Action<bool>? OnToggle { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
|
||||
/// <summary>IsSelected 상태 변경 시 발생</summary>
|
||||
public event Action<bool>? OnToggleStateChanged;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
|
||||
/// <summary>
|
||||
/// UTKToolBarToggleButtonData의 새 인스턴스를 초기화합니다.
|
||||
/// </summary>
|
||||
/// <param name="itemId">아이템 고유 식별자. null이면 GUID 자동 생성.</param>
|
||||
public UTKToolBarToggleButtonData(string? itemId = null) : base(itemId)
|
||||
{
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <summary>
|
||||
/// 이벤트 발생 여부를 선택하여 선택 상태를 설정합니다.
|
||||
/// </summary>
|
||||
/// <param name="isSelected">새로운 선택 상태</param>
|
||||
/// <param name="raiseEvent">true이면 OnToggle 콜백을 호출, false이면 UI 이벤트만 발생</param>
|
||||
public void SetSelected(bool isSelected, bool raiseEvent = true)
|
||||
{
|
||||
if (_isSelected != isSelected)
|
||||
{
|
||||
_isSelected = isSelected;
|
||||
if (raiseEvent)
|
||||
{
|
||||
OnToggle?.Invoke(_isSelected);
|
||||
}
|
||||
OnToggleStateChanged?.Invoke(_isSelected);
|
||||
NotifyStateChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 클릭 시 상태를 반전시키고 Command를 실행합니다.
|
||||
/// </summary>
|
||||
/// <param name="parameter">전달된 파라미터. bool이면 직접 상태 설정, 아니면 토글.</param>
|
||||
public override void ExecuteClick(object? parameter = null)
|
||||
{
|
||||
if (!IsEnabled) return;
|
||||
|
||||
if (parameter is bool newState)
|
||||
{
|
||||
IsSelected = newState;
|
||||
}
|
||||
else
|
||||
{
|
||||
IsSelected = !IsSelected;
|
||||
}
|
||||
|
||||
// Command 실행 (현재 IsSelected 상태를 파라미터로 전달)
|
||||
if (ClickCommand != null)
|
||||
{
|
||||
ClickCommand.Execute(IsSelected);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 모든 이벤트 핸들러를 해제합니다.
|
||||
/// </summary>
|
||||
public override void ClearEventHandlers()
|
||||
{
|
||||
base.ClearEventHandlers();
|
||||
OnToggleStateChanged = null;
|
||||
OnToggle = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user