Browse Source

WIP: UndoRedo refactor
- Inspector fields will now be forced to fresh their values after an undo/redo operation

BearishSun 6 years ago
parent
commit
b7fed041b9
66 changed files with 158 additions and 124 deletions
  1. 6 4
      Source/EditorManaged/GUI/GUIDictionaryField.cs
  2. 5 3
      Source/EditorManaged/GUI/GUIListField.cs
  3. 1 1
      Source/EditorManaged/Inspectors/AnimationClipInspector.cs
  4. 1 1
      Source/EditorManaged/Inspectors/AnimationInspector.cs
  5. 1 1
      Source/EditorManaged/Inspectors/AudioClipInspector.cs
  6. 1 1
      Source/EditorManaged/Inspectors/AudioListenerInspector.cs
  7. 1 1
      Source/EditorManaged/Inspectors/AudioSourceInspector.cs
  8. 1 1
      Source/EditorManaged/Inspectors/BoneInspector.cs
  9. 1 1
      Source/EditorManaged/Inspectors/CameraInspector.cs
  10. 1 1
      Source/EditorManaged/Inspectors/CharacterControllerInspector.cs
  11. 7 7
      Source/EditorManaged/Inspectors/FontInspector.cs
  12. 3 3
      Source/EditorManaged/Inspectors/GUISkinInspector.cs
  13. 1 1
      Source/EditorManaged/Inspectors/GUIWidgetInspector.cs
  14. 1 1
      Source/EditorManaged/Inspectors/LightInspector.cs
  15. 1 1
      Source/EditorManaged/Inspectors/LightProbeVolumeInspector.cs
  16. 1 1
      Source/EditorManaged/Inspectors/MaterialInspector.cs
  17. 4 4
      Source/EditorManaged/Inspectors/MeshInspector.cs
  18. 1 1
      Source/EditorManaged/Inspectors/PhysicsMaterialInspector.cs
  19. 1 1
      Source/EditorManaged/Inspectors/PhysicsMeshInspector.cs
  20. 1 1
      Source/EditorManaged/Inspectors/PlainTextInspector.cs
  21. 1 1
      Source/EditorManaged/Inspectors/PrefabInspector.cs
  22. 1 1
      Source/EditorManaged/Inspectors/ReflectionProbeInspector.cs
  23. 4 4
      Source/EditorManaged/Inspectors/RenderableInspector.cs
  24. 1 1
      Source/EditorManaged/Inspectors/RigidbodyInspector.cs
  25. 1 1
      Source/EditorManaged/Inspectors/ScriptCodeInspector.cs
  26. 1 1
      Source/EditorManaged/Inspectors/ShaderInspector.cs
  27. 1 1
      Source/EditorManaged/Inspectors/SpriteTextureInspector.cs
  28. 4 4
      Source/EditorManaged/Inspectors/StringTableInspector.cs
  29. 1 1
      Source/EditorManaged/Inspectors/TextureInspector.cs
  30. 11 0
      Source/EditorManaged/Utility/GameObjectUndo.cs
  31. 2 2
      Source/EditorManaged/Windows/Inspector/GenericInspector.cs
  32. 3 3
      Source/EditorManaged/Windows/Inspector/InspectableAABox.cs
  33. 6 6
      Source/EditorManaged/Windows/Inspector/InspectableArray.cs
  34. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableBool.cs
  35. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableCategory.cs
  36. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableColor.cs
  37. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableColorDistribution.cs
  38. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableColorGradient.cs
  39. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableCurve.cs
  40. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableDegree.cs
  41. 6 6
      Source/EditorManaged/Windows/Inspector/InspectableDictionary.cs
  42. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableEnum.cs
  43. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableEuler.cs
  44. 2 1
      Source/EditorManaged/Windows/Inspector/InspectableField.cs
  45. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableFloat.cs
  46. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableFloatDistribution.cs
  47. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableGameObjectRef.cs
  48. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableInt.cs
  49. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableLayerMask.cs
  50. 6 6
      Source/EditorManaged/Windows/Inspector/InspectableList.cs
  51. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableObject.cs
  52. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableQuaternion.cs
  53. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableRRef.cs
  54. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableRadian.cs
  55. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableRangedFloat.cs
  56. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableRangedInt.cs
  57. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableResource.cs
  58. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableString.cs
  59. 1 1
      Source/EditorManaged/Windows/Inspector/InspectableTexture.cs
  60. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableVector2.cs
  61. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableVector2Distribution.cs
  62. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableVector3.cs
  63. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableVector3Distribution.cs
  64. 2 2
      Source/EditorManaged/Windows/Inspector/InspectableVector4.cs
  65. 6 4
      Source/EditorManaged/Windows/Inspector/Inspector.cs
  66. 16 0
      Source/EditorManaged/Windows/Inspector/InspectorWindow.cs

