diff --git a/src/Connectors/EcsEntityConnect.cs b/src/Connectors/EcsEntityConnect.cs index 4e4a023..5da7a36 100644 --- a/src/Connectors/EcsEntityConnect.cs +++ b/src/Connectors/EcsEntityConnect.cs @@ -178,16 +178,11 @@ namespace DCFApixels.DragonECS.Unity.Editors } else { - //Color defColor = GUI.contentColor; - //Color c = defColor; - //c.a = 0.55f; - //GUI.contentColor = c; GUI.enabled = false; - EditorGUI.TextField(idRect, "Entity ID"); - EditorGUI.TextField(genRect, "Gen"); - EditorGUI.TextField(worldRect, "World ID"); + EditorGUI.TextField(idRect, "Entity ID"); + EditorGUI.TextField(genRect, "Gen"); + EditorGUI.TextField(worldRect, "World ID"); GUI.enabled = true; - //GUI.contentColor = defColor; } } diff --git a/src/Editor/EditorUtility.cs b/src/Editor/EditorUtility.cs index aac050d..4a338b1 100644 --- a/src/Editor/EditorUtility.cs +++ b/src/Editor/EditorUtility.cs @@ -1,67 +1,64 @@ #if UNITY_EDITOR using DCFApixels.DragonECS.Unity.Internal; using System; -using System.Collections.Generic; using System.Reflection; using System.Runtime.InteropServices; +using System.Text; using UnityEditor; using UnityEngine; namespace DCFApixels.DragonECS.Unity.Editors { - internal class WrapperBase : ScriptableObject - where TSelf : WrapperBase + internal static class EcsUnityEditorUtility { - private SerializedObject _so; - private SerializedProperty _property; - - private bool _isReleased = false; - private static Stack _wrappers = new Stack(); - - public SerializedObject SO + public static string TransformFieldName(string name) { - get { return _so; } - } - public SerializedProperty Property - { - get { return _property; } - } - - public static TSelf Take() - { - TSelf result; - if (_wrappers.Count <= 0) + if (name.Length <= 0) { - result = CreateInstance(); - result._so = new SerializedObject(result); - result._property = result._so.FindProperty("data"); + return name; } - else + StringBuilder b = new StringBuilder(); + bool nextWorld = true; + bool prewIsUpper = false; + + + for (int i = 0; i < name.Length; i++) { - result = _wrappers.Pop(); + char c = name[i]; + if (char.IsLetter(c) == false) + { + nextWorld = true; + prewIsUpper = false; + continue; + } + + bool isUpper = char.IsUpper(c); + if (isUpper) + { + if (nextWorld == false && prewIsUpper == false) + { + b.Append(' '); + } + } + else + { + if (nextWorld) + { + b.Append(char.ToUpper(c)); + } + else + { + b.Append(c); + } + nextWorld = false; + } + prewIsUpper = isUpper; } - return result; - } - public static void Release(TSelf wrapper) - { - if (wrapper._isReleased) - { - return; - } - wrapper._isReleased = true; - _wrappers.Push(wrapper); + + return b.ToString(); } } - internal class RefEditorWrapper : WrapperBase - { - [SerializeReference] - public object data; - } - internal class UnityObjEditorWrapper : WrapperBase - { - [SerializeField] - public UnityEngine.Object data; - } + public static class EcsGUI { @@ -177,7 +174,7 @@ namespace DCFApixels.DragonECS.Unity.Editors GUILayout.BeginVertical(EcsEditor.GetStyle(panelColor, 0.22f)); EditorGUI.BeginChangeCheck(); - bool changed = DrawData(pool.ComponentType, data, out object resultData); + bool changed = DrawData(pool.ComponentType, new GUIContent(meta.Name), data, out object resultData); if (changed) { @@ -196,64 +193,59 @@ namespace DCFApixels.DragonECS.Unity.Editors GUILayout.Space(2f); } - private static bool DrawData(Type fieldType, object data, out object outData) + private static bool DrawData(Type fieldType, GUIContent label, object data, out object outData) { - var meta = data.GetMeta(); - GUIContent label = new GUIContent(meta.Name); - Type type = data.GetType(); var uobj = data as UnityEngine.Object; - if (uobj == false && type.IsGenericType) + + if ((uobj == false && type.IsGenericType) || + (uobj == false && !type.IsSerializable)) { bool result = false; - foreach (var field in type.GetFields(fieldFlags)) + WrapperBase w = RefEditorWrapper.Take(EmptyDummy.Instance); + //w.SO.Update(); + //EditorGUILayout.PropertyField(w.Property, label, true); + w.Property.isExpanded = EditorGUILayout.Foldout(w.Property.isExpanded, label); + if (w.Property.isExpanded) { - if (DrawData(field.FieldType, field.GetValue(data), out object fieldData)) + EditorGUI.indentLevel++; + foreach (var field in type.GetFields(fieldFlags)) { - field.SetValue(data, fieldData); - result = true; + GUIContent subLabel = new GUIContent(EcsUnityEditorUtility.TransformFieldName(field.Name)); + if (DrawData(field.FieldType, subLabel, field.GetValue(data), out object fieldData)) + { + field.SetValue(data, fieldData); + result = true; + } } + EditorGUI.indentLevel--; } + w.Release(); outData = data; return result; } else { + EditorGUI.BeginChangeCheck(); + WrapperBase w; if (uobj == null) { - EditorGUI.BeginChangeCheck(); - - var w = RefEditorWrapper.Take(); - w.data = data; - w.SO.Update(); - - EditorGUILayout.PropertyField(w.Property, true); - RefEditorWrapper.Release(w); - - if (EditorGUI.EndChangeCheck()) - { - w.SO.ApplyModifiedProperties(); - outData = w.data; - return true; - } + w = RefEditorWrapper.Take(data); } else { - EditorGUI.BeginChangeCheck(); + w = UnityObjEditorWrapper.Take(uobj); + } + w.SO.Update(); - var w = UnityObjEditorWrapper.Take(); - w.data = uobj; - w.SO.Update(); + EditorGUILayout.PropertyField(w.Property, label, true); + w.Release(); - EditorGUILayout.PropertyField(w.Property, true); - UnityObjEditorWrapper.Release(w); - - if (EditorGUI.EndChangeCheck()) - { - w.SO.ApplyModifiedProperties(); - outData = uobj; - return true; - } + if (EditorGUI.EndChangeCheck()) + { + w.SO.ApplyModifiedProperties(); + outData = w.Data; + return true; } outData = data; diff --git a/src/Editor/FieldDrawerInfo.cs b/src/Editor/FieldDrawerInfo.cs deleted file mode 100644 index e4c7976..0000000 --- a/src/Editor/FieldDrawerInfo.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Reflection; - -namespace DCFApixels.DragonECS.Unity.Editors -{ - public struct FieldDrawerInfo - { - private static readonly BindingFlags fieldFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - public Type type; - public object data; - public FieldInfo[] fields; - public FieldDrawerInfo(object data) - { - type = data.GetType(); - this.data = data; - fields = type.GetFields(fieldFlags); - } - public void Set(object data) - { - type = data.GetType(); - this.data = data; - fields = type.GetFields(fieldFlags); - } - } -} diff --git a/src/Editor/SOWrappers.meta b/src/Editor/SOWrappers.meta new file mode 100644 index 0000000..b4ebbe8 --- /dev/null +++ b/src/Editor/SOWrappers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fc9ef2bbe6a95624e9c6d50e19f38a05 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Editor/SOWrappers/RefEditorWrapper.cs b/src/Editor/SOWrappers/RefEditorWrapper.cs new file mode 100644 index 0000000..059d36b --- /dev/null +++ b/src/Editor/SOWrappers/RefEditorWrapper.cs @@ -0,0 +1,24 @@ +#if UNITY_EDITOR +using System; +using UnityEngine; + +namespace DCFApixels.DragonECS.Unity.Editors +{ + [Serializable] + internal class RefEditorWrapper : WrapperBase + { + [SerializeReference] + public object data; + public override object Data + { + get { return data; } + } + public static RefEditorWrapper Take(object data) + { + var result = Take(); + result.data = data; + return result; + } + } +} +#endif diff --git a/src/Editor/FieldDrawerInfo.cs.meta b/src/Editor/SOWrappers/RefEditorWrapper.cs.meta similarity index 83% rename from src/Editor/FieldDrawerInfo.cs.meta rename to src/Editor/SOWrappers/RefEditorWrapper.cs.meta index ba3d1cf..2a823f7 100644 --- a/src/Editor/FieldDrawerInfo.cs.meta +++ b/src/Editor/SOWrappers/RefEditorWrapper.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9047f4ae8f7a24c4d8b053ffeeb259f7 +guid: b0f14ae652b89744888db94704a170ef MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/src/Editor/SOWrappers/UnityObjEditorWrapper.cs b/src/Editor/SOWrappers/UnityObjEditorWrapper.cs new file mode 100644 index 0000000..ceaf616 --- /dev/null +++ b/src/Editor/SOWrappers/UnityObjEditorWrapper.cs @@ -0,0 +1,24 @@ +#if UNITY_EDITOR +using System; +using UnityEngine; + +namespace DCFApixels.DragonECS.Unity.Editors +{ + [Serializable] + internal class UnityObjEditorWrapper : WrapperBase + { + [SerializeField] + public UnityEngine.Object data; + public override object Data + { + get { return data; } + } + public static UnityObjEditorWrapper Take(UnityEngine.Object data) + { + var result = Take(); + result.data = data; + return result; + } + } +} +#endif diff --git a/src/Editor/SOWrappers/UnityObjEditorWrapper.cs.meta b/src/Editor/SOWrappers/UnityObjEditorWrapper.cs.meta new file mode 100644 index 0000000..8960b1f --- /dev/null +++ b/src/Editor/SOWrappers/UnityObjEditorWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7060bf63683c82a4a8a6cf54255c4139 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Editor/SOWrappers/WrapperBase.cs b/src/Editor/SOWrappers/WrapperBase.cs new file mode 100644 index 0000000..6315714 --- /dev/null +++ b/src/Editor/SOWrappers/WrapperBase.cs @@ -0,0 +1,73 @@ +#if UNITY_EDITOR +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace DCFApixels.DragonECS.Unity.Editors +{ + [Serializable] + internal abstract class WrapperBase : ScriptableObject + { + public abstract object Data { get; } + public abstract SerializedObject SO { get; } + public abstract SerializedProperty Property { get; } + public abstract void Release(); + } + [Serializable] + internal abstract class WrapperBase : WrapperBase + where TSelf : WrapperBase + { + private SerializedObject _so; + private SerializedProperty _property; + + private bool _isReleased = false; + private static Stack _wrappers = new Stack(); + public override SerializedObject SO + { + get { return _so; } + } + public override SerializedProperty Property + { + get { return _property; } + } + + public static TSelf Take() + { + TSelf result; + if (_wrappers.Count <= 0) + { + result = CreateInstance(); + result._so = new SerializedObject(result); + result._property = result._so.FindProperty("data"); + } + else + { + result = _wrappers.Pop(); + } + return result; + } + public static void Release(TSelf wrapper) + { + if (wrapper._isReleased) + { + return; + } + wrapper._isReleased = true; + _wrappers.Push(wrapper); + } + + public override void Release() + { + Release((TSelf)this); + } + } + + [Serializable] + public class EmptyDummy + { + public static readonly EmptyDummy Instance = new EmptyDummy(); + private EmptyDummy() { } + } +} +#endif diff --git a/src/Editor/SOWrappers/WrapperBase.cs.meta b/src/Editor/SOWrappers/WrapperBase.cs.meta new file mode 100644 index 0000000..4649771 --- /dev/null +++ b/src/Editor/SOWrappers/WrapperBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c0cef58c08259f4bbb78af2fcec4c79 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: