130 lines
3.9 KiB
C#
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
|
|
}
|
|
}
|