+ 6 - 4
Source/EditorManaged/GUI/GUIDictionaryField.cs

@@ -242,15 +242,16 @@ namespace bs.Editor
         /// <summary>
         /// Refreshes contents of all dictionary rows and checks if anything was modified.
         /// </summary>
+        /// <param name="force">Forces the GUI fields to display the latest values assigned on the object.</param>
         /// <returns>State representing was anything modified between two last calls to <see cref="Refresh"/>.</returns>
-        public virtual InspectableState Refresh()
+        public virtual InspectableState Refresh(bool force)
         {
             InspectableState state = InspectableState.NotModified;
             for (int i = 0; i < rows.Count; i++)
-                state |= rows[i].Refresh();
+                state |= rows[i].Refresh(force);
 
             if (editRow != null && editRow.Enabled)
-                state |= editRow.Refresh();
+                state |= editRow.Refresh(force);
 
             if (isModified)
             {
@@ -1205,8 +1206,9 @@ namespace bs.Editor
         /// <summary>
         /// Refreshes the GUI for the dictionary row and checks if anything was modified.
         /// </summary>
+        /// <param name="force">Forces the GUI fields to display the latest values assigned on the object.</param>
         /// <returns>State representing was anything modified between two last calls to <see cref="Refresh"/>.</returns>
-        internal protected virtual InspectableState Refresh()
+        internal protected virtual InspectableState Refresh(bool force)
         {
             InspectableState oldState = modifiedState;
             if (modifiedState.HasFlag(InspectableState.Modified))

+ 5 - 3
Source/EditorManaged/GUI/GUIListField.cs

@@ -229,13 +229,14 @@ namespace bs.Editor
         /// <summary>
         /// Refreshes contents of all list rows and checks if anything was modified.
         /// </summary>
+        /// <param name="force">Forces the GUI fields to display the latest values assigned on the object.</param>
         /// <returns>State representing was anything modified between two last calls to <see cref="Refresh"/>.</returns>
-        public virtual InspectableState Refresh()
+        public virtual InspectableState Refresh(bool force)
         {
             InspectableState state = InspectableState.NotModified;
 
             for (int i = 0; i < rows.Count; i++)
-                state |= rows[i].Refresh();
+                state |= rows[i].Refresh(force);
 
             if (isModified)
             {
@@ -982,8 +983,9 @@ namespace bs.Editor
         /// <summary>
         /// Refreshes the GUI for the list row and checks if anything was modified.
         /// </summary>
+        /// <param name="force">Forces the GUI fields to display the latest values assigned on the object.</param>
         /// <returns>State representing was anything modified between two last calls to <see cref="Refresh"/>.</returns>
-        protected internal virtual InspectableState Refresh()
+        protected internal virtual InspectableState Refresh(bool force)
         {
             InspectableState oldState = modifiedState;
             if (modifiedState.HasFlag(InspectableState.Modified))

+ 1 - 1
Source/EditorManaged/Inspectors/AnimationClipInspector.cs

@@ -21,7 +21,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             return InspectableState.NotModified;
         }

+ 1 - 1
Source/EditorManaged/Inspectors/AnimationInspector.cs

@@ -32,7 +32,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             Animation animation = InspectedObject as Animation;
             if (animation == null)

+ 1 - 1
Source/EditorManaged/Inspectors/AudioClipInspector.cs

@@ -48,7 +48,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             reimportButton.Update();
 

+ 1 - 1
Source/EditorManaged/Inspectors/AudioListenerInspector.cs

@@ -21,7 +21,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             return InspectableState.NotModified;
         }

+ 1 - 1
Source/EditorManaged/Inspectors/AudioSourceInspector.cs

@@ -32,7 +32,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             AudioSource source = InspectedObject as AudioSource;
             if (source == null)

+ 1 - 1
Source/EditorManaged/Inspectors/BoneInspector.cs

@@ -28,7 +28,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             Bone bone = InspectedObject as Bone;
             if (bone == null)

+ 1 - 1
Source/EditorManaged/Inspectors/CameraInspector.cs

@@ -47,7 +47,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             Camera camera = InspectedObject as Camera;
             if (camera == null)

+ 1 - 1
Source/EditorManaged/Inspectors/CharacterControllerInspector.cs

@@ -42,7 +42,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             CharacterController controller = InspectedObject as CharacterController;
             if (controller == null)

+ 7 - 7
Source/EditorManaged/Inspectors/FontInspector.cs

@@ -79,7 +79,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             reimportButton.Update();
 
@@ -118,8 +118,8 @@ namespace bs.Editor
             if (rebuildGUI)
                 BuildGUI();
 
-            fontSizes.Refresh();
-            charRanges.Refresh();
+            fontSizes.Refresh(false);
+            charRanges.Refresh(false);
 
             renderModeField.Value = (ulong)importOptions.RenderMode;
             boldField.Value = importOptions.Bold;
@@ -175,11 +175,11 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            protected internal override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force)
             {
                 sizeField.Value = GetValue<int>();
 
-                return base.Refresh();
+                return base.Refresh(force);
             }
         }
 
@@ -230,13 +230,13 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            protected internal override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force)
             {
                 CharRange newValue = GetValue<CharRange>();
                 rangeStartField.Value = newValue.start;
                 rangeEndField.Value = newValue.end;
 
-                return base.Refresh();
+                return base.Refresh(force);
             }
         }
     }

