From 49c900fc221794e5f6011c2361de6ee5e9c191da Mon Sep 17 00:00:00 2001 From: Yoshi Askharoun Date: Sun, 29 Dec 2024 17:17:40 -0600 Subject: [PATCH 1/3] Add reverse support for canonical instances --- .../Microsoft/Iris/IHasCanonicalInstances.cs | 6 ++++++ UIX/Microsoft/Iris/Animations/RelativeTo.cs | 13 +++++++++++-- UIX/Microsoft/Iris/Layouts/DockLayoutInput.cs | 9 +++++++-- UIX/Microsoft/Iris/Layouts/PlacementMode.cs | 11 ++++++++--- UIX/Microsoft/Iris/Markup/TypeSchema.cs | 2 ++ UIX/Microsoft/Iris/Markup/UIXTypeSchema.cs | 2 ++ 6 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 UIX.RenderApi/Microsoft/Iris/IHasCanonicalInstances.cs diff --git a/UIX.RenderApi/Microsoft/Iris/IHasCanonicalInstances.cs b/UIX.RenderApi/Microsoft/Iris/IHasCanonicalInstances.cs new file mode 100644 index 0000000..5f756ee --- /dev/null +++ b/UIX.RenderApi/Microsoft/Iris/IHasCanonicalInstances.cs @@ -0,0 +1,6 @@ +namespace Microsoft.Iris; + +public interface IHasCanonicalInstances +{ + string GetCanonicalName(); +} diff --git a/UIX/Microsoft/Iris/Animations/RelativeTo.cs b/UIX/Microsoft/Iris/Animations/RelativeTo.cs index 6e3143d..ea06ba3 100644 --- a/UIX/Microsoft/Iris/Animations/RelativeTo.cs +++ b/UIX/Microsoft/Iris/Animations/RelativeTo.cs @@ -8,7 +8,7 @@ using Microsoft.Iris.Render; namespace Microsoft.Iris.Animations { - public class RelativeTo + public class RelativeTo : IHasCanonicalInstances { private IAnimatable _sourceObject; private int _sourceId; @@ -125,6 +125,12 @@ namespace Microsoft.Iris.Animations } public override string ToString() + { + return GetCanonicalName() + ?? $"[Object = {_sourceObject ?? (object)_sourceId}, Property = {_sourceProperty}]"; + } + + public string GetCanonicalName() { if (this == s_absolute) return "Absolute"; @@ -132,7 +138,10 @@ namespace Microsoft.Iris.Animations return "Current"; if (this == s_currentSnapshotOnLoop) return "CurrentSnapshotOnLoop"; - return this == s_final ? "Final" : string.Format("[Object = {0}, Property = {1}]", _sourceObject != null ? _sourceObject : (object)_sourceId, _sourceProperty); + if (this == s_final) + return "Final"; + + return null; } } } diff --git a/UIX/Microsoft/Iris/Layouts/DockLayoutInput.cs b/UIX/Microsoft/Iris/Layouts/DockLayoutInput.cs index 4ed05c2..9d5c00b 100644 --- a/UIX/Microsoft/Iris/Layouts/DockLayoutInput.cs +++ b/UIX/Microsoft/Iris/Layouts/DockLayoutInput.cs @@ -9,7 +9,7 @@ using Microsoft.Iris.Library; namespace Microsoft.Iris.Layouts { - internal class DockLayoutInput : ILayoutInput, IStringEncodable + internal class DockLayoutInput : ILayoutInput, IStringEncodable, IHasCanonicalInstances { public static readonly DockLayoutInput Left = new DockLayoutInput(); public static readonly DockLayoutInput Top = new DockLayoutInput(); @@ -35,12 +35,17 @@ namespace Microsoft.Iris.Layouts return "Top"; if (this == Right) return "Right"; - return this == Bottom ? "Bottom" : "Client"; + if (this == Bottom) + return "Bottom"; + + return "Client"; } } public override string ToString() => InvariantString.Format("{0}(Position={1})", GetType().Name, PositionString); public string EncodeString() => PositionString; + + public string GetCanonicalName() => PositionString; } } diff --git a/UIX/Microsoft/Iris/Layouts/PlacementMode.cs b/UIX/Microsoft/Iris/Layouts/PlacementMode.cs index f080c1c..87797ae 100644 --- a/UIX/Microsoft/Iris/Layouts/PlacementMode.cs +++ b/UIX/Microsoft/Iris/Layouts/PlacementMode.cs @@ -6,7 +6,7 @@ namespace Microsoft.Iris.Layouts { - internal class PlacementMode + internal class PlacementMode : IHasCanonicalInstances { private PopupPosition[] _popupPositions; private MouseTarget _mouseTarget; @@ -50,7 +50,9 @@ namespace Microsoft.Iris.Layouts internal bool UsesTargetSize => _usesTargetSize; - public override string ToString() + public override string ToString() => GetCanonicalName() ?? base.ToString(); + + public string GetCanonicalName() { if (this == s_origin) return "Origin"; @@ -70,7 +72,10 @@ namespace Microsoft.Iris.Layouts return "MouseBottom"; if (this == s_followMouseOrigin) return "FollowMouseOrigin"; - return this == s_followMouseBottom ? "FollowMouseBottom" : base.ToString(); + if (this == s_followMouseBottom) + return "FollowMouseBottom"; + + return null; } public static PlacementMode Origin diff --git a/UIX/Microsoft/Iris/Markup/TypeSchema.cs b/UIX/Microsoft/Iris/Markup/TypeSchema.cs index 38f4231..136e07e 100644 --- a/UIX/Microsoft/Iris/Markup/TypeSchema.cs +++ b/UIX/Microsoft/Iris/Markup/TypeSchema.cs @@ -93,6 +93,8 @@ namespace Microsoft.Iris.Markup public abstract bool SupportsBinaryEncoding { get; } + public virtual bool SupportsCanonicalInstance => false; + public abstract object PerformOperation(object left, object right, OperationType op); public abstract bool SupportsOperation(OperationType op); diff --git a/UIX/Microsoft/Iris/Markup/UIXTypeSchema.cs b/UIX/Microsoft/Iris/Markup/UIXTypeSchema.cs index f730874..66b6035 100644 --- a/UIX/Microsoft/Iris/Markup/UIXTypeSchema.cs +++ b/UIX/Microsoft/Iris/Markup/UIXTypeSchema.cs @@ -234,6 +234,8 @@ namespace Microsoft.Iris.Markup public override bool SupportsBinaryEncoding => _encodeBinary != null; + public override bool SupportsCanonicalInstance => _findCanonicalInstance != null; + public override int FindTypeHint => _typeID; public override object PerformOperation(object left, object right, OperationType op) From 5fa6a3b202afa04dc45bfb1a023bc25e8082195d Mon Sep 17 00:00:00 2001 From: Yoshi Askharoun Date: Sun, 29 Dec 2024 17:28:34 -0600 Subject: [PATCH 2/3] Rename variables in AnchorLayoutSchema --- .../Iris/Markup/UIX/AnchorLayoutSchema.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/UIX/Microsoft/Iris/Markup/UIX/AnchorLayoutSchema.cs b/UIX/Microsoft/Iris/Markup/UIX/AnchorLayoutSchema.cs index f0553a3..e80dfcf 100644 --- a/UIX/Microsoft/Iris/Markup/UIX/AnchorLayoutSchema.cs +++ b/UIX/Microsoft/Iris/Markup/UIX/AnchorLayoutSchema.cs @@ -43,17 +43,18 @@ namespace Microsoft.Iris.Markup.UIX out object instance) { instance = Construct(); - object valueObj1; - Result result1 = UIXLoadResult.ValidateStringAsValue(splitString[0], BooleanSchema.Type, null, out valueObj1); - if (result1.Failed) - return Result.Fail("Problem converting '{0}' ({1})", "AnchorLayout", result1.Error); - SetSizeToHorizontalChildren(ref instance, valueObj1); - object valueObj2; - Result result2 = UIXLoadResult.ValidateStringAsValue(splitString[1], BooleanSchema.Type, null, out valueObj2); - if (result2.Failed) - return Result.Fail("Problem converting '{0}' ({1})", "AnchorLayout", result2.Error); - SetSizeToVerticalChildren(ref instance, valueObj2); - return result2; + var horizontalResult = UIXLoadResult.ValidateStringAsValue(splitString[0], BooleanSchema.Type, null, out object horizontalValue); + if (horizontalResult.Failed) + return Result.Fail("Problem converting '{0}' ({1})", "AnchorLayout", horizontalResult.Error); + + SetSizeToHorizontalChildren(ref instance, horizontalValue); + + var verticalResult = UIXLoadResult.ValidateStringAsValue(splitString[1], BooleanSchema.Type, null, out object verticalValue); + if (verticalResult.Failed) + return Result.Fail("Problem converting '{0}' ({1})", "AnchorLayout", verticalResult.Error); + SetSizeToVerticalChildren(ref instance, verticalValue); + + return verticalResult; } private static bool IsConversionSupported(TypeSchema fromType) => StringSchema.Type.IsAssignableFrom(fromType); From 550f8b6771b0bc5dc442f16c8ec35a6800d7e1a4 Mon Sep 17 00:00:00 2001 From: Yoshi Askharoun Date: Tue, 28 Jan 2025 00:31:57 -0600 Subject: [PATCH 3/3] Introduce ITypeSchemaWithInternalType --- UIX/Microsoft/Iris/Markup/AssemblyTypeSchema.cs | 2 +- UIX/Microsoft/Iris/Markup/ITypeSchemaWithInternalType.cs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 UIX/Microsoft/Iris/Markup/ITypeSchemaWithInternalType.cs diff --git a/UIX/Microsoft/Iris/Markup/AssemblyTypeSchema.cs b/UIX/Microsoft/Iris/Markup/AssemblyTypeSchema.cs index 86bfe09..7c63ba2 100644 --- a/UIX/Microsoft/Iris/Markup/AssemblyTypeSchema.cs +++ b/UIX/Microsoft/Iris/Markup/AssemblyTypeSchema.cs @@ -12,7 +12,7 @@ using System.Reflection; namespace Microsoft.Iris.Markup { - internal class AssemblyTypeSchema : TypeSchema + internal class AssemblyTypeSchema : TypeSchema, ITypeSchemaWithInternalType { private Type _type; private TypeSchema _baseType; diff --git a/UIX/Microsoft/Iris/Markup/ITypeSchemaWithInternalType.cs b/UIX/Microsoft/Iris/Markup/ITypeSchemaWithInternalType.cs new file mode 100644 index 0000000..99b94e4 --- /dev/null +++ b/UIX/Microsoft/Iris/Markup/ITypeSchemaWithInternalType.cs @@ -0,0 +1,8 @@ +using System; + +namespace Microsoft.Iris.Markup; + +public interface ITypeSchemaWithInternalType +{ + Type InternalType { get; } +}