2025-06-13 17:10:58 +09:00
|
|
|
|
using System;
|
2025-06-16 19:30:01 +09:00
|
|
|
|
using UnityEngine;
|
2025-06-13 17:10:58 +09:00
|
|
|
|
|
2025-06-16 19:30:01 +09:00
|
|
|
|
namespace UVC.UI.Toolbar
|
2025-06-13 17:10:58 +09:00
|
|
|
|
{
|
|
|
|
|
|
/// <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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 17:10:58 +09:00
|
|
|
|
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-13 17:10:58 +09:00
|
|
|
|
{
|
2025-06-16 19:30:01 +09:00
|
|
|
|
if (!IsEnabled) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (parameter is bool newSelectedStateFromUI)
|
2025-06-13 17:10:58 +09:00
|
|
|
|
{
|
2025-06-16 19:30:01 +09:00
|
|
|
|
// UI로부터 직접 상태가 전달된 경우 (View의 onValueChanged 리스너)
|
|
|
|
|
|
// IsSelected 프로퍼티 setter가 OnToggle 및 NotifyStateChanged를 호출
|
|
|
|
|
|
IsSelected = newSelectedStateFromUI;
|
2025-06-13 17:10:58 +09:00
|
|
|
|
}
|
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);
|
2025-06-13 17:10:58 +09:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|