using System; using System.Collections; using System.Collections.Generic; using BITKit.StateMachine; using Cysharp.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using UnityEngine; using UnityEngine.UIElements; namespace BITKit.UX { public class UIToolkitSubPanel :IUXPanel where T : IUXPanel { private readonly IServiceProvider _serviceProvider; protected readonly T Panel; protected readonly ValidHandle IsVisible=new(); private readonly ValidHandle _busy = new(); public UIToolkitSubPanel(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; Panel = serviceProvider.GetRequiredService(); Panel.OnInitiated += OnInitiated; Panel.OnInitiatedAsync += OnInitiatedAsync; if (Panel is UIToolKitPanel uiToolKitPanel) { if (uiToolKitPanel.WaitUtilInitialized.Task.Status is UniTaskStatus.Succeeded) { OnInitiatedAsync().Forget(); OnInitiated(); } } Panel.OnEntry +=()=> IsVisible.RemoveDisableElements(this); Panel.OnExit +=()=> IsVisible.AddDisableElements(this); IsVisible.AddListener(IsVisibleCallback); } private async void IsVisibleCallback(bool x) { await _busy; using var busy = _busy.GetHandle(); if (x) { OnEntry?.Invoke(); OnEntryAsync?.Invoke(); OnEntryCompleted?.Invoke(); } else { OnExit?.Invoke(); OnExitAsync?.Invoke(); OnExitCompleted?.Invoke(); } } protected virtual UniTask OnInitiatedAsync() { UXUtils.Inject(this,Panel.Root as VisualElement); return UniTask.CompletedTask; } protected virtual void OnInitiated() { UXUtils.Inject(this,Panel.Root as VisualElement); } bool IUXPanel.IsWindow => Panel.IsWindow; string IUXPanel.Index => Panel.Index; bool IUXPanel.AllowCursor => Panel.AllowCursor; bool IUXPanel.AllowInput => Panel.AllowInput; object IUXPanel.Root => Panel.Root; public event Action OnEntry; public event Func OnEntryAsync; public event Action OnEntryCompleted; public event Action OnExit; public event Func OnExitAsync; public event Action OnExitCompleted; event Action IUXPanel.OnInitiated { add => Panel.OnInitiated += value; remove => Panel.OnInitiated -= value; } event Func IUXPanel.OnInitiatedAsync { add => Panel.OnInitiatedAsync += value; remove => Panel.OnInitiatedAsync -= value; } void IUXPanel.OnTick(float deltaTime) { Panel.OnTick(deltaTime); } public bool Enabled { get => Panel.Enabled; set => Panel.Enabled = value; } public void Initialize() { Panel.Initialize(); } public void OnStateEntry(IState old) { Panel.OnStateEntry(old); } public void OnStateUpdate(float deltaTime) { Panel.OnStateUpdate(deltaTime); } public void OnStateExit(IState old, IState newState) { Panel.OnStateExit(old, newState); } public int Identifier { get => Panel.Identifier; set => Panel.Identifier = value; } public UniTask InitializeAsync() { return Panel.InitializeAsync(); } public UniTask OnStateEntryAsync(IState old) { return Panel.OnStateEntryAsync(old); } public UniTask OnStateUpdateAsync(float deltaTime) { return Panel.OnStateUpdateAsync(deltaTime); } public UniTask OnStateExitAsync(IState old, IState newState) { return Panel.OnStateExitAsync(old, newState); } } }