+ 3 - 3
Source/EditorManaged/Inspectors/GUISkinInspector.cs

@@ -28,9 +28,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
-            valuesField.Refresh();
+            valuesField.Refresh(force);
 
             return InspectableState.NotModified;
         }
@@ -143,7 +143,7 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            internal protected override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force)
             {
                 keyField.Value = GetKey<string>();
                 return valueField.Refresh(GetValue<GUIElementStyle>());

+ 1 - 1
Source/EditorManaged/Inspectors/GUIWidgetInspector.cs

@@ -26,7 +26,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             GUIWidget guiWidget = InspectedObject as GUIWidget;
             if (guiWidget == null)

+ 1 - 1
Source/EditorManaged/Inspectors/LightInspector.cs

@@ -102,7 +102,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             Light light = InspectedObject as Light;
             if (light == null)

+ 1 - 1
Source/EditorManaged/Inspectors/LightProbeVolumeInspector.cs

@@ -39,7 +39,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             LightProbeVolume lpv = InspectedObject as LightProbeVolume;
             if (lpv == null)

+ 1 - 1
Source/EditorManaged/Inspectors/MaterialInspector.cs

@@ -65,7 +65,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             Material material = InspectedObject as Material;
             if (material == null)

+ 4 - 4
Source/EditorManaged/Inspectors/MeshInspector.cs

@@ -39,7 +39,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             importOptions = GetImportOptions();
 
@@ -110,7 +110,7 @@ namespace bs.Editor
         /// </summary>
         private void UpdateGUIValues()
         {
-            animSplitInfoField.Refresh();
+            animSplitInfoField.Refresh(false);
 
             normalsField.Value = importOptions.ImportNormals;
             tangentsField.Value = importOptions.ImportTangents;
@@ -238,7 +238,7 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            protected internal override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force)
             {
                 AnimationSplitInfo splitInfo = GetValue<AnimationSplitInfo>();
 
@@ -250,7 +250,7 @@ namespace bs.Editor
                     isAdditiveField.Value = splitInfo.IsAdditive;
                 }
 
-                return base.Refresh();
+                return base.Refresh(force);
             }
         }
     }

+ 1 - 1
Source/EditorManaged/Inspectors/PhysicsMaterialInspector.cs

@@ -27,7 +27,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             PhysicsMaterial material = InspectedObject as PhysicsMaterial;
             if (material == null)

+ 1 - 1
Source/EditorManaged/Inspectors/PhysicsMeshInspector.cs

@@ -21,7 +21,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             return InspectableState.NotModified;
         }

+ 1 - 1
Source/EditorManaged/Inspectors/PlainTextInspector.cs

@@ -45,7 +45,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             PlainText plainText = InspectedObject as PlainText;
             if (plainText == null)

