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