#nullable enable using System; using UnityEngine; using UnityEngine.UIElements; namespace UVC.UIToolkit { /// /// 탭 컴포넌트. /// Unity Tab을 래핑하여 커스텀 스타일을 적용합니다. /// /// /// C# 코드에서 사용: /// /// // UTKTabView와 함께 사용 /// var tabView = new UTKTabView(); /// /// var tab1 = new UTKTab(); /// tab1.Text = "일반"; /// tab1.Add(new Label("일반 탭 내용")); /// tabView.Add(tab1); /// /// var tab2 = new UTKTab(); /// tab2.Text = "고급"; /// tab2.IsEnabled = false; // 비활성화 /// tabView.Add(tab2); /// /// UXML에서 사용: /// /// /// /// /// /// /// /// /// /// /// /// /// [UxmlElement] public partial class UTKTab : Tab, IDisposable { #region Fields private bool _disposed; private bool _isEnabled = true; #endregion #region Properties /// 탭 텍스트 public string Text { get => label; set => label = value; } /// 선택 상태 public bool IsSelected { get => ClassListContains("utk-tab--selected"); set => EnableInClassList("utk-tab--selected", value); } /// 활성화 상태 [UxmlAttribute("is-enabled")] public bool IsEnabled { get => _isEnabled; set { _isEnabled = value; SetEnabled(value); EnableInClassList("utk-tab--disabled", !value); } } #endregion #region Constructor public UTKTab() : base() { UTKThemeManager.Instance.ApplyThemeToElement(this); SetupStyles(); SubscribeToThemeChanges(); } public UTKTab(string text) : this() { label = text; } #endregion #region Setup private void SetupStyles() { AddToClassList("utk-tab"); } private void SubscribeToThemeChanges() { UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged; RegisterCallback(OnAttachToPanelForTheme); RegisterCallback(OnDetachFromPanelForTheme); } private void OnAttachToPanelForTheme(AttachToPanelEvent evt) { UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged; UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged; UTKThemeManager.Instance.ApplyThemeToElement(this); } private void OnDetachFromPanelForTheme(DetachFromPanelEvent evt) { UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged; } private void OnThemeChanged(UTKTheme theme) { UTKThemeManager.Instance.ApplyThemeToElement(this); } #endregion #region IDisposable public void Dispose() { if (_disposed) return; _disposed = true; UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged; UnregisterCallback(OnAttachToPanelForTheme); UnregisterCallback(OnDetachFromPanelForTheme); } #endregion } }