mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-06-23 08:53:05 +08:00

* Fixed not being able to set values on Enums * [MONO] Fixed an issue where GameObjects in no scene (a Resource/Asset) would display nothing for their scene name, instead of "None (Resource/Asset)". * Some UI layout cleanups and fixes, the Child/Component lists on the GameObject inspector should now expand to fill available height.
220 lines
8.1 KiB
C#
220 lines
8.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityExplorer.Helpers;
|
|
using UnityExplorer.UI;
|
|
using UnityExplorer.UI.Shared;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UnityExplorer.Input;
|
|
|
|
namespace UnityExplorer.Inspectors.GameObjects
|
|
{
|
|
public class ChildList
|
|
{
|
|
internal static ChildList Instance;
|
|
|
|
public ChildList()
|
|
{
|
|
Instance = this;
|
|
}
|
|
|
|
public static PageHandler s_childListPageHandler;
|
|
private static GameObject s_childListContent;
|
|
|
|
private static GameObject[] s_allChildren = new GameObject[0];
|
|
private static readonly List<GameObject> s_childrenShortlist = new List<GameObject>();
|
|
private static int s_lastChildCount;
|
|
|
|
private static readonly List<Text> s_childListTexts = new List<Text>();
|
|
private static readonly List<Toggle> s_childListToggles = new List<Toggle>();
|
|
|
|
internal void RefreshChildObjectList()
|
|
{
|
|
var go = GameObjectInspector.ActiveInstance.TargetGO;
|
|
|
|
s_allChildren = new GameObject[go.transform.childCount];
|
|
for (int i = 0; i < go.transform.childCount; i++)
|
|
{
|
|
var child = go.transform.GetChild(i);
|
|
s_allChildren[i] = child.gameObject;
|
|
}
|
|
|
|
var objects = s_allChildren;
|
|
s_childListPageHandler.ListCount = objects.Length;
|
|
|
|
int newCount = 0;
|
|
|
|
foreach (var itemIndex in s_childListPageHandler)
|
|
{
|
|
newCount++;
|
|
|
|
// normalized index starting from 0
|
|
var i = itemIndex - s_childListPageHandler.StartIndex;
|
|
|
|
if (itemIndex >= objects.Length)
|
|
{
|
|
if (i > s_lastChildCount || i >= s_childListTexts.Count)
|
|
break;
|
|
|
|
GameObject label = s_childListTexts[i].transform.parent.parent.gameObject;
|
|
if (label.activeSelf)
|
|
label.SetActive(false);
|
|
}
|
|
else
|
|
{
|
|
GameObject obj = objects[itemIndex];
|
|
|
|
if (!obj)
|
|
continue;
|
|
|
|
if (i >= s_childrenShortlist.Count)
|
|
{
|
|
s_childrenShortlist.Add(obj);
|
|
AddChildListButton();
|
|
}
|
|
else
|
|
{
|
|
s_childrenShortlist[i] = obj;
|
|
}
|
|
|
|
var text = s_childListTexts[i];
|
|
|
|
var name = obj.name;
|
|
|
|
if (obj.transform.childCount > 0)
|
|
name = $"<color=grey>[{obj.transform.childCount}]</color> {name}";
|
|
|
|
text.text = name;
|
|
text.color = obj.activeSelf ? Color.green : Color.red;
|
|
|
|
var tog = s_childListToggles[i];
|
|
tog.isOn = obj.activeSelf;
|
|
|
|
var label = text.transform.parent.parent.gameObject;
|
|
if (!label.activeSelf)
|
|
{
|
|
label.SetActive(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
s_lastChildCount = newCount;
|
|
}
|
|
|
|
internal static void OnChildListObjectClicked(int index)
|
|
{
|
|
if (GameObjectInspector.ActiveInstance == null)
|
|
return;
|
|
|
|
if (index >= s_childrenShortlist.Count || !s_childrenShortlist[index])
|
|
return;
|
|
|
|
GameObjectInspector.ActiveInstance.ChangeInspectorTarget(s_childrenShortlist[index]);
|
|
GameObjectInspector.ActiveInstance.Update();
|
|
}
|
|
|
|
internal static void OnChildListPageTurn()
|
|
{
|
|
if (Instance == null)
|
|
return;
|
|
|
|
Instance.RefreshChildObjectList();
|
|
}
|
|
|
|
internal static void OnToggleClicked(int index, bool newVal)
|
|
{
|
|
if (GameObjectInspector.ActiveInstance == null)
|
|
return;
|
|
|
|
if (index >= s_childrenShortlist.Count || !s_childrenShortlist[index])
|
|
return;
|
|
|
|
var obj = s_childrenShortlist[index];
|
|
obj.SetActive(newVal);
|
|
}
|
|
|
|
#region UI CONSTRUCTION
|
|
|
|
internal void ConstructChildList(GameObject parent)
|
|
{
|
|
var vertGroupObj = UIFactory.CreateVerticalGroup(parent, new Color(1, 1, 1, 0));
|
|
var vertGroup = vertGroupObj.GetComponent<VerticalLayoutGroup>();
|
|
vertGroup.childForceExpandHeight = true;
|
|
vertGroup.childForceExpandWidth = false;
|
|
vertGroup.childControlWidth = true;
|
|
vertGroup.spacing = 5;
|
|
var vertLayout = vertGroupObj.AddComponent<LayoutElement>();
|
|
vertLayout.minWidth = 120;
|
|
vertLayout.flexibleWidth = 25000;
|
|
vertLayout.minHeight = 200;
|
|
vertLayout.flexibleHeight = 5000;
|
|
|
|
var childTitleObj = UIFactory.CreateLabel(vertGroupObj, TextAnchor.MiddleLeft);
|
|
var childTitleText = childTitleObj.GetComponent<Text>();
|
|
childTitleText.text = "Children";
|
|
childTitleText.color = Color.grey;
|
|
childTitleText.fontSize = 14;
|
|
var childTitleLayout = childTitleObj.AddComponent<LayoutElement>();
|
|
childTitleLayout.minHeight = 30;
|
|
|
|
var childrenScrollObj = UIFactory.CreateScrollView(vertGroupObj, out s_childListContent, out SliderScrollbar scroller, new Color(0.07f, 0.07f, 0.07f));
|
|
var contentLayout = childrenScrollObj.GetComponent<LayoutElement>();
|
|
contentLayout.minHeight = 50;
|
|
|
|
s_childListPageHandler = new PageHandler(scroller);
|
|
s_childListPageHandler.ConstructUI(vertGroupObj);
|
|
s_childListPageHandler.OnPageChanged += OnChildListPageTurn;
|
|
}
|
|
|
|
internal void AddChildListButton()
|
|
{
|
|
int thisIndex = s_childListTexts.Count;
|
|
|
|
GameObject btnGroupObj = UIFactory.CreateHorizontalGroup(s_childListContent, new Color(0.07f, 0.07f, 0.07f));
|
|
HorizontalLayoutGroup btnGroup = btnGroupObj.GetComponent<HorizontalLayoutGroup>();
|
|
btnGroup.childForceExpandWidth = true;
|
|
btnGroup.childControlWidth = true;
|
|
btnGroup.childForceExpandHeight = false;
|
|
btnGroup.childControlHeight = true;
|
|
LayoutElement btnLayout = btnGroupObj.AddComponent<LayoutElement>();
|
|
btnLayout.flexibleWidth = 320;
|
|
btnLayout.minHeight = 25;
|
|
btnLayout.flexibleHeight = 0;
|
|
btnGroupObj.AddComponent<Mask>();
|
|
|
|
var toggleObj = UIFactory.CreateToggle(btnGroupObj, out Toggle toggle, out Text toggleText, new Color(0.3f, 0.3f, 0.3f));
|
|
var toggleLayout = toggleObj.AddComponent<LayoutElement>();
|
|
toggleLayout.minHeight = 25;
|
|
toggleLayout.minWidth = 25;
|
|
toggleText.text = "";
|
|
toggle.isOn = false;
|
|
s_childListToggles.Add(toggle);
|
|
toggle.onValueChanged.AddListener((bool val) => { OnToggleClicked(thisIndex, val); });
|
|
|
|
GameObject mainButtonObj = UIFactory.CreateButton(btnGroupObj);
|
|
LayoutElement mainBtnLayout = mainButtonObj.AddComponent<LayoutElement>();
|
|
mainBtnLayout.minHeight = 25;
|
|
mainBtnLayout.flexibleHeight = 0;
|
|
mainBtnLayout.minWidth = 25;
|
|
mainBtnLayout.flexibleWidth = 999;
|
|
Button mainBtn = mainButtonObj.GetComponent<Button>();
|
|
ColorBlock mainColors = mainBtn.colors;
|
|
mainColors.normalColor = new Color(0.07f, 0.07f, 0.07f);
|
|
mainColors.highlightedColor = new Color(0.2f, 0.2f, 0.2f, 1);
|
|
mainBtn.colors = mainColors;
|
|
mainBtn.onClick.AddListener(() => { OnChildListObjectClicked(thisIndex); });
|
|
|
|
Text mainText = mainButtonObj.GetComponentInChildren<Text>();
|
|
mainText.alignment = TextAnchor.MiddleLeft;
|
|
mainText.horizontalOverflow = HorizontalWrapMode.Overflow;
|
|
mainText.resizeTextForBestFit = true;
|
|
mainText.resizeTextMaxSize = 14;
|
|
mainText.resizeTextMinSize = 10;
|
|
s_childListTexts.Add(mainText);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|