#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 } }