Files
ichni_Creator_Studio/Assets/Scripts/DynamicUI/Hierarchy/HierarchyTab.cs
TRAfoer 725009e354 大幅优化
Signed-off-by: TRAfoer <lhf190@outlook.com>
2025-10-05 11:45:32 +08:00

247 lines
8.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using DG.Tweening;
using Ichni.RhythmGame;
using Michsky.MUIP;
using Sirenix.Utilities;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Ichni.Editor
{
public partial class HierarchyTab : MonoBehaviour
{
public GameObject indentationLinePrefab;
public GameElement connectedGameElement;
public HierarchyTab parentTab;
public List<HierarchyTab> childTabList;
public int tabLayer;
public bool isSelected;
public bool isExpanded;
public Image BgImage;
public RectTransform tabRect;
public LayoutElement layoutElement;
public RectTransform tabMainRect;
public Button tabButton;
public Button expandButton;
public DoubleCheckButton deleteButton;
public TMP_Text tabButtonText;
public void SetTab(GameElement targetElement, GameElement parentElement)
{
transform.localScale = Vector3.one;
transform.DOScale(Vector3.one, 0.2f).SetEase(Ease.OutCirc).From(new Vector3(1, 0, 1));
connectedGameElement = targetElement;
tabButtonText.text = targetElement.elementName;
targetElement.connectedTab = this;
this.isExpanded = false;
this.isSelected = false;
this.childTabList = new List<HierarchyTab>();
if (parentElement == null)
{
this.tabLayer = 0;
this.parentTab = null;
this.transform.SetAsLastSibling();
}
else
{
this.parentTab = parentElement.connectedTab;
parentElement.connectedTab.childTabList.Add(this);
this.tabLayer = this.parentTab.tabLayer + 1;
this.transform.SetSiblingIndex(this.parentTab.transform.GetSiblingIndex() + GetAllChildrenCount(this.parentTab));
if (!this.parentTab.isExpanded)
{
this.isExpanded = false;
SetExpansion(false);
}
for (int i = 1; i <= this.tabLayer; i++)
{
float lineX = 30 * i - 15;
var d = Instantiate(indentationLinePrefab, tabRect);
d.GetComponent<RectTransform>().anchoredPosition = new Vector2(lineX, 0);
}
parentTab.SetStatus();
}
float posX = (30 * tabLayer);
tabMainRect.anchoredPosition = new Vector2(posX, tabMainRect.anchoredPosition.y);
tabButton.onClick.AddListener(SelectGameElement);
expandButton.onClick.AddListener(ExpandOrFold);
deleteButton.onConfirm = () => EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(connectedGameElement);
SetStatus();
}
private void OnDestroy()
{
transform.DOKill();
}
public void SetStatus()
{
expandButton.gameObject.SetActive(!connectedGameElement.childElementList.IsNullOrEmpty());
}
}
public partial class HierarchyTab
{
private int GetAllChildrenCount(HierarchyTab tab)
{
int c = tab.childTabList.Count;
for (int i = 0; i < tab.childTabList.Count; i++)
{
c += GetAllChildrenCount(tab.childTabList[i]);
}
return c;
}
public void ExecuteOrSelect()
{
if (EditorManager.instance.uiManager.hierarchy.NeedExecute)
{
EditorManager.instance.uiManager.hierarchy.upLoadElement = connectedGameElement;
}
else
{
SelectGameElement();
}
}
public void SelectGameElement()
{
if (Keyboard.current.leftCtrlKey.isPressed)
{
if (!isSelected)
{
EditorManager.instance.operationManager.AddSelectElement(connectedGameElement);
}
else
{
EditorManager.instance.operationManager.RemoveSelectElement(connectedGameElement);
}
}
else
{
EditorManager.instance.operationManager.ClearSelectedElements();
EditorManager.instance.operationManager.AddSelectElement(connectedGameElement);
}
if (EditorManager.instance.useQuickMove)
{
if (connectedGameElement is IHaveTransformSubmodule haveTransformSubmodule)
{
QuickMover quickMover = Instantiate(EditorManager.instance.basePrefabs.QuickMoveObj).GetComponent<QuickMover>();
quickMover.Initialize(haveTransformSubmodule);
}
else if (connectedGameElement is NoteBase noteBase && noteBase.noteVisual != null)
{
QuickMover quickMover = Instantiate(EditorManager.instance.basePrefabs.QuickMoveObj).GetComponent<QuickMover>();
quickMover.Initialize(noteBase.noteVisual);
}
else if (QuickMover.instance != null)
{
Destroy(QuickMover.instance.gameObject);
QuickMover.instance = null;
}
}
EditorManager.instance.uiManager.inspector.SetInspector(connectedGameElement);
}
public void ExpandOrFold()
{
ExpandOrFold(false);
}
public void ExpandOrFold(bool forceAllExPand = false)
{
this.childTabList.RemoveAll(s => s == null);
isExpanded = !isExpanded;
ExpandAnim();
if (isExpanded)
{
connectedGameElement.ScanAndAddEnableTypes();
List<GameElement> FixedList = !forceAllExPand ? connectedGameElement.GetChildrenByTypes() : connectedGameElement.childElementList;
// float startTime = Time.realtimeSinceStartup;
// connectedGameElement.childElementList.Sort();//TODO: 后续可以让玩家手动快速排序
Debug.Log(FixedList.Count);
ExpandAsync(FixedList);
}
else
{
//expandButton.transform.Rotate(new Vector3(0, 0, 180));
for (int i = childTabList.Count - 1; i >= 0; i--)
{
childTabList[i].SetExpansion(isExpanded);
}
}
}
private void SetExpansion(bool expand)
{
if (!expand && isExpanded)
{
for (int i = childTabList.Count; i > 0; i--)
{
childTabList[i - 1].SetExpansion(expand); //false
}
}
if (!expand)
{
parentTab.childTabList.Remove(this);
Destroy(gameObject);
EditorManager.instance.uiManager.hierarchy.tabList.Remove(this);
}
}
private void ExpandAnim()
{
expandButton.transform.DORotate(new Vector3(0, 0, !isExpanded ? 0f : 180f), 0.2f);
}
public bool isExpandDone = true;
private void ExpandImmediately(List<GameElement> FixedList)
{
float StrandTimeWhileStartUp = EditorManager.instance.CurrentFrameRate;
float frameTime = 1f / StrandTimeWhileStartUp * 3f;
for (var index = 0; index < FixedList.Count; index++)
{
var childElement = FixedList[index];
EditorManager.instance.uiManager.hierarchy.GenerateTab(childElement, connectedGameElement);
Debug.Log($"生成子Tab{childElement.elementName},索引:{index},总数:{FixedList.Count}");
// 如果处理时间超过帧时间限制,直接继续执行而不等待
// 移除了原来的 yield return null 等待逻辑
}
}
async void ExpandAsync(List<GameElement> FixedList)
{
isExpandDone = false;
for (var index = 0; index < FixedList.Count; index++)
{
var childElement = FixedList[index];
await EditorManager.instance.uiManager.hierarchy.GenerateTabAsync(childElement, connectedGameElement);
Debug.Log($"生成子Tab{childElement.elementName},索引:{index},总数:{FixedList.Count}");
if (!isExpanded) break;
}
isExpandDone = true;
}
}
}