+ 1 - 1
Source/EditorManaged/Inspectors/PrefabInspector.cs

@@ -22,7 +22,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             return InspectableState.NotModified;
         }

+ 1 - 1
Source/EditorManaged/Inspectors/ReflectionProbeInspector.cs

@@ -66,7 +66,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             ReflectionProbe probe = InspectedObject as ReflectionProbe;
             if (probe == null)

+ 4 - 4
Source/EditorManaged/Inspectors/RenderableInspector.cs

@@ -34,7 +34,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             Renderable renderable = InspectedObject as Renderable;
             if (renderable == null)
@@ -82,7 +82,7 @@ namespace bs.Editor
                 layersValue = renderable.Layers;
             }
 
-            InspectableState materialsModified = materialsField.Refresh();
+            InspectableState materialsModified = materialsField.Refresh(force);
             if (materialsModified == InspectableState.Modified)
                 renderable.Materials = materials;
 
@@ -228,11 +228,11 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            internal protected override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force = false)
             {
                 materialField.ValueRef = GetValue<RRef<Material>>();
 
-                return base.Refresh();
+                return base.Refresh(force);
             }
         }
     }

+ 1 - 1
Source/EditorManaged/Inspectors/RigidbodyInspector.cs

@@ -33,7 +33,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             Rigidbody body = InspectedObject as Rigidbody;
             if (body == null)

+ 1 - 1
Source/EditorManaged/Inspectors/ScriptCodeInspector.cs

@@ -66,7 +66,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             reimportButton.Update();
 

+ 1 - 1
Source/EditorManaged/Inspectors/ShaderInspector.cs

@@ -22,7 +22,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             return InspectableState.NotModified;
         }

+ 1 - 1
Source/EditorManaged/Inspectors/SpriteTextureInspector.cs

@@ -52,7 +52,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             SpriteTexture spriteTexture = InspectedObject as SpriteTexture;
             if (spriteTexture == null)

+ 4 - 4
Source/EditorManaged/Inspectors/StringTableInspector.cs

@@ -29,7 +29,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             // Note: We're ignoring changes to the string table made externally here in order to avoid a lot of checks.
             if ((Language) languageField.Value != StringTables.ActiveLanguage)
@@ -38,7 +38,7 @@ namespace bs.Editor
                 BuildGUI();
             }
 
-            valuesField.Refresh();
+            valuesField.Refresh(force);
 
             return InspectableState.NotModified;
         }
@@ -165,12 +165,12 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            internal protected override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force = false)
             {
                 keyField.Value = GetKey<string>();
                 valueField.Value = GetValue<string>();
 
-                return base.Refresh();
+                return base.Refresh(force);
             }
         }
     }

+ 1 - 1
Source/EditorManaged/Inspectors/TextureInspector.cs

@@ -58,7 +58,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
             reimportButton.Update();
 

+ 11 - 0
Source/EditorManaged/Utility/GameObjectUndo.cs

@@ -636,6 +636,7 @@ namespace bs.Editor
 
             oldToNew.Apply(obj);
             FocusOnField();
+            RefreshInspector();
         }
 
         /// <inheritdoc/>
@@ -652,6 +653,7 @@ namespace bs.Editor
 
             newToOld.Apply(obj);
             FocusOnField();
+            RefreshInspector();
         }
 
         /// <summary>
@@ -673,6 +675,15 @@ namespace bs.Editor
                 }
             }
         }
+
+        /// <summary>
+        /// Updates the values of the fields displayed in the inspector window.
+        /// </summary>
+        private void RefreshInspector()
+        {
+            InspectorWindow inspectorWindow = EditorWindow.GetWindow<InspectorWindow>();
+            inspectorWindow?.RefreshComponentFields(obj);
+        }
     }
 
     /** @} */

+ 2 - 2
Source/EditorManaged/Windows/Inspector/GenericInspector.cs

@@ -32,9 +32,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
+        protected internal override InspectableState Refresh(bool force = false)
         {
-            return drawer.Refresh();
+            return drawer.Refresh(force);
         }
 
         /// <inheritdoc/>

+ 3 - 3
Source/EditorManaged/Windows/Inspector/InspectableAABox.cs

