Browse Source

Refactor: Cleaner handling for NativeWrapper, PassByCopy and ApplyOnDirty attributes

BearishSun 7 years ago
parent
commit
5ff53e8f72

+ 9 - 3
Source/Scripting/MBansheeEditor/Windows/Inspector/InspectableArray.cs

@@ -273,9 +273,15 @@ namespace BansheeEditor
             /// <inheritdoc/>
             protected override void ClearList()
             {
-                property.SetValue<object>(null);
-                array = null;
-                numElements = 0;
+                // Native arrays cannot be set to null, so just clear their size to zero instead
+                if (style.StyleFlags.HasFlag(InspectableFieldStyleFlags.NativeWrapper))
+                    CreateList();
+                else
+                {
+                    property.SetValue<object>(null);
+                    array = null;
+                    numElements = 0;
+                }
             }
 
             /// <inheritdoc/>

+ 1 - 15
Source/Scripting/MBansheeEditor/Windows/Inspector/InspectableObject.cs

@@ -120,13 +120,6 @@ namespace BansheeEditor
                 currentIndex += children[i].GetNumLayoutElements();
             }
 
-            if (state.HasFlag(InspectableState.Modified))
-            {
-                if (style.StyleFlags.HasFlag(InspectableFieldStyleFlags.CopiedAsValue) ||
-                    style.StyleFlags.HasFlag(InspectableFieldStyleFlags.ApplyOnDirty))
-                    property.SetValue(propertyValue);
-            }
-
             return state;
         }
 
@@ -174,14 +167,7 @@ namespace BansheeEditor
 
                if (isExpanded)
                {
-                   SerializableObject serializableObject;
-
-                   // Note: Make sure to use the same object instance if it's copied as value
-                   if(style.StyleFlags.HasFlag(InspectableFieldStyleFlags.CopiedAsValue))
-                       serializableObject = new SerializableObject(propertyValue);
-                   else
-                       serializableObject = property.GetObject();
-
+                   SerializableObject serializableObject = property.GetObject();
                    SerializableField[] fields = serializableObject.Fields;
 
                    if (fields.Length > 0)

+ 4 - 1
Source/Scripting/MBansheeEngine/Serialization/SerializableField.cs

@@ -159,6 +159,9 @@ namespace BansheeEngine
                     return null;
             };
 
+            bool applyOnChange = Flags.HasFlag(SerializableFieldAttributes.ApplyOnDirty) || 
+                                 Flags.HasFlag(SerializableFieldAttributes.PassByCopy);
+
             SerializableProperty.Setter setter = (object value) =>
             {
                 object parentObject = parent.GetReferencedObject();
@@ -168,7 +171,7 @@ namespace BansheeEngine
                     Internal_SetValue(mCachedPtr, parentObject, value);
 
                     // If value type we cannot just modify the parent object because it's just a copy
-                    if (parentObject.GetType().IsValueType && parent.parentProperty != null)
+                    if ((applyOnChange || parentObject.GetType().IsValueType) && parent.parentProperty != null)
                         parent.parentProperty.SetValue(parentObject);
                 }
             };