From 35501c2f17b3e20b8054599c0797e97a63c2d719 Mon Sep 17 00:00:00 2001 From: Naukri Date: Tue, 21 Nov 2023 13:57:24 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E9=87=8D=E6=A7=8B=20:=20=E7=B5=B1=E4=B8=80?= =?UTF-8?q?=20VisualWidget=20=E5=8F=8A=20LogicWidget=20=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E7=B0=A1=E5=8C=96=E9=81=8E=E6=96=BC=E8=A4=87=E9=9B=9C=E7=9A=84?= =?UTF-8?q?=E7=B9=BC=E6=89=BF=E7=B5=90=E6=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/{Contexts/Core => }/Context.cs | 31 +++++++-- .../{Contexts/Core => }/Context.cs.meta | 0 .../Editor/Contexts/Core.meta | 8 --- .../Editor/Contexts/Core/VisualContext.cs | 33 --------- .../Contexts/Core/VisualContext.cs.meta | 11 --- .../Editor/Contexts/MultiChildContext.cs | 28 ++------ .../Contexts/MultiChildVisualContext.cs | 24 ------- .../Contexts/MultiChildVisualContext.cs.meta | 11 --- .../Editor/Contexts/NoneChildContext.cs | 26 ++----- .../Editor/Contexts/NoneChildVisualContext.cs | 21 ------ .../Contexts/NoneChildVisualContext.cs.meta | 11 --- .../Editor/Contexts/SingleChildContext.cs | 30 ++------ .../Contexts/SingleChildVisualContext.cs | 23 ------- .../Contexts/SingleChildVisualContext.cs.meta | 11 --- .../{Widgets => }/Core/IAttributeProvider.cs | 2 +- .../Core/IAttributeProvider.cs.meta | 2 +- .../{Widgets => }/Core/IWidgetProvider.cs | 4 +- .../Core/IWidgetProvider.cs.meta | 2 +- .../Editor/Core/InspectorMaidEditor.cs | 1 - .../Editor/Core/WidgetBuilder.cs | 6 +- .../{ItemWidgetOf.cs => Core/WidgetOf.cs} | 11 ++- .../WidgetOf.cs.meta} | 0 .../Editor/Extensions/ContextExtensions.cs | 3 +- .../Extensions/IBuildContextExtensions.cs | 14 +++- .../Editor/Helpers/InspectorMaidUtility.cs | 68 ++++++++++++++----- .../Editor/IBuildContext.cs | 10 ++- .../Editor/ItemWidgetOf.cs.meta | 11 --- .../Editor/LogicWidgetOf.cs | 33 --------- .../Editor/ScopeWidgetOf.cs | 33 --------- .../Editor/StylerWidgetOf.cs | 31 +++------ .../Editor/UIElements/MethodElement.cs | 4 +- .../Editor/VisualWidgetOf.cs | 12 ++++ ...idgetOf.cs.meta => VisualWidgetOf.cs.meta} | 0 .../Editor/Widget.cs | 34 ++++++++++ .../VisualWidget.cs.meta => Widget.cs.meta} | 0 .../Editor/Widgets/Core.meta | 8 --- .../Editor/Widgets/Core/IWidget.cs | 9 --- .../Editor/Widgets/Core/IWidget.cs.meta | 11 --- .../Editor/Widgets/Core/ItemWidget.cs | 11 --- .../Editor/Widgets/Core/ItemWidget.cs.meta | 11 --- .../Editor/Widgets/Core/LogicWidget.cs | 9 --- .../Editor/Widgets/Core/LogicWidget.cs.meta | 11 --- .../Editor/Widgets/Core/MultiChildWidget.cs | 10 --- .../Widgets/Core/MultiChildWidget.cs.meta | 11 --- .../Editor/Widgets/Core/NoneChildWidget.cs | 10 --- .../Widgets/Core/NoneChildWidget.cs.meta | 11 --- .../Editor/Widgets/Core/ScopeWidget.cs | 10 --- .../Editor/Widgets/Core/ScopeWidget.cs.meta | 11 --- .../Editor/Widgets/Core/SingleChildWidget.cs | 10 --- .../Widgets/Core/SingleChildWidget.cs.meta | 11 --- .../Editor/Widgets/Core/VisualWidget.cs | 40 ----------- .../Editor/Widgets/Logic/ServiceWidget.cs | 9 ++- .../Receivers/IContextAttachedReceiver.cs | 4 +- .../Widgets/Receivers/IParentBuiltReceiver.cs | 9 +++ ...r.cs.meta => IParentBuiltReceiver.cs.meta} | 0 .../Widgets/Receivers/IStylingReceiver.cs | 9 --- .../Editor/Widgets/Styler/HideWidget.cs | 6 +- .../Editor/Widgets/Styler/LabelWidget.cs | 6 +- .../Editor/Widgets/Styler/ReadOnlyWidget.cs | 4 +- .../Editor/Widgets/Styler/StyleWidget.cs | 6 +- .../Editor/Widgets/Styler/StylerWidget.cs | 11 --- .../Widgets/Styler/StylerWidget.cs.meta | 11 --- .../Editor/Widgets/Visual/ButtonWidget.cs | 12 ++-- .../Editor/Widgets/Visual/CardScopeWidget.cs | 2 +- .../Editor/Widgets/Visual/ClassWidget.cs | 46 ++++++------- .../Widgets/Visual/ColumnScopeWidget.cs | 2 +- .../Widgets/Visual/DisableIfScopeWidget.cs | 3 +- .../Editor/Widgets/Visual/DividerWidget.cs | 2 +- .../Widgets/Visual/EnableIfScopeWidget.cs | 3 +- .../Widgets/Visual/FoldoutScopeWidget.cs | 2 +- .../Editor/Widgets/Visual/HelpBoxWidget.cs | 2 +- .../Widgets/Visual/HideIfScopeWidget.cs | 3 +- .../{Core => Visual}/IfScopeWidgetOf.cs | 32 ++------- .../{Core => Visual}/IfScopeWidgetOf.cs.meta | 0 .../Widgets/Visual/Layout/FieldsWidget.cs | 5 +- .../Widgets/Visual/Layout/MembersWidget.cs | 5 +- .../Widgets/Visual/Layout/MethodsWidget.cs | 5 +- .../Widgets/Visual/Layout/PropertiesWidget.cs | 5 +- .../Editor/Widgets/Visual/MemberWidget.cs | 7 +- .../Editor/Widgets/Visual/RowScopeWidget.cs | 2 +- .../Widgets/Visual/ScriptFieldWidget.cs | 2 +- .../Widgets/Visual/ShowIfScopeWidget.cs | 3 +- .../Editor/Widgets/Visual/SlotWidget.cs | 5 +- .../Editor/Widgets/Visual/SpacerWidget.cs | 2 +- .../Editor/Widgets/Visual/TargetWidget.cs | 2 +- .../Runtime/ButtonAttribute.cs | 6 +- .../Runtime/Core/IBindingDataProvider.cs | 3 +- .../Runtime/Core/StylerAttribute.cs | 2 +- .../01. Widget's Attributes/Samples.unity | 16 +++-- .../Scripts/Editor/CardSlotWidget.cs | 3 +- .../Scripts/HideSample.cs | 2 +- .../Scripts/ShowIfScopeSample.cs | 3 +- .../Scripts/TargetSample.cs | 3 +- 93 files changed, 294 insertions(+), 714 deletions(-) rename Packages/com.naukri.inspector-maid/Editor/{Contexts/Core => }/Context.cs (76%) rename Packages/com.naukri.inspector-maid/Editor/{Contexts/Core => }/Context.cs.meta (100%) delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/Core.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/Core/VisualContext.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/Core/VisualContext.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildVisualContext.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildVisualContext.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildVisualContext.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildVisualContext.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs.meta rename Packages/com.naukri.inspector-maid/Editor/{Widgets => }/Core/IAttributeProvider.cs (64%) rename Packages/com.naukri.inspector-maid/Editor/{Widgets => }/Core/IAttributeProvider.cs.meta (83%) rename Packages/com.naukri.inspector-maid/Editor/{Widgets => }/Core/IWidgetProvider.cs (60%) rename Packages/com.naukri.inspector-maid/Editor/{Widgets => }/Core/IWidgetProvider.cs.meta (83%) rename Packages/com.naukri.inspector-maid/Editor/{ItemWidgetOf.cs => Core/WidgetOf.cs} (64%) rename Packages/com.naukri.inspector-maid/Editor/{LogicWidgetOf.cs.meta => Core/WidgetOf.cs.meta} (100%) delete mode 100644 Packages/com.naukri.inspector-maid/Editor/ItemWidgetOf.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs create mode 100644 Packages/com.naukri.inspector-maid/Editor/VisualWidgetOf.cs rename Packages/com.naukri.inspector-maid/Editor/{ScopeWidgetOf.cs.meta => VisualWidgetOf.cs.meta} (100%) create mode 100644 Packages/com.naukri.inspector-maid/Editor/Widget.cs rename Packages/com.naukri.inspector-maid/Editor/{Widgets/Core/VisualWidget.cs.meta => Widget.cs.meta} (100%) delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidget.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidget.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ItemWidget.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ItemWidget.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/LogicWidget.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/LogicWidget.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/MultiChildWidget.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/MultiChildWidget.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/NoneChildWidget.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/NoneChildWidget.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/SingleChildWidget.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/SingleChildWidget.cs.meta delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs create mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IParentBuiltReceiver.cs rename Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/{IStylingReceiver.cs.meta => IParentBuiltReceiver.cs.meta} (100%) delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IStylingReceiver.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/StylerWidget.cs delete mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/StylerWidget.cs.meta rename Packages/com.naukri.inspector-maid/Editor/Widgets/{Core => Visual}/IfScopeWidgetOf.cs (67%) rename Packages/com.naukri.inspector-maid/Editor/Widgets/{Core => Visual}/IfScopeWidgetOf.cs.meta (100%) diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/Context.cs b/Packages/com.naukri.inspector-maid/Editor/Context.cs similarity index 76% rename from Packages/com.naukri.inspector-maid/Editor/Contexts/Core/Context.cs rename to Packages/com.naukri.inspector-maid/Editor/Context.cs index 8d0b90f..cf32b3f 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/Context.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Context.cs @@ -1,19 +1,28 @@ using Naukri.InspectorMaid.Editor.Extensions; -using Naukri.InspectorMaid.Editor.Widgets.Core; using Naukri.InspectorMaid.Editor.Widgets.Receivers; using System; +using UnityEngine.UIElements; -namespace Naukri.InspectorMaid.Editor.Contexts.Core +namespace Naukri.InspectorMaid.Editor { public abstract class Context : IBuildContext { + protected Context(Widget widget) + { + _widget = widget; + } + + public VisualElement renderedElement; + + private readonly Widget _widget; + private Context _parent; public Context Parent => _parent; - public abstract IWidget Widget { get; } + public Widget Widget => _widget; - public T GetAncestorWidget() where T : IWidget + public T GetAncestorWidget() where T : Widget { T res = default; @@ -31,7 +40,7 @@ public T GetAncestorWidget() where T : IWidget return res; } - public Context GetContextOfAncestorWidget() where T : IWidget + public Context GetContextOfAncestorWidget() where T : Widget { Context res = null; @@ -75,6 +84,18 @@ public void Attach(Context child) child.VisitReceiver((ctx, r) => r.OnContextAttached(ctx)); } + internal VisualElement Build() + { + renderedElement = _widget.Build(this); + + this.VisitChildReceivers((ctx, r) => + { + r.OnParentBuilt(ctx, renderedElement); + }); + + return renderedElement; + } + internal T GetAncestorContext() where T : Context { T res = null; diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/Context.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Context.cs.meta similarity index 100% rename from Packages/com.naukri.inspector-maid/Editor/Contexts/Core/Context.cs.meta rename to Packages/com.naukri.inspector-maid/Editor/Context.cs.meta diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core.meta b/Packages/com.naukri.inspector-maid/Editor/Contexts/Core.meta deleted file mode 100644 index 2ec31a4..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 72d19e32d4b3498469f86176f8ea8dd3 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/VisualContext.cs b/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/VisualContext.cs deleted file mode 100644 index e44d5bf..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/VisualContext.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Naukri.InspectorMaid.Editor.Extensions; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using Naukri.InspectorMaid.Editor.Widgets.Receivers; -using UnityEngine.UIElements; - -namespace Naukri.InspectorMaid.Editor.Contexts.Core -{ - public abstract class VisualContext : Context - { - protected VisualContext(VisualWidget widget) - { - this.widget = widget; - } - - public VisualElement renderedElement; - - protected VisualWidget widget; - - public override IWidget Widget => widget; - - internal VisualElement Build() - { - renderedElement = widget.Build(this); - - this.VisitChildReceivers((ctx, r) => - { - r.OnStyling(ctx, renderedElement); - }); - - return renderedElement; - } - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/VisualContext.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/VisualContext.cs.meta deleted file mode 100644 index 182513c..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/Core/VisualContext.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 101a48db2276ea542a4b26f1bf82b5ba -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildContext.cs b/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildContext.cs index 813a821..0aba60c 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildContext.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildContext.cs @@ -1,35 +1,17 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; +using System; using System.Collections.Generic; namespace Naukri.InspectorMaid.Editor.Contexts { - public sealed partial class MultiChildContext : Context + public sealed class MultiChildContext : Context { - public MultiChildContext(IWidget widget) + public MultiChildContext(Widget widget) : base(widget) { - Widget = widget; } private readonly List children = new(); - public override IWidget Widget { get; } - public override void VisitChildContexts(Action visitor) - { - VisitChildContextsImpl(children, visitor); - } - - protected override void OnChildAttached(Context child) - { - OnChildAttachedImpl(children, child); - } - } - - partial class MultiChildContext - { - internal static void VisitChildContextsImpl(List children, Action visitor) { // copy children to avoid concurrent modification var childContexts = children.ToArray(); @@ -39,10 +21,12 @@ internal static void VisitChildContextsImpl(List children, Action children, Context child) + protected override void OnChildAttached(Context child) { if (children.Contains(child)) + { throw new Exception($"{nameof(MultiChildContext)} contains this child already."); + } children.Add(child); } diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildVisualContext.cs b/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildVisualContext.cs deleted file mode 100644 index 6f0fa2f..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildVisualContext.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; -using System.Collections.Generic; - -namespace Naukri.InspectorMaid.Editor.Contexts -{ - public sealed class MultiChildVisualContext : VisualContext - { - public MultiChildVisualContext(VisualWidget widget) : base(widget) { } - - private readonly List children = new(); - - public override void VisitChildContexts(Action visitor) - { - MultiChildContext.VisitChildContextsImpl(children, visitor); - } - - protected override void OnChildAttached(Context child) - { - MultiChildContext.OnChildAttachedImpl(children, child); - } - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildVisualContext.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildVisualContext.cs.meta deleted file mode 100644 index bc90f60..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/MultiChildVisualContext.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6ae0e3677edb43e42a8533a448fcd530 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildContext.cs b/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildContext.cs index 38c01e8..e679da3 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildContext.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildContext.cs @@ -1,37 +1,19 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; +using System; namespace Naukri.InspectorMaid.Editor.Contexts { - public partial class NoneChildContext : Context + public class NoneChildContext : Context { - public NoneChildContext(IWidget widget) + public NoneChildContext(Widget widget) : base(widget) { - Widget = widget; } - public override IWidget Widget { get; } - public override void VisitChildContexts(Action visitor) - { - VisitChildContextsImpl(visitor); - } - - protected override void OnChildAttached(Context child) - { - OnChildAttachedImpl(child); - } - } - - partial class NoneChildContext - { - internal static void VisitChildContextsImpl(Action visitor) { // Do nothing. Because sometime we doesn't know if this context is NoneChildVisualContext or not. } - internal static void OnChildAttachedImpl(Context child) + protected override void OnChildAttached(Context child) { throw new InvalidOperationException($"{nameof(NoneChildContext)} is not support child context."); } diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildVisualContext.cs b/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildVisualContext.cs deleted file mode 100644 index 84367ff..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildVisualContext.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; - -namespace Naukri.InspectorMaid.Editor.Contexts -{ - public class NoneChildVisualContext : VisualContext - { - public NoneChildVisualContext(VisualWidget widget) : base(widget) { } - - public override void VisitChildContexts(Action visitor) - { - NoneChildContext.VisitChildContextsImpl(visitor); - } - - protected override void OnChildAttached(Context child) - { - NoneChildContext.OnChildAttachedImpl(child); - } - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildVisualContext.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildVisualContext.cs.meta deleted file mode 100644 index e6227a5..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/NoneChildVisualContext.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e20078aa41b3f944193ae37063df2a4a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildContext.cs b/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildContext.cs index ff7f4e1..1232588 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildContext.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildContext.cs @@ -1,46 +1,28 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; +using System; namespace Naukri.InspectorMaid.Editor.Contexts { public sealed partial class SingleChildContext : Context { - public SingleChildContext(IWidget widget) + public SingleChildContext(Widget widget) : base(widget) { - Widget = widget; } private Context child; - public override IWidget Widget { get; } - public override void VisitChildContexts(Action visitor) { - VisitChildContexts(ref child, visitor); + visitor(child); } protected override void OnChildAttached(Context child) { - OnChildAttached(ref this.child, child); - } - } - - partial class SingleChildContext - { - internal static void VisitChildContexts(ref Context childRef, Action visitor) - { - visitor(childRef); - } - - internal static void OnChildAttached(ref Context childRef, Context child) - { - if (childRef != null) + if (this.child != null) { - throw new Exception($"{nameof(SingleChildContext)} can only have one child"); + throw new Exception($"{nameof(SingleChildContext)} must have only one child."); } - childRef = child; + this.child = child; } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs b/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs deleted file mode 100644 index f957a35..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; - -namespace Naukri.InspectorMaid.Editor.Contexts -{ - public sealed class SingleChildVisualContext : VisualContext - { - public SingleChildVisualContext(VisualWidget widget) : base(widget) { } - - private Context child; - - public override void VisitChildContexts(Action visitor) - { - SingleChildContext.VisitChildContexts(ref child, visitor); - } - - protected override void OnChildAttached(Context child) - { - SingleChildContext.OnChildAttached(ref this.child, child); - } - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs.meta deleted file mode 100644 index 18642f5..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 459518c0002886349b8e631bdc0ccb32 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IAttributeProvider.cs b/Packages/com.naukri.inspector-maid/Editor/Core/IAttributeProvider.cs similarity index 64% rename from Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IAttributeProvider.cs rename to Packages/com.naukri.inspector-maid/Editor/Core/IAttributeProvider.cs index 489f98d..609974c 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IAttributeProvider.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Core/IAttributeProvider.cs @@ -1,4 +1,4 @@ -namespace Naukri.InspectorMaid.Editor.Widgets.Core +namespace Naukri.InspectorMaid.Editor.Core { internal interface IAttributeProvider { diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IAttributeProvider.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Core/IAttributeProvider.cs.meta similarity index 83% rename from Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IAttributeProvider.cs.meta rename to Packages/com.naukri.inspector-maid/Editor/Core/IAttributeProvider.cs.meta index 023390f..221f44f 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IAttributeProvider.cs.meta +++ b/Packages/com.naukri.inspector-maid/Editor/Core/IAttributeProvider.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 14982c2dcf512944cb5f0a738a459695 +guid: 97f6c91819eecae439d173fb7c284d3e MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidgetProvider.cs b/Packages/com.naukri.inspector-maid/Editor/Core/IWidgetProvider.cs similarity index 60% rename from Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidgetProvider.cs rename to Packages/com.naukri.inspector-maid/Editor/Core/IWidgetProvider.cs index 9bab6d8..be8a0da 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidgetProvider.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Core/IWidgetProvider.cs @@ -1,12 +1,12 @@ using Naukri.InspectorMaid.Core; using System; -namespace Naukri.InspectorMaid.Editor.Widgets.Core +namespace Naukri.InspectorMaid.Editor.Core { internal interface IWidgetProvider : IAttributeProvider { public Type RegisterType { get; } - public IWidget CloneWith(WidgetAttribute attribute); + public Widget CloneWith(WidgetAttribute attribute); } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidgetProvider.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Core/IWidgetProvider.cs.meta similarity index 83% rename from Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidgetProvider.cs.meta rename to Packages/com.naukri.inspector-maid/Editor/Core/IWidgetProvider.cs.meta index 345e428..df8113c 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidgetProvider.cs.meta +++ b/Packages/com.naukri.inspector-maid/Editor/Core/IWidgetProvider.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e196723bbdf8d9b4c83c1c26676446f4 +guid: aecec575d3f03d149b7194d7c46248b3 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Packages/com.naukri.inspector-maid/Editor/Core/InspectorMaidEditor.cs b/Packages/com.naukri.inspector-maid/Editor/Core/InspectorMaidEditor.cs index 34b787c..c3a9237 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Core/InspectorMaidEditor.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Core/InspectorMaidEditor.cs @@ -1,6 +1,5 @@ using Naukri.InspectorMaid.Editor.Helpers; using Naukri.InspectorMaid.Editor.Services; -using Naukri.InspectorMaid.Editor.UIElements; using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Core diff --git a/Packages/com.naukri.inspector-maid/Editor/Core/WidgetBuilder.cs b/Packages/com.naukri.inspector-maid/Editor/Core/WidgetBuilder.cs index cb257b0..c3e42e8 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Core/WidgetBuilder.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Core/WidgetBuilder.cs @@ -1,5 +1,4 @@ using Naukri.InspectorMaid.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; using System; using System.Collections.Generic; using System.Linq; @@ -11,7 +10,7 @@ public static class WidgetBuilder { private static Dictionary _templates; - public static IWidget Create(WidgetAttribute attribute) + public static Widget Create(WidgetAttribute attribute) { var template = GetTemplate(attribute.GetType()); var inst = template.CloneWith(attribute); @@ -21,7 +20,10 @@ public static IWidget Create(WidgetAttribute attribute) private static IWidgetProvider GetTemplate(Type type) { if (_templates == null) + { InitDict(); + } + return _templates[type]; } diff --git a/Packages/com.naukri.inspector-maid/Editor/ItemWidgetOf.cs b/Packages/com.naukri.inspector-maid/Editor/Core/WidgetOf.cs similarity index 64% rename from Packages/com.naukri.inspector-maid/Editor/ItemWidgetOf.cs rename to Packages/com.naukri.inspector-maid/Editor/Core/WidgetOf.cs index e796c0b..4717cd2 100644 --- a/Packages/com.naukri.inspector-maid/Editor/ItemWidgetOf.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Core/WidgetOf.cs @@ -1,12 +1,11 @@ using Naukri.InspectorMaid.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; using System; using System.Diagnostics.CodeAnalysis; -namespace Naukri.InspectorMaid.Editor +namespace Naukri.InspectorMaid.Editor.Core { - public abstract class ItemWidgetOf : ItemWidget, IWidgetProvider - where TAttribute : ItemAttribute + public abstract class WidgetOf : Widget, IWidgetProvider + where TAttribute : WidgetAttribute { private TAttribute _attribute; @@ -17,9 +16,9 @@ public abstract class ItemWidgetOf : ItemWidget, IWidgetProvider Type IWidgetProvider.RegisterType => typeof(TAttribute); - IWidget IWidgetProvider.CloneWith(WidgetAttribute attribute) + Widget IWidgetProvider.CloneWith(WidgetAttribute attribute) { - var cloned = (ItemWidgetOf)MemberwiseClone(); + var cloned = (WidgetOf)MemberwiseClone(); cloned._attribute = attribute switch { diff --git a/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Core/WidgetOf.cs.meta similarity index 100% rename from Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs.meta rename to Packages/com.naukri.inspector-maid/Editor/Core/WidgetOf.cs.meta diff --git a/Packages/com.naukri.inspector-maid/Editor/Extensions/ContextExtensions.cs b/Packages/com.naukri.inspector-maid/Editor/Extensions/ContextExtensions.cs index 7d4cc3c..9da0261 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Extensions/ContextExtensions.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Extensions/ContextExtensions.cs @@ -1,5 +1,4 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using Naukri.InspectorMaid.Editor.Widgets.Receivers; +using Naukri.InspectorMaid.Editor.Widgets.Receivers; using System; namespace Naukri.InspectorMaid.Editor.Extensions diff --git a/Packages/com.naukri.inspector-maid/Editor/Extensions/IBuildContextExtensions.cs b/Packages/com.naukri.inspector-maid/Editor/Extensions/IBuildContextExtensions.cs index 964dc0a..c99296f 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Extensions/IBuildContextExtensions.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Extensions/IBuildContextExtensions.cs @@ -1,10 +1,11 @@ using Naukri.InspectorMaid.Core; +using Naukri.InspectorMaid.Editor.Core; using Naukri.InspectorMaid.Editor.Helpers; -using Naukri.InspectorMaid.Editor.Widgets.Core; using Naukri.InspectorMaid.Editor.Widgets.Logic; using Naukri.InspectorMaid.Editor.Widgets.Visual; using System; using System.Reflection; +using UnityEditor; namespace Naukri.InspectorMaid.Editor.Extensions { @@ -49,11 +50,20 @@ public static MemberInfo GetBindingInfo(this IBuildContext context) public static MemberInfo GetInfo(this IBuildContext context, string memberName) { - var classWidget = ClassWidget.Of(context); + var classWidget = ClassWidget.Of(context) ?? throw new Exception($"[{nameof(ClassWidget)}] not found in context."); var targetType = classWidget.target.GetType(); return targetType.GetMemberToBase(InspectorMaidUtility.kBaseType, memberName); } + public static void RecordAndSetDirty(this IBuildContext context, string changeEventName) + { + var classWidget = ClassWidget.Of(context) ?? throw new Exception($"[{nameof(ClassWidget)}] not found in context."); + var serializedTarget = classWidget.serializedTarget; + + Undo.RecordObject(serializedTarget, changeEventName); + EditorUtility.SetDirty(serializedTarget); + } + internal static bool TryGetAttribute(this IBuildContext context, out T attribute) { if (context.Widget is IAttributeProvider attributeProvider) diff --git a/Packages/com.naukri.inspector-maid/Editor/Helpers/InspectorMaidUtility.cs b/Packages/com.naukri.inspector-maid/Editor/Helpers/InspectorMaidUtility.cs index 457e73d..e813f6f 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Helpers/InspectorMaidUtility.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Helpers/InspectorMaidUtility.cs @@ -1,10 +1,8 @@ using Naukri.InspectorMaid.Core; -using Naukri.InspectorMaid.Editor.Contexts.Core; using Naukri.InspectorMaid.Editor.Core; using Naukri.InspectorMaid.Editor.Extensions; using Naukri.InspectorMaid.Editor.Services; using Naukri.InspectorMaid.Editor.Services.Default; -using Naukri.InspectorMaid.Editor.Widgets.Core; using Naukri.InspectorMaid.Editor.Widgets.Logic; using Naukri.InspectorMaid.Editor.Widgets.Visual; using System; @@ -12,6 +10,7 @@ using System.Reflection; using UnityEditor; using UnityEngine; +using UObject = UnityEngine.Object; namespace Naukri.InspectorMaid.Editor.Helpers { @@ -24,7 +23,29 @@ internal static class InspectorMaidUtility // this should be same as InspectorMaidEditor's CustomEditor attribute public static readonly Type kBaseType = typeof(MonoBehaviour); - public static VisualContext CreateClassContext(object target, SerializedProperty serializedProperty) + public static bool IsBoxedValueEqual(object lhs, object rhs) + { + // Because Unity override '==' operator for UObject. + // So if any of them is UObject, compare them by '==' operator. + if (lhs is UObject || rhs is UObject) + { + var uLhs = lhs as UObject; + var uRhs = rhs as UObject; + return uLhs == uRhs; + } + // Compare them in other case. + else + { + // Cause of the boxing, we can't use '==' operator, otherwise it will compare them by reference. + // e.g. + // object a = 1; + // object b = 1; + // bool c = a == b; // c is false + return Equals(lhs, rhs); + } + } + + public static Context CreateClassContext(object target, SerializedProperty serializedProperty) { var serviceWidget = new ServiceWidget(); var serviceContext = serviceWidget.CreateContext(); @@ -55,7 +76,7 @@ public static void CreateWidgetContextsAndAttach(Context parentContext, IEnumera var lastVisualContext = parentContext; - void BuildContextTree(Context parent) + void BuildContextTree(Context parentContext) { while (iteractor.MoveNext()) { @@ -65,19 +86,30 @@ void BuildContextTree(Context parent) { var childWidget = WidgetBuilder.Create(widgetAttr); var childContext = childWidget.CreateContext(); - parent.Attach(childContext); + parentContext.Attach(childContext); lastVisualContext = childContext; - if (childWidget is ItemWidget) + if (widgetAttr is ItemAttribute) { // Do nothing } - else if (childWidget is ScopeWidget) + else if (widgetAttr is ScopeAttribute) { BuildContextTree(childContext); } } + else if (widgetAttr is StylerAttribute) + { + var stylerWidget = WidgetBuilder.Create(widgetAttr); + var stylerContext = stylerWidget.CreateContext(); + + // Attach styler to lastVisualContext. + // Not attach to parentContext is because + // we need to let [ItemWidget] can use Styler too. + lastVisualContext.Attach(stylerContext); + } + // Special processing of LogicAttribute else if (widgetAttr is LogicAttribute) { // Terminate the loop at the EndScopeAttribute @@ -86,20 +118,24 @@ void BuildContextTree(Context parent) { break; } - - // Create and attach the styler widget to last VisualContext. - if (widgetAttr is StylerAttribute) - { - var stylerWidget = WidgetBuilder.Create(widgetAttr); - - var stylerContext = stylerWidget.CreateContext(); - lastVisualContext.Attach(stylerContext); - } } } } BuildContextTree(parentContext); + + if (iteractor.MoveNext()) + { + var attr = iteractor.Current; + var name = attr.GetType().Name; + if (name.EndsWith("Attribute")) + { + name = name.Remove(name.Length - 9); + } + Debug.LogWarning($"The ContextTree has been built, but [{name}] has not been added yet. Please check if there are any surplus [EndScope] before it."); + // + // eng: + } } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/IBuildContext.cs b/Packages/com.naukri.inspector-maid/Editor/IBuildContext.cs index 7b81ced..dd81287 100644 --- a/Packages/com.naukri.inspector-maid/Editor/IBuildContext.cs +++ b/Packages/com.naukri.inspector-maid/Editor/IBuildContext.cs @@ -1,16 +1,14 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; +using System; namespace Naukri.InspectorMaid.Editor { public interface IBuildContext { - public IWidget Widget { get; } + public Widget Widget { get; } - public T GetAncestorWidget() where T : IWidget; + public T GetAncestorWidget() where T : Widget; - public Context GetContextOfAncestorWidget() where T : IWidget; + public Context GetContextOfAncestorWidget() where T : Widget; public void VisitAncestorContexts(Predicate visitor); diff --git a/Packages/com.naukri.inspector-maid/Editor/ItemWidgetOf.cs.meta b/Packages/com.naukri.inspector-maid/Editor/ItemWidgetOf.cs.meta deleted file mode 100644 index 0fc185b..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/ItemWidgetOf.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ce9baf64693c21a4e95f0c136ab05102 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs b/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs deleted file mode 100644 index 590ca00..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Naukri.InspectorMaid.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Naukri.InspectorMaid.Editor -{ - public abstract class LogicWidgetOf : LogicWidget, IWidgetProvider - where TAttribute : LogicAttribute - { - private TAttribute _attribute; - - [SuppressMessage("Style", "IDE1006")] - public TAttribute attribute => _attribute; - - object IAttributeProvider.Attribute => _attribute; - - Type IWidgetProvider.RegisterType => typeof(TAttribute); - - IWidget IWidgetProvider.CloneWith(WidgetAttribute attribute) - { - var cloned = (LogicWidgetOf)MemberwiseClone(); - - cloned._attribute = attribute switch - { - TAttribute tAttribute => tAttribute, - _ => throw new Exception($"attribute type mismatch."), - }; - - return cloned; - } - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs b/Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs deleted file mode 100644 index b388887..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Naukri.InspectorMaid.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Naukri.InspectorMaid.Editor -{ - public abstract class ScopeWidgetOf : ScopeWidget, IWidgetProvider - where TAttribute : ScopeAttribute - { - private TAttribute _attribute; - - [SuppressMessage("Style", "IDE1006")] - public TAttribute attribute => _attribute; - - object IAttributeProvider.Attribute => _attribute; - - Type IWidgetProvider.RegisterType => typeof(TAttribute); - - IWidget IWidgetProvider.CloneWith(WidgetAttribute attribute) - { - var cloned = (ScopeWidgetOf)MemberwiseClone(); - - cloned._attribute = attribute switch - { - TAttribute tAttribute => tAttribute, - _ => throw new Exception($"attribute type mismatch."), - }; - - return cloned; - } - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/StylerWidgetOf.cs b/Packages/com.naukri.inspector-maid/Editor/StylerWidgetOf.cs index eb1abea..ac1cdf5 100644 --- a/Packages/com.naukri.inspector-maid/Editor/StylerWidgetOf.cs +++ b/Packages/com.naukri.inspector-maid/Editor/StylerWidgetOf.cs @@ -1,34 +1,23 @@ using Naukri.InspectorMaid.Core; -using Naukri.InspectorMaid.Editor.Widgets.Core; -using Naukri.InspectorMaid.Editor.Widgets.Stylers; -using System; -using System.Diagnostics.CodeAnalysis; +using Naukri.InspectorMaid.Editor.Contexts; +using Naukri.InspectorMaid.Editor.Core; +using Naukri.InspectorMaid.Editor.Widgets.Receivers; +using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor { - public abstract class StylerWidgetOf : StylerWidget, IWidgetProvider + public abstract class StylerWidgetOf : WidgetOf, IWidgetProvider, IParentBuiltReceiver where TAttribute : StylerAttribute { - private TAttribute _attribute; + public sealed override Context CreateContext() => new NoneChildContext(this); - [SuppressMessage("Style", "IDE1006")] - public TAttribute attribute => _attribute; + public override VisualElement Build(IBuildContext context) => null; - object IAttributeProvider.Attribute => attribute; + public abstract void OnStyling(IBuildContext context, VisualElement element); - Type IWidgetProvider.RegisterType => typeof(TAttribute); - - IWidget IWidgetProvider.CloneWith(WidgetAttribute attribute) + void IParentBuiltReceiver.OnParentBuilt(IBuildContext context, VisualElement parentElement) { - var cloned = (StylerWidgetOf)MemberwiseClone(); - - cloned._attribute = attribute switch - { - TAttribute tAttribute => tAttribute, - _ => throw new Exception($"{nameof(StylerWidgetOf.attribute)} type mismatch."), - }; - - return cloned; + OnStyling(context, parentElement); } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/UIElements/MethodElement.cs b/Packages/com.naukri.inspector-maid/Editor/UIElements/MethodElement.cs index 91164e5..e8f6cd7 100644 --- a/Packages/com.naukri.inspector-maid/Editor/UIElements/MethodElement.cs +++ b/Packages/com.naukri.inspector-maid/Editor/UIElements/MethodElement.cs @@ -28,11 +28,11 @@ public MethodElement(object target, MethodInfo info, SerializedObject serialized private object[] args; - public event Action OnInvoke = () => { }; - [SuppressMessage("Style", "IDE1006")] public string label { get => _label; set => _label = value; } + public event Action OnInvoke = () => { }; + public void Build() { style.flexDirection = FlexDirection.Column; diff --git a/Packages/com.naukri.inspector-maid/Editor/VisualWidgetOf.cs b/Packages/com.naukri.inspector-maid/Editor/VisualWidgetOf.cs new file mode 100644 index 0000000..04e99aa --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/VisualWidgetOf.cs @@ -0,0 +1,12 @@ +using Naukri.InspectorMaid.Core; +using Naukri.InspectorMaid.Editor.Contexts; +using Naukri.InspectorMaid.Editor.Core; + +namespace Naukri.InspectorMaid.Editor +{ + public abstract class VisualWidgetOf : WidgetOf, IWidgetProvider + where TAttribute : VisualAttribute + { + public sealed override Context CreateContext() => new MultiChildContext(this); + } +} diff --git a/Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs.meta b/Packages/com.naukri.inspector-maid/Editor/VisualWidgetOf.cs.meta similarity index 100% rename from Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs.meta rename to Packages/com.naukri.inspector-maid/Editor/VisualWidgetOf.cs.meta diff --git a/Packages/com.naukri.inspector-maid/Editor/Widget.cs b/Packages/com.naukri.inspector-maid/Editor/Widget.cs new file mode 100644 index 0000000..40a5b98 --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/Widget.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using UnityEngine.UIElements; + +namespace Naukri.InspectorMaid.Editor +{ + public abstract class Widget + { + public abstract Context CreateContext(); + + public abstract VisualElement Build(IBuildContext context); + + public VisualElement[] BuildChildren(IBuildContext context, ChildBuiltCallback callback = null) + { + var children = new List(); + context.VisitChildContexts(child => + { + if (child is Context visualContext) + { + var childElement = visualContext.Build(); + + if (childElement != null) + { + callback?.Invoke(child, childElement); + children.Add(childElement); + } + } + }); + + return children.ToArray(); + } + + public delegate void ChildBuiltCallback(Context ctx, VisualElement e); + } +} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widget.cs.meta similarity index 100% rename from Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs.meta rename to Packages/com.naukri.inspector-maid/Editor/Widget.cs.meta diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core.meta deleted file mode 100644 index 9037864..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: d43673c06eeec7443afb7bc9ea19ad17 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidget.cs deleted file mode 100644 index 145b42a..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidget.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; - -namespace Naukri.InspectorMaid.Editor.Widgets.Core -{ - public interface IWidget - { - public Context CreateContext(); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidget.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidget.cs.meta deleted file mode 100644 index a74dd85..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IWidget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 654eb7ea07cbc0845830349a78ad0dd7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ItemWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ItemWidget.cs deleted file mode 100644 index 1edad6c..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ItemWidget.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts; -using Naukri.InspectorMaid.Editor.Contexts.Core; - -namespace Naukri.InspectorMaid.Editor.Widgets.Core -{ - public abstract class ItemWidget : VisualWidget - { - // We need to create multiChildContext because we need to store the style widget. - public override VisualContext CreateContext() => new MultiChildVisualContext(this); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ItemWidget.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ItemWidget.cs.meta deleted file mode 100644 index fce4ffa..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ItemWidget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3b7969be26d27894d8c68b4de828fdc5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/LogicWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/LogicWidget.cs deleted file mode 100644 index a9abad1..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/LogicWidget.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; - -namespace Naukri.InspectorMaid.Editor.Widgets.Core -{ - public abstract class LogicWidget : IWidget - { - public abstract Context CreateContext(); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/LogicWidget.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/LogicWidget.cs.meta deleted file mode 100644 index 6d7aae0..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/LogicWidget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1b548448126d70f4796a5523fe82e6d9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/MultiChildWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/MultiChildWidget.cs deleted file mode 100644 index 72bc5cf..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/MultiChildWidget.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts; -using Naukri.InspectorMaid.Editor.Contexts.Core; - -namespace Naukri.InspectorMaid.Editor.Widgets.Core -{ - public abstract class MultiChildWidget : LogicWidget - { - public sealed override Context CreateContext() => new MultiChildContext(this); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/MultiChildWidget.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/MultiChildWidget.cs.meta deleted file mode 100644 index 8753507..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/MultiChildWidget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b00c0b83cee53a245865243c478616c7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/NoneChildWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/NoneChildWidget.cs deleted file mode 100644 index 67469fd..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/NoneChildWidget.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts; -using Naukri.InspectorMaid.Editor.Contexts.Core; - -namespace Naukri.InspectorMaid.Editor.Widgets.Core -{ - public abstract class NoneChildWidget : LogicWidget - { - public sealed override Context CreateContext() => new NoneChildContext(this); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/NoneChildWidget.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/NoneChildWidget.cs.meta deleted file mode 100644 index df9fbf9..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/NoneChildWidget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 54fb06d5523beb540b11640b84ba77ee -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs deleted file mode 100644 index 0f0b58b..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts; -using Naukri.InspectorMaid.Editor.Contexts.Core; - -namespace Naukri.InspectorMaid.Editor.Widgets.Core -{ - public abstract class ScopeWidget : VisualWidget - { - public sealed override VisualContext CreateContext() => new MultiChildVisualContext(this); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs.meta deleted file mode 100644 index 7e16fd8..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 856a519a127e2d14ab15acd26c1eff76 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/SingleChildWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/SingleChildWidget.cs deleted file mode 100644 index 6d1ad4d..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/SingleChildWidget.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts; -using Naukri.InspectorMaid.Editor.Contexts.Core; - -namespace Naukri.InspectorMaid.Editor.Widgets.Core -{ - public abstract class SingleChildWidget : LogicWidget - { - public sealed override Context CreateContext() => new SingleChildContext(this); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/SingleChildWidget.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/SingleChildWidget.cs.meta deleted file mode 100644 index 7adb23e..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/SingleChildWidget.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6454d83e707d20943bc6f9df40e4f8aa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs deleted file mode 100644 index f12d16e..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; -using System.Collections.Generic; -using UnityEngine.UIElements; - -namespace Naukri.InspectorMaid.Editor.Widgets.Core -{ - public abstract class VisualWidget : IWidget - { - public abstract VisualContext CreateContext(); - - public abstract VisualElement Build(IBuildContext context); - - // We must keep BuildChildren() in [VisualWidget] instead of [ScopeWidget]. - // Because [ItemWidget] may create child context through [IContextAttachedReceiver], - // in this case, we still need to use BuildChildren() to create child elements. - public VisualElement[] BuildChildren(IBuildContext context, ChildBuildedCallback callback = null) - { - var children = new List(); - context.VisitChildContexts(child => - { - if (child is VisualContext visualContext) - { - var childElement = visualContext.Build(); - - if (childElement != null) - { - callback?.Invoke(child, childElement); - children.Add(childElement); - } - } - }); - - return children.ToArray(); - } - - Context IWidget.CreateContext() => CreateContext(); - - public delegate void ChildBuildedCallback(Context ctx, VisualElement e); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/ServiceWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/ServiceWidget.cs index 4a8f17b..48a7099 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/ServiceWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/ServiceWidget.cs @@ -1,10 +1,11 @@ -using Naukri.InspectorMaid.Editor.Widgets.Core; +using Naukri.InspectorMaid.Editor.Contexts; using System; using System.ComponentModel.Design; +using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Logic { - public partial class ServiceWidget : SingleChildWidget, IServiceContainer, IServiceProvider + public partial class ServiceWidget : Widget, IServiceContainer, IServiceProvider { public ServiceWidget() { @@ -13,6 +14,10 @@ public ServiceWidget() private readonly ServiceContainer services; + public override Context CreateContext() => new SingleChildContext(this); + + public override VisualElement Build(IBuildContext context) => null; + public void AddService(Type serviceType, ServiceCreatorCallback callback) => services.AddService(serviceType, callback); public void AddService(Type serviceType, ServiceCreatorCallback callback, bool promote) => services.AddService(serviceType, callback, promote); diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IContextAttachedReceiver.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IContextAttachedReceiver.cs index 2878e38..40a1697 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IContextAttachedReceiver.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IContextAttachedReceiver.cs @@ -1,6 +1,4 @@ -using Naukri.InspectorMaid.Editor.Contexts.Core; - -namespace Naukri.InspectorMaid.Editor.Widgets.Receivers +namespace Naukri.InspectorMaid.Editor.Widgets.Receivers { public interface IContextAttachedReceiver : IReceiver { diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IParentBuiltReceiver.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IParentBuiltReceiver.cs new file mode 100644 index 0000000..b3cd30d --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IParentBuiltReceiver.cs @@ -0,0 +1,9 @@ +using UnityEngine.UIElements; + +namespace Naukri.InspectorMaid.Editor.Widgets.Receivers +{ + internal interface IParentBuiltReceiver : IReceiver + { + void OnParentBuilt(IBuildContext context, VisualElement parentElement); + } +} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IStylingReceiver.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IParentBuiltReceiver.cs.meta similarity index 100% rename from Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IStylingReceiver.cs.meta rename to Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IParentBuiltReceiver.cs.meta diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IStylingReceiver.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IStylingReceiver.cs deleted file mode 100644 index c3cd576..0000000 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Receivers/IStylingReceiver.cs +++ /dev/null @@ -1,9 +0,0 @@ -using UnityEngine.UIElements; - -namespace Naukri.InspectorMaid.Editor.Widgets.Receivers -{ - internal interface IStylingReceiver : IReceiver - { - void OnStyling(IBuildContext context, VisualElement stylingElement); - } -} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/HideWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/HideWidget.cs index 4f01257..b96867d 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/HideWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/HideWidget.cs @@ -4,10 +4,10 @@ namespace Naukri.InspectorMaid.Editor.Widgets.Stylers { public class HideWidget : StylerWidgetOf { - public override void OnStyling(IBuildContext context, VisualElement stylingElement) + public override void OnStyling(IBuildContext context, VisualElement element) { - stylingElement.style.display = DisplayStyle.None; - stylingElement.style.visibility = Visibility.Hidden; + element.style.display = DisplayStyle.None; + element.style.visibility = Visibility.Hidden; } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/LabelWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/LabelWidget.cs index 4f8b89b..dc8479c 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/LabelWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/LabelWidget.cs @@ -7,14 +7,14 @@ namespace Naukri.InspectorMaid.Editor.Widgets.Stylers { public class LabelWidget : StylerWidgetOf { - public override void OnStyling(IBuildContext context, VisualElement stylingElement) + public override void OnStyling(IBuildContext context, VisualElement element) { - stylingElement.RegisterCallback(evt => + element.RegisterCallback(evt => { // The label for PropertyField is build while PropertyField attached to the panel. // If we attempt to retrieve the labelElement before the AttachToPanelEvent, we will receive a null value. // Therefore, it is advisable to obtain the label during the AttachToPanelEvent. - var labelElement = stylingElement.Q