diff --git a/Packages/com.naukri.inspector-maid/CHANGELOG.md b/Packages/com.naukri.inspector-maid/CHANGELOG.md index 50a0558..a6e5446 100644 --- a/Packages/com.naukri.inspector-maid/CHANGELOG.md +++ b/Packages/com.naukri.inspector-maid/CHANGELOG.md @@ -1,6 +1,16 @@ # Changelog -## [2.4.4] - 2023-11-17 +## [2.5.0] - 2023-11-21 + +### 新增 + +- `OnChanged` 用以監聽成員變化,並調用目標函式。 + +### 重構 + +- 統一 `VisualWidget` 及 `LogicWidget`,以簡化過於複雜的繼承結構。 + +## [2.4.4] - 2023-11-18 ### 修正 diff --git a/Packages/com.naukri.inspector-maid/Documentation/Introduction.md b/Packages/com.naukri.inspector-maid/Documentation/Introduction.md index 69adbe6..c3f44a7 100644 --- a/Packages/com.naukri.inspector-maid/Documentation/Introduction.md +++ b/Packages/com.naukri.inspector-maid/Documentation/Introduction.md @@ -394,18 +394,18 @@ public void MyMethod() 根據 `WidgetAttribute` 的不同,我們需要繼承的類別也有所不同 -- `ItemAttribute` : `ItemWidgetOf` -- `ScopeAttribute` : `ScopeWidgetOf` +- `ItemAttribute` 、`ScopeAttribute` : `VisualWidgetOf` - `StylerAttribute` : `StylerWidgetOf` -> 由於 Widget 在實作中可能會使用到 UnityEditor 中的函式。所以建議新增在 Editor 資料夾中,使 unity 不在建置時編譯該腳本。否則專案將無法建置。 +> 由於 `Widget` 在實作中可能會使用到 `UnityEditor` 中的函式。所以建議新增在 Editor 資料夾中,使 unity 不在建置時編譯該腳本。否則專案有可能會無法建置。 #### `VisualWidget` : 實作 `Build()` 當你的目標是 `ItemWidget` 或是 `ScopeWidget` 時,你需要實作 `Build()` 函式來描述 `Widget` 的 UI。 +你也可以回傳 `null`,在這種情況下該 `Widget` 會被視為 `LogicWidget` 此時將不渲染任何元素但執行 `Build()` 中的邏輯。 ```cs -public class MyScopeWidget : ScopeWidgetOf +public class MyScopeWidget : VisualWidgetOf { public override VisualElement Build(IBuildContext context) { @@ -440,13 +440,13 @@ public class MyStylerWidget : StylerWidgetOf { // OnStyling 會在 stylingElement 被 Build() 後呼叫 // stylingElement 會是該 Styler 之前最接近的 VisualWidget 所產生的 VisualElement - public override void OnStyling(IBuildContext context, VisualElement stylingElement) + public override void OnStyling(IBuildContext context, VisualElement element) { // 這裡可以對 stylingElement 做任何事情,例如將其禁用 - stylingElement.SetEnabled(false); + element.SetEnabled(false); // 或是設定他的 style - stylingElement.style.backgroundColor = Color.red; + element.style.backgroundColor = Color.red; } } ``` 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/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/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/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/OnChangedWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/OnChangedWidget.cs new file mode 100644 index 0000000..a0bd1bd --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/OnChangedWidget.cs @@ -0,0 +1,43 @@ +using Naukri.InspectorMaid.Editor.Extensions; +using Naukri.InspectorMaid.Editor.Helpers; +using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.Widgets.Visual; +using UnityEngine.UIElements; + +namespace Naukri.InspectorMaid.Editor.Widgets.Logic +{ + public class OnChangedWidget : VisualWidgetOf + { + public override VisualElement Build(IBuildContext context) + { + var classWidget = ClassWidget.Of(context); + var memberWidget = MemberWidget.Of(context); + + var serializedTarget = classWidget.serializedTarget; + var memberName = memberWidget.info.Name; + + void onChanged() + { + if (attribute.setDirty) + { + context.RecordAndSetDirty("OnChange Invoked"); + } + + context.InvokeBindingAction(); + } + + var previousValue = context.GetValue(memberName); + + context.ListenValue(memberName, obj => + { + if (!InspectorMaidUtility.IsBoxedValueEqual(obj, previousValue)) + { + onChanged(); + previousValue = obj; + } + }); + + return null; + } + } +} diff --git a/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/OnChangedWidget.cs.meta similarity index 83% rename from Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs.meta rename to Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/OnChangedWidget.cs.meta index 18642f5..86792a0 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Contexts/SingleChildVisualContext.cs.meta +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Logic/OnChangedWidget.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 459518c0002886349b8e631bdc0ccb32 +guid: cb3a6b7ceda5f2446932fa5a19a3aa26 MonoImporter: externalObjects: {} serializedVersion: 2 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