Kaynağa Gözat

Refactor: Cleaner handling for NativeWrapper, PassByCopy and ApplyOnDirty attributes

BearishSun 7 yıl önce
ebeveyn
işleme
5ff53e8f72

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

@@ -273,9 +273,15 @@ namespace BansheeEditor
             /// <inheritdoc/>
             /// <inheritdoc/>
             protected override void ClearList()
             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/>
             /// <inheritdoc/>

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

@@ -120,13 +120,6 @@ namespace BansheeEditor
                 currentIndex += children[i].GetNumLayoutElements();
                 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;
             return state;
         }
         }
 
 
@@ -174,14 +167,7 @@ namespace BansheeEditor
 
 
                if (isExpanded)
                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;
                    SerializableField[] fields = serializableObject.Fields;
 
 
                    if (fields.Length > 0)
                    if (fields.Length > 0)

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

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