Files
EnglewoodLAB/Assets/Scripts/UVC/UIToolkit/ToolBar/Items/UTKToolBarToggleButton.cs

130 lines
3.9 KiB
C#

#nullable enable
using UnityEngine;
using UnityEngine.UIElements;
namespace UVC.UIToolkit
{
/// <summary>
/// On/Off 상태 전환이 가능한 토글 버튼 컴포넌트입니다.
/// 선택 상태에 따라 아이콘과 스타일이 변경됩니다.
/// 라디오 버튼의 베이스로도 사용됩니다.
/// </summary>
[UxmlElement]
public partial class UTKToolBarToggleButton : UTKToolBarButtonBase
{
#region Constructor
/// <summary>
/// UTKToolBarToggleButton의 새 인스턴스를 초기화합니다.
/// </summary>
public UTKToolBarToggleButton() : base()
{
_uxmlPath = "UIToolkit/ToolBar/UTKToolBarToggleButton";
_ussPath = "UIToolkit/ToolBar/UTKToolBarToggleButtonUss";
// 버튼 기본 USS도 로드
var buttonUss = Resources.Load<StyleSheet>("UIToolkit/ToolBar/UTKToolBarButtonUss");
if (buttonUss != null)
{
styleSheets.Add(buttonUss);
}
CreateUI();
}
#endregion
#region Data Binding
/// <summary>
/// 데이터 바인딩. Toggle 전용 이벤트를 추가로 구독합니다.
/// </summary>
/// <param name="data">바인딩할 데이터</param>
public override void BindData(UTKToolBarButtonData data)
{
base.BindData(data);
if (data is UTKToolBarToggleButtonData toggleData)
{
toggleData.OnToggleStateChanged += OnToggleStateChanged;
UpdateToggleVisuals(toggleData.IsSelected);
}
}
/// <summary>
/// 데이터 바인딩 해제. Toggle 전용 이벤트도 해제합니다.
/// </summary>
public override void UnbindData()
{
if (_data is UTKToolBarToggleButtonData toggleData)
{
toggleData.OnToggleStateChanged -= OnToggleStateChanged;
}
base.UnbindData();
}
#endregion
#region Toggle Visuals
/// <summary>
/// 토글 상태에 따른 시각적 업데이트.
/// 선택 시 선택 스타일 추가, 아이콘 전환.
/// </summary>
/// <param name="isSelected">선택 상태</param>
protected virtual void UpdateToggleVisuals(bool isSelected)
{
if (_rootButton == null) return;
if (isSelected)
{
_rootButton.AddToClassList("utk-toolbar-toggle--selected");
}
else
{
_rootButton.RemoveFromClassList("utk-toolbar-toggle--selected");
}
// 아이콘 전환 (On/Off)
if (_data is UTKToolBarToggleButtonData toggleData)
{
string? iconPath = isSelected ? toggleData.IconPath : toggleData.OffIconPath;
// OffIconPath가 없으면 기본 아이콘 사용
if (string.IsNullOrEmpty(iconPath))
{
iconPath = toggleData.IconPath;
}
UpdateIcon(iconPath, toggleData.UseMaterialIcon);
}
}
/// <summary>
/// 토글 상태 변경 핸들러.
/// </summary>
/// <param name="isSelected">새로운 선택 상태</param>
private void OnToggleStateChanged(bool isSelected)
{
UpdateToggleVisuals(isSelected);
}
#endregion
#region Override
/// <summary>
/// 모델 상태 변경 시 토글 시각 효과도 업데이트합니다.
/// </summary>
protected override void OnDataStateChanged()
{
base.OnDataStateChanged();
if (_data is UTKToolBarToggleButtonData toggleData)
{
UpdateToggleVisuals(toggleData.IsSelected);
}
}
#endregion
}
}