This commit is contained in:
MuHua-123
2025-09-28 09:39:06 +08:00
parent e674a88be3
commit 153e254d33
21 changed files with 0 additions and 72 deletions
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5003b2a36519747449a4b6e4d7e5f56e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// 消息页面1
/// </summary>
public class UIMessage1 : ModuleUIPanel {
public Label Content => Q<Label>("Content");
public UIMessage1(VisualElement element) : base(element) { }
/// <summary>
/// 设置消息内容
/// </summary>
/// <param name="active"></param>
/// <param name="value"></param>
public void Settings(bool active, string value = "") {
element.EnableInClassList("document-page-hide", !active);
Content.text = value;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c0d9cdd61f07fb14a93de29e68c71787
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,31 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// 消息页面2
/// </summary>
public class UIMessage2 : ModuleUIPanel {
private Action callback;
public Label Content => Q<Label>("Content");
public Button Button => Q<Button>("Button");
public UIMessage2(VisualElement element) : base(element) {
Button.clicked += () => { callback?.Invoke(); Settings(false); };
}
public void Settings(bool active) {
element.EnableInClassList("document-page-hide", !active);
callback = null;
}
public void Settings(bool active, string value = "", Action callback = null) {
element.EnableInClassList("document-page-hide", !active);
Content.text = value;
this.callback = callback;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d21953f5fb6c41e40b2df711d80a42b3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,31 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// 消息页面3
/// </summary>
public class UIMessage3 : ModuleUIPanel {
private Action callback1;
private Action callback2;
public Label Content => Q<Label>("Content");
public Button Button1 => Q<Button>("Button1");
public Button Button2 => Q<Button>("Button2");
public UIMessage3(VisualElement element) : base(element) {
Button1.clicked += () => { callback1?.Invoke(); Settings(false); };
Button2.clicked += () => { callback2?.Invoke(); Settings(false); };
}
public void Settings(bool active, string value = "", Action callback1 = null, Action callback2 = null) {
element.EnableInClassList("document-page-hide", !active);
Content.text = value;
this.callback1 = callback1;
this.callback2 = callback2;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 496a1fe1e90187b45b931ec732c0bde6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,18 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIBannerTip : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7279e9c7234eb6645b7b1e172b70919d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,132 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// 指针提示
/// </summary>
public class UIGuidance : ModuleUIPanel {
private bool isDown;
private Action callback;
private Action<bool> ValueChanged;
private Vector2 offset;
private Vector3 originalPosition;
private Vector3 pointerPosition;
private VisualElement target;
private UIToggle toggle;
public Label Prompt => Q<Label>("Prompt");
public VisualElement Toggle => Q<VisualElement>("Toggle");
public VisualElement Button => Q<VisualElement>("Button");
public VisualElement Pointer => Q<VisualElement>("Pointer");
public UIGuidance(VisualElement element) : base(element) {
toggle = new UIToggle(Toggle);
toggle.ValueChanged += (value) => { ValueChanged?.Invoke(value); };
Button.RegisterCallback<ClickEvent>(ClickEvent);
element.RegisterCallback<MouseDownEvent>(MouseDownEvent);
element.RegisterCallback<MouseUpEvent>(MouseUpEvent);
}
public void Update() {
#if UNITY_EDITOR
if (target == null) { return; }
if (isDown) {
Vector3 mousePosition = UITool.GetMousePosition();
Vector3 differ = new Vector3(mousePosition.x, Screen.height - mousePosition.y) - pointerPosition;
Pointer.transform.position = originalPosition + differ;
}
else {
Pointer.transform.position = target.worldBound.position + offset;
}
#else
if (target == null) { return; }
Pointer.transform.position = target.worldBound.position + offset;
#endif
}
private void ClickEvent(ClickEvent evt) {
element.EnableInClassList("document-page-hide", true);
callback?.Invoke();
}
private void MouseDownEvent(MouseDownEvent evt) {
#if UNITY_EDITOR
isDown = true;
originalPosition = Pointer.transform.position;
Vector3 mousePosition = UITool.GetMousePosition();
pointerPosition = new Vector3(mousePosition.x, Screen.height - mousePosition.y);
#endif
}
private void MouseUpEvent(MouseUpEvent evt) {
isDown = false;
float x = Pointer.transform.position.x - target.worldBound.position.x;
float y = Pointer.transform.position.y - target.worldBound.position.y;
Vector3 offset = new Vector3(x, y);
Debug.Log(offset);
}
/// <summary> 打开提示 </summary>
public void Settings(string content, VisualElement target, Vector2 offset, Action callback) {
this.target = target;
this.offset = offset;
this.callback = callback;
Prompt.text = content;
element.EnableInClassList("document-page-hide", false);
}
/// <summary> 设置提示 </summary>
public void Settings(bool value, Action<bool> ValueChanged) {
this.ValueChanged = ValueChanged;
toggle.UpdateValue(value, false);
}
}
/// <summary>
/// 图案页指引
/// </summary>
public class UIPatternPageGuidance : ModuleUIPanel {
private bool isNot;
public VisualElement Top => Q<VisualElement>("Top");
public Button Button1 => Top.Q<Button>("Button1");// 创建图案
public Button Button4 => Top.Q<Button>("Button4");// 创建元素
public VisualElement Dashboard => Q<VisualElement>("Dashboard");
public VisualElement PatternLibrary => Q<VisualElement>("PatternLibrary");
public VisualElement TemplateLibrary => Q<VisualElement>("TemplateLibrary");
public UIPatternPageGuidance(VisualElement element) : base(element) { }
public void Guidance1() {
if (isNot) { return; }
string content = "第一步 点击【创建图案】按钮,即可新建一个空白画板,开始您的设计。";
Guidance(content, Button1, new Vector2(140, -55), Guidance2);
}
public void Guidance2() {
string content = "第二步 提供两种创作方式 \n1,选用模板:点击【图案模板】,选择模板后参考其结构与配色,进行纹样重构与创新设计。";
Guidance(content, TemplateLibrary, new Vector2(310, 0), Guidance3);
}
public void Guidance3() {
string content = "2,全新创作:点击【创建元素】创建空白图案框,自行选择【图案元素库】内的图案素材进行创新设计。";
Guidance(content, Button4, new Vector2(-530, -65), Guidance4);
}
public void Guidance4() {
string content = "导入个人素材:点击【自定义】-【导入素材】,导入后请点击【自定义】刷新以更新显示。";
Guidance(content, PatternLibrary, new Vector2(310, 0), Guidance5);
}
public void Guidance5() {
string content = "图案编辑功能:选中图案元素,可调整其颜色、位置、大小、镜像、连续排列等操作。\n画布设置:如设计透明背景的图案,可根据图案色彩风格自定义画板颜色,便于更直观地进行设计。";
Guidance(content, Dashboard, new Vector2(-530, 0), null);
}
public void Guidance(string content, VisualElement visual, Vector3 offset, Action action) {
// UIGuidance guidance = ModuleUI.I.popupManager.guidance;
// guidance.Settings(content, visual, offset, action);
// guidance.Settings(isNot, (value) => { isNot = value; });
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8df138b434ab51f40b134f831376120e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,31 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// 加载页面
/// </summary>
public class UILoading : ModuleUIPanel {
public UISliderH slider;
public VisualElement Slider => Q<VisualElement>("Slider");
public UILoading(VisualElement element, VisualElement canvas) : base(element) {
slider = new UISliderH(Slider, canvas);
}
/// <summary>
/// 设置加载进度
/// </summary>
/// <param name="active"></param>
/// <param name="value1"></param>
/// <param name="value2"></param>
public void Settings(bool active, float value1, string value2) {
element.EnableInClassList("document-page-hide", !active);
slider.UpdateValue(value1);
slider.Title.text = value2;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 637e7bc032a4bee4aa936fb481495299
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,170 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// UI快捷菜单
/// </summary>
public class UIShortcutMenu : ModuleUIPanel, UIControl {
/// <summary> 菜单模板 </summary>
public VisualTreeAsset menuTreeAsset;
/// <summary> 项目模板 </summary>
public VisualTreeAsset itemTreeAsset;
/// <summary> 数据列表 </summary>
public List<DataMenuItem> datas = new List<DataMenuItem>();
/// <summary> 控件列表 </summary>
public static List<UIControl> controls = new List<UIControl>();
public UIShortcutMenu(VisualElement element, VisualTreeAsset menuTreeAsset, VisualTreeAsset itemTreeAsset) : base(element) {
this.menuTreeAsset = menuTreeAsset;
this.itemTreeAsset = itemTreeAsset;
ModuleUI.AddControl(this);
}
public void Update() => controls.ForEach(control => control.Update());
public void Dispose() => controls.ForEach(control => control.Dispose());
/// <summary> 打开菜单 </summary>
public void Open() {
Close();
Vector3 position = UITool.GetMousePosition(element);
UIMenuPanel menuPanel = Create();
menuPanel.Settings(position, datas);
}
/// <summary> 关闭菜单 </summary>
public void Close() {
controls.ForEach(control => control.Dispose());
controls.Clear();
element.Clear();
}
/// <summary> 创建子菜单 </summary>
public UIMenuPanel Create() {
// 创建菜单元素
VisualElement menu = menuTreeAsset.Instantiate();
menu.EnableInClassList("menu", true);
element.Add(menu);
UIMenuPanel menuPanel = new UIMenuPanel(menu, itemTreeAsset, this);
controls.Add(menuPanel);
return menuPanel;
}
/// <summary> 添加菜单项(方法) </summary>
public void Add(string name, Action callback) {
string[] names = name.Split('/');
List<DataMenuItem> datas = this.datas;
for (int i = 0; i < names.Length; i++) {
DataMenuItem item = Find(names[i], datas);
datas = item.items;
if (i == names.Length - 1) { item.callback = callback; }
}
}
/// <summary> 移除菜单项 </summary>
public void Remove(string name) {
string[] names = name.Split('/');
List<DataMenuItem> datas = this.datas;
for (int i = 0; i < names.Length; i++) {
DataMenuItem item = Find(names[i], datas, false);
// 未找到,直接返回
if (item == null) { return; }
// 找到要移除的项
if (i == names.Length - 1) { datas.Remove(item); }
datas = item.items;
}
}
/// <summary> 查询菜单项 </summary>
public DataMenuItem Find(string name, List<DataMenuItem> datas, bool isCreate = true) {
DataMenuItem item = datas.Find(obj => obj.name == name);
if (item != null || !isCreate) { return item; }
item = new DataMenuItem { name = name };
datas.Add(item);
return item;
}
}
/// <summary>
/// UI快捷菜单面板
/// </summary>
public class UIMenuPanel : ModuleUIPanel, UIControl {
public readonly UIShortcutMenu parent;
public UIMenuPanel menuPanel;
public VisualElement submenu;
public ModuleUIItems<UIItem, DataMenuItem> items;
public VisualElement Container => Q<VisualElement>("Container");
public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset, UIShortcutMenu parent) : base(element) {
this.parent = parent;
items = new ModuleUIItems<UIItem, DataMenuItem>(Container, templateAsset,
(data, element) => new UIItem(data, element, this, parent));
}
public void Update() { }
public void Dispose() => items.Release();
public void Settings(Vector3 position, List<DataMenuItem> datas) {
items.Create(datas);
element.transform.position = position;
}
/// <summary> 打开子菜单 </summary>
public void Open(VisualElement submenu, List<DataMenuItem> datas) {
if (this.submenu == submenu) { return; }
// 更新子菜单
this.submenu = submenu;
if (menuPanel == null) { menuPanel = parent.Create(); }
float x = submenu.worldBound.position.x + submenu.resolvedStyle.width;
float y = submenu.worldBound.position.y - 5;
Vector3 position = new Vector3(x, y, 0);
menuPanel.Settings(position, datas);
bool isEnable = datas != null && datas.Count > 0;
menuPanel.OpenSubmenu(isEnable);
}
public void OpenSubmenu(bool open) {
element.EnableInClassList("menu-hide", !open);
menuPanel?.OpenSubmenu(false);
}
/// <summary> UI项目 </summary>
public class UIItem : ModuleUIItem<DataMenuItem> {
public readonly UIMenuPanel parent;
public readonly UIShortcutMenu shortcutMenu;
public Label Name => element.Q<Label>("Name");
public VisualElement Arrow => element.Q<VisualElement>("Arrow");
public UIItem(DataMenuItem value, VisualElement element, UIMenuPanel parent, UIShortcutMenu shortcutMenu) : base(value, element) {
this.parent = parent;
this.shortcutMenu = shortcutMenu;
Name.text = value.name;
Arrow.EnableInClassList("menu-arrow-hide", value.items == null || value.items.Count == 0);
element.RegisterCallback<MouseDownEvent>(MouseDownEvent);
element.RegisterCallback<MouseMoveEvent>(MouseMoveEvent);
}
private void MouseDownEvent(MouseDownEvent evt) {
value.callback?.Invoke();
shortcutMenu.Close();
}
private void MouseMoveEvent(MouseMoveEvent evt) {
parent.Open(element, value.items);
}
}
}
/// <summary>
/// 菜单项目
/// </summary>
public class DataMenuItem {
/// <summary> 名称 </summary>
public string name;
/// <summary> 回调 </summary>
public Action callback;
/// <summary> 子菜单项 </summary>
public List<DataMenuItem> items = new List<DataMenuItem>();
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 422a458e7229d6b4a8fff66af1840238
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: