This commit is contained in:
CortexCore
2025-02-24 23:02:43 +08:00
parent 41715e4413
commit 8261a458e2
105 changed files with 2934 additions and 696 deletions

View File

@@ -40,7 +40,6 @@ namespace BITKit.UX
uxService.Register(this);
InitializeAsync().Forget();
}
private async UniTask InitializeAsync()
{
await _isBusy;
@@ -89,20 +88,20 @@ namespace BITKit.UX
UXUtils.Inject(this,RootVisualElement);
OnInitiated?.Invoke();
RootVisualElement.SetActive(false);
await OnInitiatedAsync.UniTaskFunc();
WaitUtilInitialized.TrySetResult();
RootVisualElement.RegisterCallback<TransitionRunEvent>(OnTransitionRun);
RootVisualElement.RegisterCallback<TransitionStartEvent>(OnTransitionStart);
RootVisualElement.RegisterCallback<TransitionStartEvent>(OnTransitionStart);
RootVisualElement.RegisterCallback<TransitionEndEvent>(OnTransitionEnd);
RootVisualElement.RegisterCallback<TransitionCancelEvent>(OnTransitionEnd);
WaitUtilTransitionCompleted.TrySetResult();
WaitUtilInitialized.TrySetResult();
OnInitiated?.Invoke();
}
}
@@ -127,6 +126,7 @@ namespace BITKit.UX
public virtual bool AllowReload { get; }
public virtual bool AllowCursor { get; }
public virtual bool AllowInput { get; }
public object Root => RootVisualElement;
public virtual string[] InitialUssClasses { get; } = Array.Empty<string>();
public bool IsDisposed { get; private set; }
@@ -152,6 +152,11 @@ namespace BITKit.UX
RootVisualElement.SetActive(true);
//await UniTask.NextFrame();
if (IsWindow)
{
RootVisualElement.BringToFront();
}
RootVisualElement.AddToClassList(USSEntry);
@@ -174,9 +179,19 @@ namespace BITKit.UX
{
BIT4Log.LogException(e);
}
await WaitUtilTransitionCompleted.Task;
try
{
var cts = new CancellationTokenSource();
cts.CancelAfter(1000);
await WaitUtilTransitionCompleted.Task.AttachExternalCancellation(cts.Token);
}
catch (OperationCanceledException)
{
}
await UniTask.SwitchToMainThread();
RootVisualElement.AddToClassList(USSEntered);
}
private void OnTransitionEnd<TChangeEvent>(TChangeEvent evt)
@@ -218,8 +233,17 @@ namespace BITKit.UX
await UniTask.NextFrame();
await OnExitAsync.UniTaskFunc();
try
{
var cts = new CancellationTokenSource();
cts.CancelAfter(1000);
await WaitUtilTransitionCompleted.Task.AttachExternalCancellation(cts.Token);
}
catch (OperationCanceledException)
{
}
await WaitUtilTransitionCompleted.Task;
}
void IEntryElement.Exited()
{
@@ -249,7 +273,7 @@ namespace BITKit.UX
{
}
public void Dispose()
public virtual void Dispose()
{
RootVisualElement?.RemoveFromHierarchy();
IsDisposed = true;

View File

@@ -0,0 +1,141 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using UnityEngine;
using UnityEngine.UIElements;
namespace BITKit.UX
{
public class UIToolkitSubPanel<T> :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<T>();
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 IEntryElement.IsEntered
{
get => Panel.IsEntered;
set => Panel.IsEntered = value;
}
void IEntryElement.Entry()
{
Panel.Entry();
}
UniTask IEntryElement.EntryAsync()
{
return Panel.EntryAsync();
}
void IEntryElement.Entered()
{
Panel.Entered();
}
void IEntryElement.Exit()
{
Panel.Exit();
}
UniTask IEntryElement.ExitAsync()
{
return Panel.ExitAsync();
}
void IEntryElement.Exited()
{
Panel.Exited();
}
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<UniTask> OnEntryAsync;
public event Action OnEntryCompleted;
public event Action OnExit;
public event Func<UniTask> OnExitAsync;
public event Action OnExitCompleted;
event Action IUXPanel.OnInitiated
{
add => Panel.OnInitiated += value;
remove => Panel.OnInitiated -= value;
}
event Func<UniTask> IUXPanel.OnInitiatedAsync
{
add => Panel.OnInitiatedAsync += value;
remove => Panel.OnInitiatedAsync -= value;
}
void IUXPanel.OnTick(float deltaTime)
{
Panel.OnTick(deltaTime);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3b6d7b7e48316f04f9130c5301091ee7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: