This commit is contained in:
MuHua-123
2025-08-20 09:57:45 +08:00
parent f249f16f1f
commit 301030487e
5 changed files with 104 additions and 40 deletions
@@ -9,12 +9,17 @@ namespace MuHua {
/// UI项容器
/// </summary>
public class ModuleUIItems<TItem, TData> : ModuleUIPanel, IDisposable where TItem : ModuleUIItem<TData> {
public readonly VisualTreeAsset templateAsset;// 模板资源
public readonly Func<TData, VisualElement, TItem> generate;// 生成UI项的函数
/// <summary> 模板资源 </summary>
public readonly VisualTreeAsset templateAsset;
/// <summary> 生成UI项的函数 </summary>
public readonly Func<TData, VisualElement, TItem> generate;
/// <summary> UI项列表 </summary>
public List<TItem> Items = new List<TItem>();
public List<TItem> uiItems = new List<TItem>();// UI项列表
public TItem this[int index] { get => uiItems[index]; }// 索引器
/// <summary> 索引器 </summary>
public TItem this[int index] { get => Items[index]; }
/// <summary> 计数 </summary>
public int Count { get => Items != null ? Items.Count : 0; }
/// <summary> UI容器 </summary>
public ModuleUIItems(VisualElement element, VisualTreeAsset templateAsset, Func<TData, VisualElement, TItem> generate) : base(element) {
@@ -24,24 +29,37 @@ namespace MuHua {
/// <summary> 释放资源 </summary>
public void Dispose() {
element.Clear();
uiItems.ForEach(obj => obj.Dispose());
uiItems = new List<TItem>();
Items.ForEach(obj => obj.Dispose());
Items = new List<TItem>();
}
/// <summary> 创建UI项 </summary>
public void Create(List<TData> datas) {
Dispose();
public void Create(List<TData> datas, bool isClear = true) {
if (isClear) { Dispose(); }
datas.ForEach(Create);
}
/// <summary> 创建UI项 </summary>
public void Create(TData data, bool isClear = false) {
if (isClear) { Dispose(); }
Create(data);
}
/// <summary> 创建UI项 </summary>
public void Create(TData data) {
VisualElement element = templateAsset.Instantiate();
TItem item = generate(data, element);
this.element.Add(item.element);
uiItems.Add(item);
Items.Add(item);
}
/// <summary> 遍历 </summary>
public void ForEach(Action<TItem> action) {
uiItems.ForEach(action);
Items.ForEach(action);
}
/// <summary> 选择第一个 </summary>
public void SelectFirst() {
if (Items.Count > 0) { Items[0].Select(); }
}
/// <summary> 选择最后一个 </summary>
public void SelectFinally() {
if (Items.Count > 0) { Items[Count - 1].Select(); }
}
}
}
@@ -8,22 +8,33 @@ namespace MuHua {
/// <summary>
/// 滚动列表
/// </summary>
public class UIScrollViewList<T, Data> : UIScrollView where T : ModuleUIItem<Data> {
public class UIScrollViewList<TItem, Data> : UIScrollView where TItem : ModuleUIItem<Data> {
/// <summary> UI项容器 </summary>
public ModuleUIItems<TItem, Data> Items;
private ModuleUIItems<T, Data> Items;// UI项容器
/// <summary> 索引器 </summary>
public TItem this[int index] { get => Items[index]; }
/// <summary> 计数 </summary>
public int Count { get => Items != null ? Items.Count : 0; }
public UIScrollViewList(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset, Func<Data, VisualElement, T> generate) : base(element, canvas) {
Items = new ModuleUIItems<T, Data>(Container, templateAsset, generate);
public UIScrollViewList(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset, Func<Data, VisualElement, TItem> generate) : base(element, canvas) {
Items = new ModuleUIItems<TItem, Data>(Container, templateAsset, generate);
}
public override void Dispose() {
base.Dispose();
Items.Dispose();
}
/// <summary> 释放资源 </summary>
public void Release() => Items.Dispose();
public virtual void Release() => Items.Dispose();
/// <summary> 创建UI项 </summary>
public void Create(List<Data> datas) => Items.Create(datas);
public virtual void Create(List<Data> datas, bool isClear = true) => Items.Create(datas, isClear);
/// <summary> 创建UI项 </summary>
public void Create(Data data) => Items.Create(data);
public virtual void Create(Data data, bool isClear = false) => Items.Create(data, isClear);
/// <summary> 遍历 </summary>
public virtual void ForEach(Action<TItem> action) => Items.ForEach(action);
/// <summary> 选择第一个 </summary>
public virtual void SelectFirst() => Items.SelectFirst();
/// <summary> 选择最后一个 </summary>
public virtual void SelectFinally() => Items.SelectFinally();
}
}
@@ -8,23 +8,34 @@ namespace MuHua {
/// <summary>
/// 滚动列表 - 水平
/// </summary>
public class UIScrollViewListH<T, Data> : UIScrollViewH where T : ModuleUIItem<Data> {
public class UIScrollViewListH<TItem, Data> : UIScrollViewH where TItem : ModuleUIItem<Data> {
/// <summary> UI项容器 </summary>
public ModuleUIItems<TItem, Data> Items;
public ModuleUIItems<T, Data> Items;// UI项容器
/// <summary> 索引器 </summary>
public TItem this[int index] { get => Items[index]; }
/// <summary> 计数 </summary>
public int Count { get => Items != null ? Items.Count : 0; }
public UIScrollViewListH(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset,
Func<Data, VisualElement, T> generate, UIDirection direction = UIDirection.FromLeftToRight) : base(element, canvas, direction) {
Items = new ModuleUIItems<T, Data>(Container, templateAsset, generate);
Func<Data, VisualElement, TItem> generate, UIDirection direction = UIDirection.FromLeftToRight) : base(element, canvas, direction) {
Items = new ModuleUIItems<TItem, Data>(Container, templateAsset, generate);
}
public override void Dispose() {
base.Dispose();
Items.Dispose();
}
/// <summary> 释放资源 </summary>
public void Release() => Items.Dispose();
public virtual void Release() => Items.Dispose();
/// <summary> 创建UI项 </summary>
public void Create(List<Data> datas) => Items.Create(datas);
public virtual void Create(List<Data> datas, bool isClear = true) => Items.Create(datas, isClear);
/// <summary> 创建UI项 </summary>
public void Create(Data data) => Items.Create(data);
public virtual void Create(Data data, bool isClear = false) => Items.Create(data, isClear);
/// <summary> 遍历 </summary>
public virtual void ForEach(Action<TItem> action) => Items.ForEach(action);
/// <summary> 选择第一个 </summary>
public virtual void SelectFirst() => Items.SelectFirst();
/// <summary> 选择最后一个 </summary>
public virtual void SelectFinally() => Items.SelectFinally();
}
}
@@ -8,23 +8,34 @@ namespace MuHua {
/// <summary>
/// 滚动列表 - 垂直
/// </summary>
public class UIScrollViewListV<T, Data> : UIScrollViewV where T : ModuleUIItem<Data> {
public class UIScrollViewListV<TItem, Data> : UIScrollViewV where TItem : ModuleUIItem<Data> {
/// <summary> UI项容器 </summary>
public ModuleUIItems<TItem, Data> Items;
public ModuleUIItems<T, Data> Items;// UI项容器
/// <summary> 索引器 </summary>
public TItem this[int index] { get => Items[index]; }
/// <summary> 计数 </summary>
public int Count { get => Items != null ? Items.Count : 0; }
public UIScrollViewListV(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset,
Func<Data, VisualElement, T> generate, UIDirection direction = UIDirection.FromTopToBottom) : base(element, canvas, direction) {
Items = new ModuleUIItems<T, Data>(Container, templateAsset, generate);
Func<Data, VisualElement, TItem> generate, UIDirection direction = UIDirection.FromTopToBottom) : base(element, canvas, direction) {
Items = new ModuleUIItems<TItem, Data>(Container, templateAsset, generate);
}
public override void Dispose() {
base.Dispose();
Items.Dispose();
}
/// <summary> 释放资源 </summary>
public void Release() => Items.Dispose();
public virtual void Release() => Items.Dispose();
/// <summary> 创建UI项 </summary>
public void Create(List<Data> datas) => Items.Create(datas);
public virtual void Create(List<Data> datas, bool isClear = true) => Items.Create(datas, isClear);
/// <summary> 创建UI项 </summary>
public void Create(Data data) => Items.Create(data);
public virtual void Create(Data data, bool isClear = false) => Items.Create(data, isClear);
/// <summary> 遍历 </summary>
public virtual void ForEach(Action<TItem> action) => Items.ForEach(action);
/// <summary> 选择第一个 </summary>
public virtual void SelectFirst() => Items.SelectFirst();
/// <summary> 选择最后一个 </summary>
public virtual void SelectFinally() => Items.SelectFinally();
}
}
@@ -17,22 +17,29 @@ namespace MuHua {
/// <summary>
/// 滑动按钮
/// </summary>
public class UISlideButton<T, Data> : ModuleUIPanel where T : ModuleUIItem<Data> where Data : DataSlideButton {
public class UISlideButton<TItem, Data> : ModuleUIPanel where TItem : ModuleUIItem<Data> where Data : DataSlideButton {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 选中数据 </summary>
public Data data;
public ModuleUIItems<T, Data> Items;// UI项容器
/// <summary> UI项容器 </summary>
public ModuleUIItems<TItem, Data> Items;
/// <summary> 索引器 </summary>
public TItem this[int index] { get => Items[index]; }
/// <summary> 计数 </summary>
public int Count { get => Items != null ? Items.Count : 0; }
/// <summary> 滑块 </summary>
public VisualElement Slide => Q<VisualElement>("Slide");
/// <summary> 容器 </summary>
public VisualElement Container => Q<VisualElement>("Container");
public UISlideButton(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset, Func<Data, VisualElement, T> generate) : base(element) {
public UISlideButton(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset, Func<Data, VisualElement, TItem> generate) : base(element) {
this.canvas = canvas;
Items = new ModuleUIItems<T, Data>(Container, templateAsset, generate);
Items = new ModuleUIItems<TItem, Data>(Container, templateAsset, generate);
ModuleUIItem<Data>.OnSelect += Settings;
}
@@ -45,13 +52,19 @@ namespace MuHua {
Slide.transform.position += offset * Time.deltaTime * 20;
}
/// <summary> 设置UI项 </summary>
public virtual void Settings(Data data) => this.data = data;
/// <summary> 释放资源 </summary>
public virtual void Release() => Items.Dispose();
/// <summary> 创建UI项 </summary>
public virtual void Create(List<Data> datas) => Items.Create(datas);
public virtual void Create(List<Data> datas, bool isClear = true) => Items.Create(datas, isClear);
/// <summary> 创建UI项 </summary>
public virtual void Create(Data data) => Items.Create(data);
/// <summary> 设置UI项 </summary>
public virtual void Settings(Data data) => this.data = data;
public virtual void Create(Data data, bool isClear = false) => Items.Create(data, isClear);
/// <summary> 遍历 </summary>
public virtual void ForEach(Action<TItem> action) => Items.ForEach(action);
/// <summary> 选择第一个 </summary>
public virtual void SelectFirst() => Items.SelectFirst();
/// <summary> 选择最后一个 </summary>
public virtual void SelectFinally() => Items.SelectFinally();
}
}