#nullable enable using System; using System.Collections.Generic; using System.Threading; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UIElements; using UVC.Locale; namespace UVC.UIToolkit.Common { /// /// UIToolkit 기반 툴팁 매니저 /// VisualElement에 마우스 오버 시 툴팁 표시 /// public class UTKTooltipManager : IDisposable { #region Singleton private static UTKTooltipManager? _instance; public static UTKTooltipManager Instance => _instance ??= new UTKTooltipManager(); protected UTKTooltipManager() { } #endregion #region Constants private const string UXML_PATH = "UIToolkit/Common/UTKTooltip"; private const string USS_PATH = "UIToolkit/Common/UTKTooltip"; private const int SHOW_DELAY_MS = 500; private const int POSITION_OFFSET = 10; #endregion #region Fields private VisualElement? _root; private VisualElement? _tooltipContainer; private Label? _tooltipLabel; private bool _isInitialized; private bool _isVisible; private bool _disposed; private CancellationTokenSource? _showDelayCts; private readonly Dictionary _tooltipRegistry = new(); private readonly Dictionary> _enterCallbacks = new(); private readonly Dictionary> _leaveCallbacks = new(); private readonly Dictionary> _moveCallbacks = new(); #endregion #region Properties public bool IsInitialized => _isInitialized; public bool IsVisible => _isVisible; #endregion #region Initialization /// /// 툴팁 매니저를 초기화합니다. /// /// VisualElement 트리의 루트 public void Initialize(VisualElement root) { if (_isInitialized) { Debug.LogWarning("[UTKTooltipManager] Already initialized."); return; } _root = root; // UXML 로드 시도 var visualTree = Resources.Load(UXML_PATH); if (visualTree != null) { _tooltipContainer = visualTree.Instantiate(); _tooltipContainer.name = "utk-tooltip-container"; _tooltipLabel = _tooltipContainer.Q