@@ -95,10 +95,10 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if ((centerField != null && !centerField.HasInputFocus) &&
-                (sizeField != null && !sizeField.HasInputFocus))
+            if ((centerField != null && (!centerField.HasInputFocus || force)) &&
+                (sizeField != null && (!sizeField.HasInputFocus || force)))
             {
                 AABox box = property.GetValue<AABox>();
                 centerField.Value = box.Center;

+ 6 - 6
Source/EditorManaged/Windows/Inspector/InspectableArray.cs

@@ -52,9 +52,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            return arrayGUIField.Refresh();
+            return arrayGUIField.Refresh(force);
         }
 
         /// <inheritdoc/>
@@ -214,7 +214,7 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            public override InspectableState Refresh()
+            public override InspectableState Refresh(bool force)
             {
                 // Check if any modifications to the array were made outside the inspector
                 Array newArray = property.GetValue<Array>();
@@ -242,7 +242,7 @@ namespace bs.Editor
                     }
                 }
 
-                return base.Refresh();
+                return base.Refresh(force);
             }
 
             /// <inheritdoc/>
@@ -500,10 +500,10 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            protected internal override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force)
             {
                 Field.Property = GetValue<SerializableProperty>();
-                return Field.Refresh(0);
+                return Field.Refresh(0, force);
             }
         }
     }

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableBool.cs

@@ -47,7 +47,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
                 guiField.Value = property.GetValue<bool>();

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableCategory.cs

@@ -53,13 +53,13 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             InspectableState state = InspectableState.NotModified;
             int currentIndex = 0;
             for (int i = 0; i < children.Count; i++)
             {
-                state |= children[i].Refresh(currentIndex);
+                state |= children[i].Refresh(currentIndex, force);
                 currentIndex += children[i].GetNumLayoutElements();
             }
 

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableColor.cs

@@ -47,7 +47,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
                 guiField.Value = property.GetValue<Color>();

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableColorDistribution.cs

@@ -45,7 +45,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiDistributionField != null)
                 guiDistributionField.Value = property.GetValue<ColorDistribution>();

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableColorGradient.cs

@@ -45,7 +45,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
                 guiField.Value = property.GetValue<ColorGradient>();

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableCurve.cs

@@ -45,7 +45,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
                 guiField.SetCurve(property.GetValue<AnimationCurve>());

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableDegree.cs

@@ -63,9 +63,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiFloatField != null && !guiFloatField.HasInputFocus)
+            if (guiFloatField != null && (!guiFloatField.HasInputFocus || force))
                 guiFloatField.Value = property.GetValue<Degree>().Degrees;
 
             InspectableState oldState = state;

+ 6 - 6
Source/EditorManaged/Windows/Inspector/InspectableDictionary.cs

@@ -45,9 +45,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            return dictionaryGUIField.Refresh();
+            return dictionaryGUIField.Refresh(force);
         }
 
         /// <inheritdoc/>
@@ -219,7 +219,7 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            public override InspectableState Refresh()
+            public override InspectableState Refresh(bool force)
             {
                 // Check if any modifications to the array were made outside the inspector
                 IDictionary newDict = property.GetValue<IDictionary>();
@@ -247,7 +247,7 @@ namespace bs.Editor
                     }
                 }
 
-                return base.Refresh();
+                return base.Refresh(force);
             }
 
             /// <summary>
@@ -517,12 +517,12 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            protected internal override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force)
             {
                 FieldKey.Property = GetKey<SerializableProperty>();
                 FieldValue.Property = GetValue<SerializableProperty>();
 
-                return FieldValue.Refresh(0);
+                return FieldValue.Refresh(0, force);
             }
         }
     }

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableEnum.cs

@@ -45,7 +45,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
                 guiField.Value = property.GetValue<ulong>();

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableEuler.cs

@@ -62,9 +62,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiField != null && !guiField.HasInputFocus)
+            if (guiField != null && (!guiField.HasInputFocus || force))
             {
                 Quaternion quaternion = property.GetValue<Quaternion>();
                 if (quaternion != quatValue)

+ 2 - 1
Source/EditorManaged/Windows/Inspector/InspectableField.cs

@@ -104,8 +104,9 @@ namespace bs.Editor
         /// </summary>
         /// <param name="layoutIndex">Index in the parent's layout at which to insert the GUI elements for this field.
         ///                           </param>
+        /// <param name="force">Forces the GUI fields to display the latest values assigned on the object.</param>
         /// <returns>State representing was anything modified between two last calls to <see cref="Refresh"/>.</returns>
-        public virtual InspectableState Refresh(int layoutIndex)
+        public virtual InspectableState Refresh(int layoutIndex, bool force = false)
         {
             return InspectableState.NotModified;
         }

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableFloat.cs

@@ -62,9 +62,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiFloatField != null && !guiFloatField.HasInputFocus)
+            if (guiFloatField != null && (!guiFloatField.HasInputFocus || force))
                 guiFloatField.Value = property.GetValue<float>();
 
             InspectableState oldState = state;

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableFloatDistribution.cs

