增加UIToggle和UIDropdown
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user