AlicizaX/Client/Packages/com.alicizax.unity.ui/Runtime/UI/UIBase/UIBase.Widget.cs

125 lines
3.7 KiB
C#
Raw Normal View History

2025-03-04 18:40:14 +08:00
using System;
using System.Buffers;
using System.Collections.Generic;
2025-04-28 19:45:45 +08:00
using AlicizaX;
2025-03-04 18:40:14 +08:00
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Pool;
namespace AlicizaX.UI.Runtime
{
public abstract partial class UIBase
{
private readonly Dictionary<UIBase, UIMetadata> _children = new();
private void UpdateChildren()
{
2025-04-28 19:45:45 +08:00
var values = _children.Values;
2025-03-04 18:40:14 +08:00
foreach (var meta in values)
{
if (meta.View.State == UIState.Opened)
{
meta.View.InternalUpdate();
}
}
}
2025-04-28 19:45:45 +08:00
private async UniTask DestroyAllChildren()
2025-03-04 18:40:14 +08:00
{
var temp = ArrayPool<UIMetadata>.Shared.Rent(_children.Count);
try
{
int i = 0;
foreach (var kvp in _children)
{
temp[i++] = kvp.Value;
}
for (int j = 0; j < i; j++)
{
2025-04-28 19:45:45 +08:00
if (temp[j].View.Visible) await temp[j].View.InternalClose();
2025-03-04 18:40:14 +08:00
temp[j].Dispose();
}
}
finally
{
ArrayPool<UIMetadata>.Shared.Return(temp);
}
_children.Clear();
}
private void ChildVisible(bool value)
{
foreach (var meta in _children.Values)
{
var view = meta.View;
if (view.State == UIState.Opened)
{
view.Visible = value;
}
}
}
2025-04-28 19:45:45 +08:00
internal async UniTask<UIBase> CreateWidget(UIMetadata metadata, Transform parent, bool visible)
2025-03-04 18:40:14 +08:00
{
metadata.CreateUI();
2025-04-28 19:45:45 +08:00
await UIHolderFactory.CreateUIResource(metadata, parent, this);
await ProcessWidget(metadata, visible);
return (UIBase)metadata.View;
2025-03-04 18:40:14 +08:00
}
2025-04-28 19:45:45 +08:00
protected async UniTask<UIBase> CreateWidget(string typeName, Transform parent, bool visible = true)
{
UIMetaRegistry.TryGet(typeName, out var metaRegistry);
UIMetadata metadata = UIMetadataFactory.GetMetadata(metaRegistry.RuntimeTypeHandle);
return await CreateWidget(metadata, parent, visible);
}
protected async UniTask<T> CreateWidget<T>(Transform parent, bool visible = true) where T : UIBase
2025-03-04 18:40:14 +08:00
{
UIMetadata metadata = MetaTypeCache<T>.Metadata;
2025-04-28 19:45:45 +08:00
return (T)await CreateWidget(metadata, parent, visible);
2025-03-04 18:40:14 +08:00
}
2025-04-28 19:45:45 +08:00
protected async UniTask<T> CreateWidget<T>(UIHolderObjectBase holder) where T : UIBase
2025-03-04 18:40:14 +08:00
{
UIMetadata metadata = MetaTypeCache<T>.Metadata;
metadata.CreateUI();
2025-04-28 19:45:45 +08:00
UIBase widget = (UIBase)metadata.View;
widget.BindUIHolder(holder, this);
await ProcessWidget(metadata, true);
return (T)widget;
2025-03-04 18:40:14 +08:00
}
2025-04-28 19:45:45 +08:00
private async UniTask ProcessWidget(UIMetadata meta, bool visible)
2025-03-04 18:40:14 +08:00
{
AddWidget(meta);
2025-04-28 19:45:45 +08:00
await meta.View.InternalInitlized();
meta.View.Visible = visible;
if (meta.View.Visible)
2025-03-04 18:40:14 +08:00
{
2025-04-28 19:45:45 +08:00
await meta.View.InternalOpen();
2025-03-04 18:40:14 +08:00
}
}
private void AddWidget(UIMetadata meta)
{
if (!_children.TryAdd(meta.View, meta))
{
Log.Warning("Already has widget:{0}", meta.View);
2025-04-28 19:45:45 +08:00
meta.Dispose();
2025-03-04 18:40:14 +08:00
}
}
2025-04-28 19:45:45 +08:00
public async UniTask RemoveWidget(UIBase widget)
2025-03-04 18:40:14 +08:00
{
if (_children.Remove(widget, out var meta))
{
2025-04-28 19:45:45 +08:00
await widget.InternalClose();
2025-03-04 18:40:14 +08:00
meta.Dispose();
}
}
}
}