@@ -74,9 +74,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiDistributionField != null && !guiDistributionField.HasInputFocus)
+            if (guiDistributionField != null && (!guiDistributionField.HasInputFocus || force))
                 guiDistributionField.Value = property.GetValue<FloatDistribution>();
 
             InspectableState oldState = state;

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableGameObjectRef.cs

@@ -46,7 +46,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
                 guiField.Value = property.GetValue<GameObject>();

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableInt.cs

@@ -62,9 +62,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiIntField != null && !guiIntField.HasInputFocus)
+            if (guiIntField != null && (!guiIntField.HasInputFocus || force))
                 guiIntField.Value = property.GetValue<int>();
 
             InspectableState oldState = state;

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableLayerMask.cs

@@ -63,7 +63,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiLayerMaskField != null)
             {

+ 6 - 6
Source/EditorManaged/Windows/Inspector/InspectableList.cs

@@ -44,9 +44,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            return listGUIField.Refresh();
+            return listGUIField.Refresh(force);
         }
 
         /// <inheritdoc/>
@@ -194,7 +194,7 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            public override InspectableState Refresh()
+            public override InspectableState Refresh(bool force)
             {
                 // Check if any modifications to the array were made outside the inspector
                 IList newList = property.GetValue<IList>();
@@ -222,7 +222,7 @@ namespace bs.Editor
                     }
                 }
 
-                return base.Refresh();
+                return base.Refresh(force);
             }
 
             /// <inheritdoc/>
@@ -409,10 +409,10 @@ namespace bs.Editor
             }
 
             /// <inheritdoc/>
-            protected internal override InspectableState Refresh()
+            protected internal override InspectableState Refresh(bool force)
             {
                 Field.Property = GetValue<SerializableProperty>();
-                return Field.Refresh(0);
+                return Field.Refresh(0, force);
             }
         }
     }

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableObject.cs

@@ -101,7 +101,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             // Check if modified internally and rebuild if needed
             object newPropertyValue = property.GetValue<object>();
@@ -125,7 +125,7 @@ namespace bs.Editor
             }
 
             if(drawer != null)
-                return drawer.Refresh();
+                return drawer.Refresh(force);
 
             return InspectableState.NotModified;
         }

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableQuaternion.cs

@@ -49,9 +49,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiField != null && !guiField.HasInputFocus)
+            if (guiField != null && (!guiField.HasInputFocus || force))
             {
                 Quaternion quaternion = property.GetValue<Quaternion>();
                 guiField.Value = new Vector4(quaternion.x, quaternion.y, quaternion.z, quaternion.w);

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableRRef.cs

@@ -52,7 +52,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
                 guiField.ValueRef = property.GetValue<RRefBase>();

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableRadian.cs

@@ -63,9 +63,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiFloatField != null && !guiFloatField.HasInputFocus)
+            if (guiFloatField != null && (!guiFloatField.HasInputFocus || force))
                 guiFloatField.Value = property.GetValue<Radian>().Radians;
 
             InspectableState oldState = state;

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableRangedFloat.cs

@@ -51,9 +51,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiFloatField != null && !guiFloatField.HasInputFocus)
+            if (guiFloatField != null && (!guiFloatField.HasInputFocus || force))
                 guiFloatField.Value = property.GetValue<float>();
 
             InspectableState oldState = state;

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableRangedInt.cs

@@ -51,9 +51,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiIntField != null && !guiIntField.HasInputFocus)
+            if (guiIntField != null && (!guiIntField.HasInputFocus || force))
                 guiIntField.Value = property.GetValue<int>();
 
             InspectableState oldState = state;

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableResource.cs

@@ -44,7 +44,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
                 guiField.Value = property.GetValue<Resource>();

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableString.cs

