Files
XRLib/Assets/Scripts/UVC/UI/ToolBar/ToolbarToggleButton.cs

69 lines
2.3 KiB
C#
Raw Normal View History

using System;
2025-06-16 19:30:01 +09:00
using UnityEngine;
2025-06-16 19:30:01 +09:00
namespace UVC.UI.Toolbar
{
/// <summary>
/// 클릭할 때마다 선택/해제 상태가 변경되는 토글 버튼입니다.
/// </summary>
public class ToolbarToggleButton : ToolbarButtonBase
{
public event Action<bool> OnToggleStateChanged; // IsSelected 변경 시 IsSelected 값을 전달하는 이벤트
2025-06-16 19:30:01 +09:00
protected string _offIconSpritePath;
public string OffIconSpritePath
{
get => _offIconSpritePath;
set
{
if (_offIconSpritePath != value)
{
_offIconSpritePath = value;
NotifyStateChanged();
}
}
}
private bool _isSelected;
public bool IsSelected
{
get => _isSelected;
set
{
if (_isSelected != value)
{
_isSelected = value;
OnToggleStateChanged?.Invoke(_isSelected); // IsSelected 값과 함께 이벤트 발생
NotifyStateChanged(); // 일반 상태 변경 이벤트도 발생
}
}
}
public Action<bool> OnToggle { get; set; }
2025-06-16 19:30:01 +09:00
public override void ExecuteClick(object parameter = null)
{
2025-06-16 19:30:01 +09:00
if (!IsEnabled) return;
if (parameter is bool newSelectedStateFromUI)
{
2025-06-16 19:30:01 +09:00
// UI로부터 직접 상태가 전달된 경우 (View의 onValueChanged 리스너)
// IsSelected 프로퍼티 setter가 OnToggle 및 NotifyStateChanged를 호출
IsSelected = newSelectedStateFromUI;
}
2025-06-16 19:30:01 +09:00
else
{
// 일반적인 ExecuteClick (파라미터 없거나 bool이 아님) - 기존 토글 로직
IsSelected = !IsSelected;
}
OnToggle?.Invoke(IsSelected); // IsSelected는 이미 위에서 최종 상태로 설정됨
// ClickCommand 실행. 필요하다면 IsSelected나 다른 값을 파라미터로 전달.
// 여기서는 parameter 인자로 받은 값을 우선 사용하고, 없으면 IsSelected를 사용.
object commandParameter = parameter ?? IsSelected;
ClickCommand?.Execute(commandParameter);
}
}
}