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