增加UIToggle和UIDropdown

This commit is contained in:
MuHua-123
2025-04-22 15:45:57 +08:00
parent f6d1cd4d87
commit 9a34f2bd18
33 changed files with 755 additions and 32 deletions
@@ -0,0 +1,124 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// 下拉框
/// </summary>
public class UIDropdown<T> : ModuleUIPanel {
/// <summary> 绑定的画布 </summary>
internal readonly VisualElement canvas;
/// <summary> 下拉框容器 </summary>
internal readonly VisualElement DropdownContainer;
/// <summary> 下拉框滚动视图 </summary>
internal readonly VisualElement DropdownScrollView;
/// <summary> 选项模板 </summary>
internal readonly VisualTreeAsset TemplateAsset;
/// <summary> 值改变时 </summary>
public event Action<T> ValueChanged;
public T value;
public List<T> list = new List<T>();
internal UIScrollView scrollView;
internal ModuleUIItems<UIDropdownItem, T> DropdownItems;
/// <summary> 数据操作 </summary
public T this[int index] => list[index];
/// <summary> 总数 </summary
public int Count => list.Count;
internal Label Tag => Q<Label>("Tag");
internal Label Title => Q<Label>("Title");
internal VisualElement Input => Q<VisualElement>("Input");
internal VisualElement Icon => Q<VisualElement>("Icon");
internal VisualElement Positioner => Q<VisualElement>("Positioner");
public UIDropdown(VisualElement element, VisualElement canvas, VisualTreeAsset TemplateAsset) : base(element) {
this.canvas = canvas;
this.TemplateAsset = TemplateAsset;
DropdownContainer = new VisualElement();
DropdownContainer.EnableInClassList("dropdown-container", true);
DropdownContainer.EnableInClassList("dropdown-hide", true);
canvas.Add(DropdownContainer);
DropdownScrollView = Q<VisualElement>("DropdownScrollView");
DropdownScrollView.EnableInClassList("dropdown-hide", false);
DropdownContainer.Add(DropdownScrollView);
scrollView = new UIScrollView(DropdownScrollView, DropdownContainer, UIDirection.FromTopToBottom);
DropdownItems = new ModuleUIItems<UIDropdownItem, T>(scrollView.Container, TemplateAsset,
(data, element) => new UIDropdownItem(data, element, this));
Input.RegisterCallback<ClickEvent>(evt => OpenDropdown());
DropdownContainer.RegisterCallback<PointerDownEvent>(evt => CloseDropdown());
}
public virtual void Release() {
canvas.Remove(DropdownContainer);
DropdownItems.Release();
}
public virtual void Update() {
scrollView.Update();
}
/// <summary> 打开下拉框 </summary>
public void OpenDropdown() {
float width = Positioner.resolvedStyle.width;
Vector2 position = Positioner.worldBound.position;
DropdownScrollView.style.width = width;
DropdownScrollView.style.left = position.x;
DropdownScrollView.style.top = position.y;
DropdownContainer.EnableInClassList("dropdown-hide", false);
DropdownItems.Create(list);
}
/// <summary> 关闭下拉框 </summary>
public void CloseDropdown() {
DropdownContainer.EnableInClassList("dropdown-hide", true);
}
/// <summary> 更新值 </summary>
public void UpdateValue(T value, bool send = true) {
this.value = value;
Tag.text = value.ToString();
if (send) { ValueChanged?.Invoke(value); }
}
/// <summary> 设置值 </summary>
public void SetValue(List<T> list) {
this.list = list;
if (list.Count > 0) { UpdateValue(list[0], false); }
}
#region UI项定义
/// <summary>
/// 设置标题 UI项
/// </summary>
internal class UIDropdownItem : ModuleUIItem<T> {
public readonly UIDropdown<T> parent;
public Button Button => Q<Button>();
public VisualElement Check => Q<VisualElement>("Check");
public UIDropdownItem(T value, VisualElement element, UIDropdown<T> parent) : base(value, element) {
this.parent = parent;
Button.text = value.ToString();
Button.clicked += Select;
Check.EnableInClassList("dropdown-hide", !value.Equals(parent.value));
}
public override void DefaultState() {
Check.EnableInClassList("dropdown-hide", true);
}
public override void SelectState() {
parent.UpdateValue(value);
parent.CloseDropdown();
Check.EnableInClassList("dropdown-hide", false);
}
}
#endregion
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 963896b6158778848b262b161abaa3a8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -24,21 +24,16 @@ namespace MuHua {
public readonly UIScroller horizontal;
public readonly UIScroller vertical;
public readonly VisualElement Viewport;
public readonly VisualElement Container;
public readonly VisualElement ScrollerHorizontal;
public readonly VisualElement ScrollerVertical;
public VisualElement Viewport => Q<VisualElement>("Viewport");
public VisualElement Container => Q<VisualElement>("Container");
public VisualElement ScrollerHorizontal => Q<VisualElement>("ScrollerHorizontal");
public VisualElement ScrollerVertical => Q<VisualElement>("ScrollerVertical");
public UIScrollView(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.HorizontalAndVertical,
UIDirection sh = UIDirection.FromLeftToRight, UIDirection sv = UIDirection.FromTopToBottom) : base(element) {
this.canvas = canvas;
this.direction = direction;
Viewport = element.Q<VisualElement>("Viewport");
Container = element.Q<VisualElement>("Container");
ScrollerHorizontal = element.Q<VisualElement>("ScrollerHorizontal");
ScrollerVertical = element.Q<VisualElement>("ScrollerVertical");
element.generateVisualContent += ElementGenerateVisualContent;
if (sh == UIDirection.FromLeftToRight) { horizontal = new UIScroller(ScrollerHorizontal, canvas, sh); }
@@ -23,14 +23,12 @@ namespace MuHua {
public readonly UIScrollerFunc scrollerFunc;
public readonly VisualElement Dragger;
public VisualElement Dragger => Q<VisualElement>("Dragger");
public UIScroller(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromLeftToRight) : base(element) {
this.canvas = canvas;
this.direction = direction;
Dragger = element.Q<VisualElement>("Dragger");
if (direction == UIDirection.FromLeftToRight) { scrollerFunc = new FromLeftToRight(this); }
if (direction == UIDirection.FromRightToLeft) { scrollerFunc = new FromRightToLeft(this); }
if (direction == UIDirection.FromTopToBottom) { scrollerFunc = new FromTopToBottom(this); }
@@ -23,18 +23,14 @@ namespace MuHua {
public readonly UISliderFunc sliderFunc;
public readonly VisualElement Container;
public readonly VisualElement Tracker;
public readonly VisualElement Dragger;
public VisualElement Container => Q<VisualElement>("Container");
public VisualElement Tracker => Q<VisualElement>("Tracker");
public VisualElement Dragger => Q<VisualElement>("Dragger");
public UISlider(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromLeftToRight) : base(element) {
this.canvas = canvas;
this.direction = direction;
Container = element.Q<VisualElement>("Container");
Tracker = element.Q<VisualElement>("Tracker");
Dragger = element.Q<VisualElement>("Dragger");
if (direction == UIDirection.FromLeftToRight) { sliderFunc = new FromLeftToRight(this); }
if (direction == UIDirection.FromRightToLeft) { sliderFunc = new FromRightToLeft(this); }
if (direction == UIDirection.FromTopToBottom) { sliderFunc = new FromTopToBottom(this); }
@@ -0,0 +1,37 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// 开关
/// </summary>
public class UIToggle : ModuleUIPanel {
/// <summary> 值改变时 </summary>
public event Action<bool> ValueChanged;
public bool value;// 当前值
/// <summary> 标题 </summary>
public string title {
get => Title.text;
set => Title.text = value;
}
public Label Title => Q<Label>("Title");
public VisualElement Input => Q<VisualElement>("Input");
public VisualElement Check => Q<VisualElement>("Check");
public UIToggle(VisualElement element) : base(element) {
Input.RegisterCallback<ClickEvent>(evt => UpdateValue(!value));
}
/// <summary> 更新值 </summary>
public void UpdateValue(bool value, bool send = true) {
this.value = value;
Check.EnableInClassList("toggle-check-hide", !value);
if (send) { ValueChanged?.Invoke(value); }
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3d9f9369fdae61a42ba2cc2d4a52b2ea
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -3,10 +3,6 @@ using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
#if ENABLE_INPUT_SYSTEM && UNITY_INPUT_SYSTEM_PACKAGE
using UnityEngine.InputSystem;
#endif
namespace MuHua {
/// <summary>
/// 悬浮窗口
@@ -19,12 +15,12 @@ namespace MuHua {
private Vector3 pointerPosition;
private Vector3 originalPosition;
public VisualElement Window => element.Q<VisualElement>("Window");
public VisualElement Top => element.Q<VisualElement>("Top");
public VisualElement Container => element.Q<VisualElement>("Container");
public VisualElement Window => Q<VisualElement>("Window");
public VisualElement Top => Q<VisualElement>("Top");
public VisualElement Container => Q<VisualElement>("Container");
public Label Title => element.Q<Label>("Title");
public VisualElement Close => element.Q<VisualElement>("Close");
public Label Title => Q<Label>("Title");
public VisualElement Close => Q<VisualElement>("Close");
public UIWindow(VisualElement element, VisualElement canvas) : base(element) {
this.canvas = canvas;