BITFALL/Assets/GSpawn - Level Designer/Scripts/Core/PluginSettings.cs

149 lines
6.5 KiB
C#

#if UNITY_EDITOR
using UnityEditor;
using UnityEngine.UIElements;
using UnityEngine;
using System;
using System.Collections.Generic;
#if UNITY_2021
using UnityEditor.UIElements;
#endif
namespace GSpawn
{
public struct PluginSettingsUIBuildConfig
{
public Action onUseDefaults { get; set; }
public bool createUseDefaultsButton;
public bool applyMargins;
public static readonly
PluginSettingsUIBuildConfig defaultConfig = new PluginSettingsUIBuildConfig()
{
createUseDefaultsButton = true,
applyMargins = true
};
}
public abstract class PluginSettings<T> : ScriptableObject
where T : PluginSettings<T>
{
private SerializedObject _serializedObject;
public SerializedObject serializedObject
{
get
{
if (_serializedObject == null) _serializedObject = new SerializedObject(this);
return _serializedObject;
}
}
public string uiFieldContainerName { get { return typeof(T).FullName; } }
public void buildDefaultUI(VisualElement parent, PluginSettingsUIBuildConfig config)
{
parent.Query<VisualElement>(uiFieldContainerName).ForEach(item => parent.Remove(item));
var parentContainer = new ScrollView(ScrollViewMode.Vertical);
parentContainer.name = uiFieldContainerName;
parentContainer.contentContainer.style.flexWrap = Wrap.NoWrap;
parentContainer.contentContainer.style.flexDirection = FlexDirection.Column;
parent.Add(parentContainer);
var fields = ReflectionEx.getPrivateInstanceFields(typeof(T));
foreach (var field in fields)
{
var fieldType = field.FieldType;
UIFieldConfig uiBindAttrib = (UIFieldConfig)field.GetCustomAttributes(typeof(UIFieldConfig), false)[0];
if (uiBindAttrib.rowSeparator) UI.createRowSeparator(parentContainer);
if (uiBindAttrib.sectionLabel != string.Empty)
{
var label = UI.createSectionLabel(uiBindAttrib.sectionLabel, parentContainer);
label.style.marginLeft = 3.0f;
}
if (fieldType == typeof(float))
{
FloatField floatField = null;
MinAttribute[] minAttribs = (MinAttribute[])field.GetCustomAttributes(typeof(MinAttribute), false);
RangeAttribute[] rangeAttribs = (RangeAttribute[])field.GetCustomAttributes(typeof(RangeAttribute), false);
if (rangeAttribs.Length != 0) floatField = UI.createFloatField(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, rangeAttribs[0].min, rangeAttribs[0].max, parentContainer);
else if (minAttribs.Length != 0) floatField = UI.createFloatField(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, minAttribs[0].min, parentContainer);
else floatField = UI.createFloatField(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, parentContainer);
floatField.name = field.Name;
}
else
if (fieldType == typeof(int))
{
IntegerField intField = null;
MinAttribute[] minAttribs = (MinAttribute[])field.GetCustomAttributes(typeof(MinAttribute), false);
if (minAttribs.Length != 0) intField = UI.createIntegerField(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, (int)minAttribs[0].min, parentContainer);
else intField = UI.createIntegerField(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, parentContainer);
intField.name = field.Name;
}
else
if (fieldType == typeof(Color))
{
var colorField = UI.createColorField(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, parentContainer);
colorField.name = field.Name;
}
else
if (fieldType == typeof(bool))
{
var toggle = UI.createToggle(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, parentContainer);
toggle.name = field.Name;
}
else if (fieldType.IsEnum)
{
if (fieldType.GetCustomAttributes(typeof(FlagsAttribute), false).Length != 0)
{
var enumField = UI.createEnumFlagsField(fieldType, field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, parentContainer);
enumField.name = field.Name;
}
else
{
var enumField = UI.createEnumField(fieldType, field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, parentContainer);
enumField.name = field.Name;
}
}
else
if (fieldType == typeof(Vector3))
{
Vector3Field vecField = null;
MinAttribute[] minAttribs = (MinAttribute[])field.GetCustomAttributes(typeof(MinAttribute), false);
if (minAttribs.Length != 0) vecField = UI.createVector3Field(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, Vector3Ex.create(minAttribs[0].min), parentContainer);
else vecField = UI.createVector3Field(field.Name, serializedObject, uiBindAttrib.label, uiBindAttrib.tooltip, parentContainer);
vecField.name = field.Name;
}
}
if (config.createUseDefaultsButton)
{
var actions = new List<Action>();
actions.Add(() => useDefaults());
if (config.onUseDefaults != null) actions.Add(config.onUseDefaults);
UI.createUseDefaultsButton(actions, parentContainer);
}
if (config.applyMargins)
parent.setChildrenMarginLeft(UIValues.settingsMarginLeft);
var labels = parent.Q<Label>();
}
public abstract void useDefaults();
protected virtual void onDestroy() { }
private void OnDestroy()
{
onDestroy();
}
}
}
#endif