diff --git a/Source/Editor/CustomEditors/Editors/ObjectSwitcherEditor.cs b/Source/Editor/CustomEditors/Editors/ObjectSwitcherEditor.cs
index 85efbadc3..d32f08c92 100644
--- a/Source/Editor/CustomEditors/Editors/ObjectSwitcherEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/ObjectSwitcherEditor.cs
@@ -3,6 +3,7 @@
using System;
using FlaxEditor.GUI;
using FlaxEditor.Scripting;
+using FlaxEngine;
using FlaxEngine.Utilities;
namespace FlaxEditor.CustomEditors.Editors
@@ -81,9 +82,13 @@ namespace FlaxEditor.CustomEditors.Editors
private OptionType[] _options;
private ScriptType _type;
+ private Elements.PropertiesListElement _typeItem;
private ScriptType Type => Values[0] == null ? Values.Type : TypeUtils.GetObjectType(Values[0]);
+ ///
+ public override bool RevertValueWithChildren => false; // Always revert value for a whole object
+
///
public override void Initialize(LayoutElementsContainer layout)
{
@@ -98,7 +103,8 @@ namespace FlaxEditor.CustomEditors.Editors
_type = type;
// Type
- var typeEditor = layout.ComboBox(TypeComboBoxName, "Type of the object value. Use it to change the object.");
+ _typeItem = layout.AddPropertyItem(TypeComboBoxName, "Type of the object value. Use it to change the object.");
+ var typeEditor = _typeItem.ComboBox();
for (int i = 0; i < _options.Length; i++)
{
typeEditor.ComboBox.AddItem(_options[i].Name);
@@ -126,6 +132,8 @@ namespace FlaxEditor.CustomEditors.Editors
// Value
var values = new CustomValueContainer(type, (instance, index) => instance);
+ if (Values.HasReferenceValue)
+ values.SetReferenceValue(Values.ReferenceValue);
values.AddRange(Values);
var editor = CustomEditorsUtil.CreateEditor(type);
var style = editor.Style;
@@ -170,6 +178,12 @@ namespace FlaxEditor.CustomEditors.Editors
{
base.Refresh();
+ // Show prefab diff when reference value type is different
+ var color = Color.Transparent;
+ if (Values.HasReferenceValue && CanRevertReferenceValue && Values[0].GetType() != Values.ReferenceValue.GetType())
+ color = FlaxEngine.GUI.Style.Current.BackgroundSelected;
+ _typeItem.Labels[0].HighlightStripColor = color;
+
// Check if type has been modified outside the editor (eg. from code)
if (Type != _type)
{
diff --git a/Source/Engine/UI/GUI/Brushes/GPUTextureBrush.cs b/Source/Engine/UI/GUI/Brushes/GPUTextureBrush.cs
index fa4b5435d..781435740 100644
--- a/Source/Engine/UI/GUI/Brushes/GPUTextureBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/GPUTextureBrush.cs
@@ -1,12 +1,14 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
/// Implementation of for .
///
///
- public sealed class GPUTextureBrush : IBrush
+ public sealed class GPUTextureBrush : IBrush, IEquatable
{
///
/// The GPU texture.
@@ -47,5 +49,29 @@ namespace FlaxEngine.GUI
else
Render2D.DrawTexture(Texture, rect, color);
}
+
+ ///
+ public bool Equals(GPUTextureBrush other)
+ {
+ return other != null && Texture == other.Texture && Filter == other.Filter;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is GPUTextureBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Texture, (int)Filter);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
}
diff --git a/Source/Engine/UI/GUI/Brushes/IBrush.cs b/Source/Engine/UI/GUI/Brushes/IBrush.cs
index f11ff6857..861c0b7df 100644
--- a/Source/Engine/UI/GUI/Brushes/IBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/IBrush.cs
@@ -1,5 +1,7 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
@@ -23,7 +25,7 @@ namespace FlaxEngine.GUI
///
/// Interface that unifies input source textures, sprites, render targets, and any other brushes to be used in a more generic way.
///
- public interface IBrush
+ public interface IBrush : IComparable
{
///
/// Gets the size of the image brush in pixels (if relevant).
diff --git a/Source/Engine/UI/GUI/Brushes/LinearGradientBrush.cs b/Source/Engine/UI/GUI/Brushes/LinearGradientBrush.cs
index 1ece73d1c..d2155a31c 100644
--- a/Source/Engine/UI/GUI/Brushes/LinearGradientBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/LinearGradientBrush.cs
@@ -1,12 +1,14 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
/// Implementation of for linear color gradient (made of 2 color).
///
///
- public sealed class LinearGradientBrush : IBrush
+ public sealed class LinearGradientBrush : IBrush, IEquatable
{
///
/// The brush start color.
@@ -50,5 +52,29 @@ namespace FlaxEngine.GUI
var endColor = EndColor * color;
Render2D.FillRectangle(rect, startColor, startColor, endColor, endColor);
}
+
+ ///
+ public bool Equals(LinearGradientBrush other)
+ {
+ return other != null && StartColor == other.StartColor && EndColor == other.EndColor;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is LinearGradientBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(StartColor, EndColor);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
}
diff --git a/Source/Engine/UI/GUI/Brushes/MaterialBrush.cs b/Source/Engine/UI/GUI/Brushes/MaterialBrush.cs
index 13e9dab24..c610e9910 100644
--- a/Source/Engine/UI/GUI/Brushes/MaterialBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/MaterialBrush.cs
@@ -1,12 +1,14 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
/// Implementation of for rendering.
///
///
- public sealed class MaterialBrush : IBrush
+ public sealed class MaterialBrush : IBrush, IEquatable
{
///
/// The material.
@@ -38,5 +40,29 @@ namespace FlaxEngine.GUI
{
Render2D.DrawMaterial(Material, rect, color);
}
+
+ ///
+ public bool Equals(MaterialBrush other)
+ {
+ return other != null && Material == other.Material;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is MaterialBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Material);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
}
diff --git a/Source/Engine/UI/GUI/Brushes/SolidColorBrush.cs b/Source/Engine/UI/GUI/Brushes/SolidColorBrush.cs
index 1e4a20670..d848d9368 100644
--- a/Source/Engine/UI/GUI/Brushes/SolidColorBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/SolidColorBrush.cs
@@ -1,12 +1,14 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
/// Implementation of for single color fill.
///
///
- public sealed class SolidColorBrush : IBrush
+ public sealed class SolidColorBrush : IBrush, IEquatable
{
///
/// The brush color.
@@ -39,5 +41,29 @@ namespace FlaxEngine.GUI
{
Render2D.FillRectangle(rect, Color * color);
}
+
+ ///
+ public bool Equals(SolidColorBrush other)
+ {
+ return other != null && Color == other.Color;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is SolidColorBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Color);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
}
diff --git a/Source/Engine/UI/GUI/Brushes/SpriteBrush.cs b/Source/Engine/UI/GUI/Brushes/SpriteBrush.cs
index 205a9645c..24ca10015 100644
--- a/Source/Engine/UI/GUI/Brushes/SpriteBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/SpriteBrush.cs
@@ -1,12 +1,14 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
/// Implementation of for .
///
///
- public sealed class SpriteBrush : IBrush
+ public sealed class SpriteBrush : IBrush, IEquatable
{
///
/// The sprite.
@@ -47,6 +49,30 @@ namespace FlaxEngine.GUI
else
Render2D.DrawSprite(Sprite, rect, color);
}
+
+ ///
+ public bool Equals(SpriteBrush other)
+ {
+ return other != null && Sprite == other.Sprite && Filter == other.Filter;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is SpriteBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Sprite, (int)Filter);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
///
@@ -121,5 +147,29 @@ namespace FlaxEngine.GUI
}
#endif
}
+
+ ///
+ public bool Equals(Sprite9SlicingBrush other)
+ {
+ return other != null && Sprite == other.Sprite && Filter == other.Filter;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is Sprite9SlicingBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Sprite, (int)Filter);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
}
diff --git a/Source/Engine/UI/GUI/Brushes/TextureBrush.cs b/Source/Engine/UI/GUI/Brushes/TextureBrush.cs
index 189e222b9..e3922eebb 100644
--- a/Source/Engine/UI/GUI/Brushes/TextureBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/TextureBrush.cs
@@ -1,12 +1,14 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
/// Implementation of for .
///
///
- public sealed class TextureBrush : IBrush
+ public sealed class TextureBrush : IBrush, IEquatable
{
///
/// The texture.
@@ -47,13 +49,37 @@ namespace FlaxEngine.GUI
else
Render2D.DrawTexture(Texture, rect, color);
}
+
+ ///
+ public bool Equals(TextureBrush other)
+ {
+ return other != null && Texture == other.Texture && Filter == other.Filter;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is TextureBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Texture, (int)Filter);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
///
/// Implementation of for using 9-slicing.
///
///
- public sealed class Texture9SlicingBrush : IBrush
+ public sealed class Texture9SlicingBrush : IBrush, IEquatable
{
///
/// The texture.
@@ -130,5 +156,29 @@ namespace FlaxEngine.GUI
}
#endif
}
+
+ ///
+ public bool Equals(Texture9SlicingBrush other)
+ {
+ return other != null && Texture == other.Texture && Filter == other.Filter && BorderSize == other.BorderSize && Border == other.Border;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is Texture9SlicingBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Texture, (int)Filter, BorderSize, Border.GetHashCode());
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
}
diff --git a/Source/Engine/UI/GUI/Brushes/UIBrush.cs b/Source/Engine/UI/GUI/Brushes/UIBrush.cs
index 4441899c0..044c95285 100644
--- a/Source/Engine/UI/GUI/Brushes/UIBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/UIBrush.cs
@@ -1,5 +1,7 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
@@ -20,7 +22,7 @@ namespace FlaxEngine.GUI
///
///
///
- public sealed class UIBrush : IBrush
+ public sealed class UIBrush : IBrush, IEquatable
{
///
/// The UI Brush asset to use.
@@ -71,5 +73,29 @@ namespace FlaxEngine.GUI
if (asset != null && asset.Brush != null)
asset.Brush.Draw(rect, color);
}
+
+ ///
+ public bool Equals(UIBrush other)
+ {
+ return other != null && Asset == other.Asset;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is UIBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Asset);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
}
diff --git a/Source/Engine/UI/GUI/Brushes/VideoBrush.cs b/Source/Engine/UI/GUI/Brushes/VideoBrush.cs
index b8a54662c..25d942ca6 100644
--- a/Source/Engine/UI/GUI/Brushes/VideoBrush.cs
+++ b/Source/Engine/UI/GUI/Brushes/VideoBrush.cs
@@ -1,12 +1,14 @@
// Copyright (c) Wojciech Figat. All rights reserved.
+using System;
+
namespace FlaxEngine.GUI
{
///
/// Implementation of for frame displaying.
///
///
- public sealed class VideoBrush : IBrush
+ public sealed class VideoBrush : IBrush, IEquatable
{
///
/// The video player to display frame from it.
@@ -57,5 +59,29 @@ namespace FlaxEngine.GUI
else
Render2D.DrawTexture(texture, rect, color);
}
+
+ ///
+ public bool Equals(VideoBrush other)
+ {
+ return other != null && Player == other.Player && Filter == other.Filter;
+ }
+
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is VideoBrush other && Equals(other);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Player, (int)Filter);
+ }
+
+ ///
+ public int CompareTo(object obj)
+ {
+ return Equals(obj) ? 1 : 0;
+ }
}
}