@@ -53,9 +53,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiField != null && !guiField.HasInputFocus)
+            if (guiField != null && (!guiField.HasInputFocus || force))
                 guiField.Value = property.GetValue<string>();
 
             InspectableState oldState = state;

+ 1 - 1
Source/EditorManaged/Windows/Inspector/InspectableTexture.cs

@@ -40,7 +40,7 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
             if (guiField != null)
             {

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableVector2.cs

@@ -58,9 +58,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiField != null && !guiField.HasInputFocus)
+            if (guiField != null && (!guiField.HasInputFocus || force))
                 guiField.Value = property.GetValue<Vector2>();
 
             InspectableState oldState = state;

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableVector2Distribution.cs

@@ -74,9 +74,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiDistributionField != null && !guiDistributionField.HasInputFocus)
+            if (guiDistributionField != null && (!guiDistributionField.HasInputFocus || force))
                 guiDistributionField.Value = property.GetValue<Vector2Distribution>();
 
             InspectableState oldState = state;

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableVector3.cs

@@ -58,9 +58,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiField != null && !guiField.HasInputFocus)
+            if (guiField != null && (!guiField.HasInputFocus || force))
                 guiField.Value = property.GetValue<Vector3>();
 
             InspectableState oldState = state;

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableVector3Distribution.cs

@@ -74,9 +74,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiDistributionField != null && !guiDistributionField.HasInputFocus)
+            if (guiDistributionField != null && (!guiDistributionField.HasInputFocus || force))
                 guiDistributionField.Value = property.GetValue<Vector3Distribution>();
 
             InspectableState oldState = state;

+ 2 - 2
Source/EditorManaged/Windows/Inspector/InspectableVector4.cs

@@ -58,9 +58,9 @@ namespace bs.Editor
         }
 
         /// <inheritdoc/>
-        public override InspectableState Refresh(int layoutIndex)
+        public override InspectableState Refresh(int layoutIndex, bool force = false)
         {
-            if (guiField != null && !guiField.HasInputFocus)
+            if (guiField != null && (!guiField.HasInputFocus || force))
                 guiField.Value = property.GetValue<Vector4>();
 
             InspectableState oldState = state;

+ 6 - 4
Source/EditorManaged/Windows/Inspector/Inspector.cs

@@ -193,10 +193,11 @@ namespace bs.Editor
         /// <summary>
         /// Checks if contents of the inspector have been modified, and updates them if needed.
         /// </summary>
+        /// <param name="force">Forces the GUI fields to display the latest values assigned on the object.</param>
         /// <returns>State representing was anything modified between two last calls to <see cref="Refresh"/>.</returns>
-        protected internal virtual InspectableState Refresh()
+        protected internal virtual InspectableState Refresh(bool force = false)
         {
-            return drawer.Refresh();
+            return drawer.Refresh(force);
         }
     }
 
@@ -491,15 +492,16 @@ namespace bs.Editor
         /// <summary>
         /// Checks if contents of the inspector fields have been modified, and updates them if needed.
         /// </summary>
+        /// <param name="force">Forces the GUI fields to display the latest values assigned on the object.</param>
         /// <returns>State representing was anything modified between two last calls to <see cref="Refresh"/>.</returns>
-        public InspectableState Refresh()
+        public InspectableState Refresh(bool force = false)
         {
             InspectableState state = InspectableState.NotModified;
 
             int currentIndex = 0;
             foreach (var field in Fields)
             {
-                state |= field.Refresh(currentIndex);
+                state |= field.Refresh(currentIndex, force);
                 currentIndex += field.GetNumLayoutElements();
 
                 if (conditionals != null)

+ 16 - 0
Source/EditorManaged/Windows/Inspector/InspectorWindow.cs

@@ -428,6 +428,22 @@ namespace bs.Editor
                 soScale.Value = scale;
         }
 
+        /// <summary>
+        /// Forces all the GUI fields for the specified component to update their values from the current component state.
+        /// </summary>
+        /// <param name="component">Component for whose GUI elements to perform the refresh on.</param>
+        internal void RefreshComponentFields(Component component)
+        {
+            if (component == null)
+                return;
+
+            foreach (var entry in inspectorComponents)
+            {
+                if (entry.uuid == component.UUID)
+                    entry.inspector.Refresh(true);
+            }
+        }
+
         private void OnInitialize()
         {
             Selection.OnSelectionChanged += OnSelectionChanged;