Files
ichni_Creator_Studio/Assets/Scripts/DynamicUI/Inspector/IHaveInspection.cs
2026-05-02 21:08:13 +08:00

304 lines
16 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;
using System.Collections;
using System.Collections.Generic;
using Ichni;
using Ichni.Editor;
using Ichni.RhythmGame;
using Lean.Pool;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Profiling;
using UnityEngine.UI;
using Object = UnityEngine.Object;
namespace Ichni.Editor
{
public interface IHaveInspection
{
public RectTransform WindowRect { get; set; }
public List<DynamicUIContainer> Containers { get; set; }
public Dictionary<string, DynamicUISubcontainer> MarkedSubcontainers { get; set; }
public Dictionary<string, DynamicUIElement> MarkedElements { get; set; }
public CompositeParameterWindow GenerateCompositeParameterWindow(IBaseElement baseElement, string title,
string parameterName)
{
CompositeParameterWindow compositeParameterWindow =
Object.Instantiate(EditorManager.instance.basePrefabs.compositeParameterWindow,
EditorManager.instance.uiManager.WindowsCanvas.GetComponent<RectTransform>())
.GetComponent<CompositeParameterWindow>();
compositeParameterWindow.Initialize(baseElement, title, parameterName);
return compositeParameterWindow;
}
public GraphicalFlexibleFloatWindow GenerateGraphicalFlexibleFloatWindow(IBaseElement baseElement, string title, FlexibleFloat[] FlexibleFloats, string[] subTitle)
{
GraphicalFlexibleFloatWindow graphicalFlexibleFloatWindow = Object.Instantiate(EditorManager.instance.basePrefabs.graphicalFlexibleFloatWindow, EditorManager.instance.uiManager.WindowsCanvas.GetComponent<RectTransform>())
.GetComponent<GraphicalFlexibleFloatWindow>();
graphicalFlexibleFloatWindow.Initialize(baseElement, title, FlexibleFloats, subTitle);
return graphicalFlexibleFloatWindow;
}
public SampleWindow GenerateSampler(GameElement baseElement, string title)
{
SampleWindow sampler = Object.Instantiate(EditorManager.instance.basePrefabs.sampler, EditorManager.instance.uiManager.WindowsCanvas.GetComponent<RectTransform>())
.GetComponent<SampleWindow>();
sampler.Initialize(baseElement, title);
return sampler;
}
public DynamicUIContainer GenerateContainer(string titleText)
{
DynamicUIContainer container =
LeanPool.Spawn(EditorManager.instance.basePrefabs.dynamicUIContainer, WindowRect)
.GetComponent<DynamicUIContainer>();
container.Initialize(titleText);
Containers.Add(container);
return container;
}
public DynamicUIContainer GenerateContainer()
{
DynamicUIContainer container =
LeanPool.Spawn(EditorManager.instance.basePrefabs.dynamicUIContainer, WindowRect)
.GetComponent<DynamicUIContainer>();
// 对象池复用安全:不能 Destroy title改为 SetActive(false)
container.title.gameObject.SetActive(false);
// 初始化内部状态(不传题目)
if (container.subcontainers == null)
container.subcontainers = new System.Collections.Generic.List<DynamicUISubcontainer>();
else
container.subcontainers.Clear();
container.gridWidth = 0;
container.gridHeight = 0;
Containers.Add(container);
return container;
}
public DynamicUIButton GenerateButton(IBaseElement baseElement, DynamicUISubcontainer subcontainer, string title,
UnityAction function)
{
DynamicUIButton button = LeanPool.Spawn(EditorManager.instance.basePrefabs.button, subcontainer.rect)
.GetComponent<DynamicUIButton>();
button.SetText(title);
button.Initialize(baseElement, title, string.Empty);
button.ApplyFunction(function);
var nav = new Navigation { mode = Navigation.Mode.None };
button.button.navigation = nav;
subcontainer.dynamicUIElements.Add(button);
return button;
}
public DynamicUIToggle GenerateToggle(IBaseElement baseElement, DynamicUISubcontainer subcontainer, string title,
string parameterName = "")
{
DynamicUIToggle toggle = LeanPool.Spawn(EditorManager.instance.basePrefabs.toggle, subcontainer.rect)
.GetComponent<DynamicUIToggle>();
toggle.Initialize(baseElement, title, parameterName);
var nav = new Navigation { mode = Navigation.Mode.None };
toggle.toggle.navigation = nav;
subcontainer.dynamicUIElements.Add(toggle);
return toggle;
}
public DynamicUIInputField GenerateInputField(DynamicUISubcontainer subcontainer,
string title, string defaultText = "") //不与参数绑定的InputField
{
DynamicUIInputField inputField = LeanPool
.Spawn(EditorManager.instance.basePrefabs.inputField, subcontainer.rect)
.GetComponent<DynamicUIInputField>();
inputField.Initialize(null, title, string.Empty);
inputField.SetDefaultValue(defaultText);
var nav = new Navigation { mode = Navigation.Mode.None };
inputField.inputField.navigation = nav;
subcontainer.dynamicUIElements.Add(inputField);
return inputField;
}
public DynamicUIInputField GenerateInputField(IBaseElement baseElement,
DynamicUISubcontainer subcontainer, string title, string parameterName, bool isAutoUpdate = false) //与参数绑定的InputField
{
DynamicUIInputField inputField = LeanPool
.Spawn(EditorManager.instance.basePrefabs.inputField, subcontainer.rect)
.GetComponent<DynamicUIInputField>();
inputField.Initialize(baseElement, title, parameterName);
var nav = new Navigation { mode = Navigation.Mode.None };
inputField.inputField.navigation = nav;
subcontainer.dynamicUIElements.Add(inputField);
return inputField;
}
public DynamicUIVector3InputField GenerateVector3InputField(DynamicUISubcontainer subcontainer, string title,
Vector3 defaultVector3 = default)
{
DynamicUIVector3InputField vector3InputField =
LeanPool.Spawn(EditorManager.instance.basePrefabs.vector3InputField, subcontainer.rect)
.GetComponent<DynamicUIVector3InputField>();
vector3InputField.Initialize(null, title, string.Empty);
vector3InputField.SetDefaultValue(defaultVector3);
var nav = new Navigation { mode = Navigation.Mode.None };
vector3InputField.inputFieldX.navigation = nav;
vector3InputField.inputFieldY.navigation = nav;
vector3InputField.inputFieldZ.navigation = nav;
subcontainer.dynamicUIElements.Add(vector3InputField);
return vector3InputField;
}
public DynamicUIVector3InputField GenerateVector3InputField(IBaseElement baseElement,
DynamicUISubcontainer subcontainer, string title, string parameterName, bool isAutoUpdate = false)
{
DynamicUIVector3InputField vector3InputField =
LeanPool.Spawn(EditorManager.instance.basePrefabs.vector3InputField, subcontainer.rect)
.GetComponent<DynamicUIVector3InputField>();
vector3InputField.Initialize(baseElement, title, parameterName);
vector3InputField.SetAutoUpdate(isAutoUpdate);
var nav = new Navigation { mode = Navigation.Mode.None };
vector3InputField.inputFieldX.navigation = nav;
vector3InputField.inputFieldY.navigation = nav;
vector3InputField.inputFieldZ.navigation = nav;
subcontainer.dynamicUIElements.Add(vector3InputField);
return vector3InputField;
}
public DynamicUIVector2InputField GenerateVector2InputField(IBaseElement baseElement,
DynamicUISubcontainer subcontainer, string title, string parameterName, bool isAutoUpdate = false)
{
DynamicUIVector2InputField vector2InputField =
LeanPool.Spawn(EditorManager.instance.basePrefabs.vector2InputField, subcontainer.rect)
.GetComponent<DynamicUIVector2InputField>();
vector2InputField.Initialize(baseElement, title, parameterName);
vector2InputField.SetAutoUpdate(isAutoUpdate);
var nav = new Navigation { mode = Navigation.Mode.None };
vector2InputField.inputFieldX.navigation = nav;
vector2InputField.inputFieldY.navigation = nav;
subcontainer.dynamicUIElements.Add(vector2InputField);
return vector2InputField;
}
public DynamicUIBaseColorPicker GenerateBaseColorPicker(IBaseElement baseElement, DynamicUISubcontainer subcontainer,
string title, string parameterName)
{
DynamicUIBaseColorPicker colorPicker = LeanPool
.Spawn(EditorManager.instance.basePrefabs.baseColorPicker, subcontainer.rect)
.GetComponent<DynamicUIBaseColorPicker>();
colorPicker.Initialize(baseElement, title, parameterName);
var nav = new Navigation { mode = Navigation.Mode.None };
colorPicker.inputFieldBaseR.navigation = nav;
colorPicker.inputFieldBaseG.navigation = nav;
colorPicker.inputFieldBaseB.navigation = nav;
colorPicker.inputFieldBaseA.navigation = nav;
subcontainer.dynamicUIElements.Add(colorPicker);
return colorPicker;
}
public DynamicUIEmissionColorPicker GenerateEmissionColorPicker(IBaseElement baseElement,
DynamicUISubcontainer subcontainer,
string title, string emissionEnabledName, string emissionColorName, string emissionIntensityName)
{
DynamicUIEmissionColorPicker colorPicker = LeanPool
.Spawn(EditorManager.instance.basePrefabs.emissionColorPicker, subcontainer.rect)
.GetComponent<DynamicUIEmissionColorPicker>();
colorPicker.Initialize(baseElement, title, emissionEnabledName, emissionColorName, emissionIntensityName);
var nav = new Navigation { mode = Navigation.Mode.None };
colorPicker.inputFieldEmissionR.navigation = nav;
colorPicker.inputFieldEmissionG.navigation = nav;
colorPicker.inputFieldEmissionB.navigation = nav;
colorPicker.inputFieldEmissionI.navigation = nav;
subcontainer.dynamicUIElements.Add(colorPicker);
return colorPicker;
}
public DynamicUIHintText GenerateHintText(IBaseElement baseElement, DynamicUISubcontainer subcontainer,
string content)
{
DynamicUIHintText hintText = LeanPool.Spawn(EditorManager.instance.basePrefabs.hintText, subcontainer.rect)
.GetComponent<DynamicUIHintText>();
hintText.Initialize(baseElement, string.Empty, string.Empty);
hintText.SetContent(content);
subcontainer.dynamicUIElements.Add(hintText);
return hintText;
}
public DynamicUIHintText GenerateHintText(IBaseElement baseElement, DynamicUISubcontainer subcontainer, Func<string> action)
{
DynamicUIHintText hintText = LeanPool.Spawn(EditorManager.instance.basePrefabs.hintText, subcontainer.rect)
.GetComponent<DynamicUIHintText>();
hintText.Initialize(baseElement, string.Empty, string.Empty);
hintText.SetUpdatingContent(action);
subcontainer.dynamicUIElements.Add(hintText);
return hintText;
}
public DynamicUIParameterText GenerateParameterText(IBaseElement baseElement, DynamicUISubcontainer subcontainer,
string title, string parameterName, bool isAutoUpdate = false)
{
DynamicUIParameterText parameterText = LeanPool
.Spawn(EditorManager.instance.basePrefabs.parameterText, subcontainer.rect)
.GetComponent<DynamicUIParameterText>();
parameterText.Initialize(baseElement, title, parameterName);
parameterText.SetAutoUpdate(isAutoUpdate);
subcontainer.dynamicUIElements.Add(parameterText);
return parameterText;
}
public DynamicUIEnumDropdown GenerateDropdown(IBaseElement baseElement, DynamicUISubcontainer subcontainer,
string title, System.Type enumType, string parameterName)
{
DynamicUIEnumDropdown enumDropdown = LeanPool
.Spawn(EditorManager.instance.basePrefabs.enumDropdown, subcontainer.rect)
.GetComponent<DynamicUIEnumDropdown>();
enumDropdown.SetUpEnum(enumType);
enumDropdown.Initialize(baseElement, title, parameterName);
var nav = new Navigation { mode = Navigation.Mode.None };
subcontainer.dynamicUIElements.Add(enumDropdown);
return enumDropdown;
}
public DynamicUIStringListDropdown GenerateDropdown(IBaseElement baseElement, DynamicUISubcontainer subcontainer,
string title, List<string> stringList, string parameterName)
{
DynamicUIStringListDropdown stringListDropdown = LeanPool
.Spawn(EditorManager.instance.basePrefabs.stringListDropdown, subcontainer.rect)
.GetComponent<DynamicUIStringListDropdown>();
stringListDropdown.SetUpStringList(stringList);
stringListDropdown.Initialize(baseElement, title, parameterName);
var nav = new Navigation { mode = Navigation.Mode.None };
subcontainer.dynamicUIElements.Add(stringListDropdown);
return stringListDropdown;
}
// 新增HSV色盘生成方法
public HsvDrawer GenerateHsvDrawer(IBaseElement baseElement, DynamicUISubcontainer subcontainer, string title, string parameterName)
{
HsvDrawer hsvDrawer = LeanPool
.Spawn(EditorManager.instance.basePrefabs.hsvDrawer, subcontainer.rect)
.GetComponent<HsvDrawer>();
hsvDrawer.Initialize(baseElement, title, parameterName);
subcontainer.dynamicUIElements.Add(hsvDrawer);
return hsvDrawer;
}
public DynamicUISlider GenerateSlider(DynamicUISubcontainer subcontainer,
string title, float defaultValue = 0.5f, float min = 0f, float max = 1f, bool wholeNumbers = false)
{
DynamicUISlider slider = LeanPool
.Spawn(EditorManager.instance.basePrefabs.slider, subcontainer.rect)
.GetComponent<DynamicUISlider>();
slider.Initialize(null, title, string.Empty, min, max, wholeNumbers);
slider.slider.SetValueWithoutNotify(defaultValue);
subcontainer.dynamicUIElements.Add(slider);
return slider;
}
public DynamicUISlider GenerateSlider(IBaseElement baseElement,
DynamicUISubcontainer subcontainer, string title, string parameterName,
float min = 0f, float max = 1f, bool wholeNumbers = false)
{
DynamicUISlider slider = LeanPool
.Spawn(EditorManager.instance.basePrefabs.slider, subcontainer.rect)
.GetComponent<DynamicUISlider>();
slider.Initialize(baseElement, title, parameterName, min, max, wholeNumbers);
var nav = new Navigation { mode = Navigation.Mode.None };
slider.slider.navigation = nav;
subcontainer.dynamicUIElements.Add(slider);
return slider;
}
}
}