From 7c12f1bd23d014d1792792b523287e8f1c892484 Mon Sep 17 00:00:00 2001 From: Naukri Date: Tue, 14 Nov 2023 00:08:10 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E9=87=8D=E6=A7=8B=20:=20=E7=B0=A1=E5=8C=96?= =?UTF-8?q?=E5=BA=95=E5=B1=A4=20API=20=E6=96=B9=E4=BE=BF=E6=97=A5=E5=BE=8C?= =?UTF-8?q?=E7=B6=AD=E8=AD=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IBindingDataProviderExtensions.cs | 14 +++ .../IBindingDataProviderExtensions.cs.meta | 11 ++ .../Default/ChangedNotifierService.cs | 26 ++--- .../Services/Default/FastReflectionService.cs | 106 +++++++----------- .../Services/IChangedNotifierService.cs | 19 +++- .../Editor/Services/IFastReflectionService.cs | 33 ++---- 6 files changed, 106 insertions(+), 103 deletions(-) create mode 100644 Packages/com.naukri.inspector-maid/Editor/Extensions/IBindingDataProviderExtensions.cs create mode 100644 Packages/com.naukri.inspector-maid/Editor/Extensions/IBindingDataProviderExtensions.cs.meta diff --git a/Packages/com.naukri.inspector-maid/Editor/Extensions/IBindingDataProviderExtensions.cs b/Packages/com.naukri.inspector-maid/Editor/Extensions/IBindingDataProviderExtensions.cs new file mode 100644 index 0000000..4f36d66 --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/Extensions/IBindingDataProviderExtensions.cs @@ -0,0 +1,14 @@ +using Naukri.InspectorMaid.Core; + +namespace Naukri.InspectorMaid.Editor.Extensions +{ + public static class IBindingDataProviderExtensions + { + // we have to use extension method, instead of default interface property. + // so that we can use this method on the implementation of this interface without casting. + public static bool IsBinding(this IBindingDataProvider self) + { + return self.binding != null; + } + } +} diff --git a/Packages/com.naukri.inspector-maid/Editor/Extensions/IBindingDataProviderExtensions.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Extensions/IBindingDataProviderExtensions.cs.meta new file mode 100644 index 0000000..e176f6a --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/Extensions/IBindingDataProviderExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a029bc09ee6f2264db8ae9d9b47f13e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/Services/Default/ChangedNotifierService.cs b/Packages/com.naukri.inspector-maid/Editor/Services/Default/ChangedNotifierService.cs index b8f225c..274fb01 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Services/Default/ChangedNotifierService.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Services/Default/ChangedNotifierService.cs @@ -21,22 +21,22 @@ public ChangedNotifierService(IEditorEventService editorEventService, IFastRefle private readonly IFastReflectionService fastReflectionService; - public void ListenValue(string bindingPath, Action callback) + public void ListenValue(string bindingPath, Action callback) { if (valueListeners.TryGetValue(bindingPath, out var listener)) { - ((ValueListener)listener).callback += callback; + ((ValueListener)listener).callback += callback; } else { - listener = new ValueListener(bindingPath, callback); + listener = new ValueListener(bindingPath, callback); valueListeners.Add(bindingPath, listener); } } - public void ListenFunc(string bindingPath, object[] args, Action callback) + public void ListenFunc(string bindingPath, object[] args, Action callback) { - var listener = new FuncListener(bindingPath, args, callback); + var listener = new FuncListener(bindingPath, args, callback); funcListeners.Add(listener); } @@ -58,9 +58,9 @@ public interface IListener public void CheckValueChanged(IFastReflectionService fastReflectionService); } - public class FuncListener : ValueListener + public class FuncListener : ValueListener { - public FuncListener(string bindingPath, object[] args, Action callback) : base(bindingPath, callback) + public FuncListener(string bindingPath, object[] args, Action callback) : base(bindingPath, callback) { this.args = args; } @@ -69,7 +69,7 @@ public FuncListener(string bindingPath, object[] args, Action callback) : bas public override void CheckValueChanged(IFastReflectionService fastReflectionService) { - var newValue = fastReflectionService.InvokeFunc(bindingPath, args); + var newValue = fastReflectionService.InvokeFunc(bindingPath, args); if (newValue == null) { @@ -90,9 +90,9 @@ public override void CheckValueChanged(IFastReflectionService fastReflectionServ } } - public class ValueListener : IListener + public class ValueListener : IListener { - public ValueListener(string bindingPath, Action callback) + public ValueListener(string bindingPath, Action callback) { this.bindingPath = bindingPath; this.callback = callback; @@ -100,13 +100,13 @@ public ValueListener(string bindingPath, Action callback) public string bindingPath; - public Action callback; + public Action callback; - protected T previousValue; + protected object previousValue; public virtual void CheckValueChanged(IFastReflectionService fastReflectionService) { - var newValue = fastReflectionService.GetValue(bindingPath); + var newValue = fastReflectionService.GetValue(bindingPath); if (newValue == null) { diff --git a/Packages/com.naukri.inspector-maid/Editor/Services/Default/FastReflectionService.cs b/Packages/com.naukri.inspector-maid/Editor/Services/Default/FastReflectionService.cs index 0a762f5..9d6a643 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Services/Default/FastReflectionService.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Services/Default/FastReflectionService.cs @@ -26,32 +26,28 @@ public FastReflectionService(object target) private readonly Dictionary> functions = new(); - public object GetValue(MemberInfo memberInfo) - { - var getter = GetOrCreateGetter(memberInfo); - return getter(target); - } - public object GetValue(string bindingPath) { var memberInfo = targetType.GetMemberToBase(InspectorMaidUtility.kBaseType, bindingPath); return GetValue(memberInfo); } - public T GetValue(MemberInfo memberInfo) + public object GetValue(MemberInfo memberInfo) { - return (T)GetValue(memberInfo); + var getter = GetOrCreateGetter(memberInfo); + return getter(target); } - public T GetValue(string bindingPath) + public void SetValue(string bindingPath, object value) { - return (T)GetValue(bindingPath); + var memberInfo = targetType.GetMemberToBase(InspectorMaidUtility.kBaseType, bindingPath); + SetValue(memberInfo, value); } - public void InvokeAction(MethodInfo methodInfo, params object[] args) + public void SetValue(MemberInfo memberInfo, object value) { - var action = GetOrCreateAction(methodInfo); - action(target, args); + var setter = GetOrCreateSetter(memberInfo); + setter(target, value); } public void InvokeAction(string bindingPath, params object[] args) @@ -60,10 +56,10 @@ public void InvokeAction(string bindingPath, params object[] args) InvokeAction(methodInfo, args); } - public object InvokeFunc(MethodInfo methodInfo, params object[] args) + public void InvokeAction(MethodInfo methodInfo, params object[] args) { - var func = GetOrCreateFunc(methodInfo); - return func(target, args); + var action = GetOrCreateAction(methodInfo); + action(target, args); } public object InvokeFunc(string bindingPath, params object[] args) @@ -72,54 +68,10 @@ public object InvokeFunc(string bindingPath, params object[] args) return InvokeFunc(methodInfo, args); } - public T InvokeFunc(MethodInfo methodInfo, params object[] args) - { - return (T)InvokeFunc(methodInfo, args); - } - - public T InvokeFunc(string bindingPath, params object[] args) - { - return (T)InvokeFunc(bindingPath, args); - } - - public void SetValue(MemberInfo memberInfo, T value) - { - var setter = GetOrCreateSetter(memberInfo); - setter(target, value); - } - - public void SetValue(string bindingPath, T value) - { - var memberInfo = targetType.GetMemberToBase(InspectorMaidUtility.kBaseType, bindingPath); - SetValue(memberInfo, value); - } - - private FRAction GetOrCreateAction(MethodInfo methodInfo) - { - var methodName = methodInfo.Name; - - if (!actions.TryGetValue(methodName, out var action)) - { - action = FastReflection.Polymorphism.CreateAction(methodInfo, targetType); - - actions.Add(methodName, action); - } - - return action; - } - - private FRFunc GetOrCreateFunc(MethodInfo methodInfo) + public object InvokeFunc(MethodInfo methodInfo, params object[] args) { - var methodName = methodInfo.Name; - - if (!functions.TryGetValue(methodName, out var func)) - { - func = FastReflection.Polymorphism.CreateFunc(methodInfo, targetType); - - functions.Add(methodName, func); - } - - return func; + var func = GetOrCreateFunc(methodInfo); + return func(target, args); } private FRGetter GetOrCreateGetter(MemberInfo memberInfo) @@ -161,5 +113,33 @@ private FRSetter GetOrCreateSetter(MemberInfo memberInfo) return setter; } + + private FRAction GetOrCreateAction(MethodInfo methodInfo) + { + var methodName = methodInfo.Name; + + if (!actions.TryGetValue(methodName, out var action)) + { + action = FastReflection.Polymorphism.CreateAction(methodInfo, targetType); + + actions.Add(methodName, action); + } + + return action; + } + + private FRFunc GetOrCreateFunc(MethodInfo methodInfo) + { + var methodName = methodInfo.Name; + + if (!functions.TryGetValue(methodName, out var func)) + { + func = FastReflection.Polymorphism.CreateFunc(methodInfo, targetType); + + functions.Add(methodName, func); + } + + return func; + } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Services/IChangedNotifierService.cs b/Packages/com.naukri.inspector-maid/Editor/Services/IChangedNotifierService.cs index b360837..1ff7d4c 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Services/IChangedNotifierService.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Services/IChangedNotifierService.cs @@ -7,9 +7,9 @@ namespace Naukri.InspectorMaid.Editor.Services { internal partial interface IChangedNotifierService { - public void ListenValue(string bindingPath, Action callback); + public void ListenValue(string bindingPath, Action callback); - public void ListenFunc(string bindingPath, object[] args, Action callback); + public void ListenFunc(string bindingPath, object[] args, Action callback); } partial interface IChangedNotifierService @@ -23,18 +23,33 @@ public static IChangedNotifierService Of(IBuildContext context) public static partial class IBuildContextExtensions { public static void ListenValue(this IBuildContext context, string bindingPath, Action callback) + { + context.ListenValue(bindingPath, v => callback((T)v)); + } + + public static void ListenValue(this IBuildContext context, string bindingPath, Action callback) { var valueChangedListener = IChangedNotifierService.Of(context); valueChangedListener.ListenValue(bindingPath, callback); } public static void ListenFunc(this IBuildContext context, string bindingPath, object[] args, Action callback) + { + context.ListenFunc(bindingPath, args, v => callback((T)v)); + } + + public static void ListenFunc(this IBuildContext context, string bindingPath, object[] args, Action callback) { var valueChangedListener = IChangedNotifierService.Of(context); valueChangedListener.ListenFunc(bindingPath, args, callback); } public static void ListenBindingValue(this IBuildContext context, Action callback) + { + context.ListenBindingValue(v => callback((T)v)); + } + + public static void ListenBindingValue(this IBuildContext context, Action callback) { if (context.TryGetAttribute(out IBindingDataProvider bindingData)) { diff --git a/Packages/com.naukri.inspector-maid/Editor/Services/IFastReflectionService.cs b/Packages/com.naukri.inspector-maid/Editor/Services/IFastReflectionService.cs index b643c48..7b3f993 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Services/IFastReflectionService.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Services/IFastReflectionService.cs @@ -7,29 +7,21 @@ namespace Naukri.InspectorMaid.Editor.Services { public partial interface IFastReflectionService { - public object GetValue(MemberInfo memberInfo); - public object GetValue(string bindingPath); - public T GetValue(MemberInfo memberInfo); + public object GetValue(MemberInfo memberInfo); - public T GetValue(string bindingPath); + public void SetValue(string bindingPath, object value); - public void InvokeAction(MethodInfo methodInfo, params object[] args); + public void SetValue(MemberInfo memberInfo, object value); public void InvokeAction(string bindingPath, params object[] args); - public object InvokeFunc(MethodInfo methodInfo, params object[] args); + public void InvokeAction(MethodInfo methodInfo, params object[] args); public object InvokeFunc(string bindingPath, params object[] args); - public T InvokeFunc(MethodInfo methodInfo, params object[] args); - - public T InvokeFunc(string bindingPath, params object[] args); - - public void SetValue(MemberInfo memberInfo, T value); - - public void SetValue(string bindingPath, T value); + public object InvokeFunc(MethodInfo methodInfo, params object[] args); } partial interface IFastReflectionService @@ -51,10 +43,10 @@ public static object GetValue(this IBuildContext context, string bindingPath) public static T GetValue(this IBuildContext context, string bindingPath) { var service = IFastReflectionService.Of(context); - return service.GetValue(bindingPath); + return (T)service.GetValue(bindingPath); } - public static void SetValue(this IBuildContext context, string bindingPath, T value) + public static void SetValue(this IBuildContext context, string bindingPath, object value) { var service = IFastReflectionService.Of(context); service.SetValue(bindingPath, value); @@ -77,15 +69,6 @@ public static object InvokeFunc(this IBuildContext context, string bindingPath, return service.InvokeFunc(bindingPath, args); } - public static bool IsBinding(this IBuildContext context) - { - if (context.TryGetAttribute(out IBindingDataProvider bindingData)) - { - return bindingData.binding != null; - } - return false; - } - public static T GetBindingValue(this IBuildContext context) { return (T)context.GetBindingValue(); @@ -111,7 +94,7 @@ public static object GetBindingValue(this IBuildContext context) } } - public static void SetBindingValue(this IBuildContext context, T value) + public static void SetBindingValue(this IBuildContext context, object value) { if (context.TryGetAttribute(out IBindingDataProvider bindingData)) { From d7034d07a9cf795c44c472ed3fe13665e33012dd Mon Sep 17 00:00:00 2001 From: Naukri Date: Tue, 14 Nov 2023 00:18:39 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=8A=9F=E8=83=BD=20:=20=E5=BC=B7=E5=8C=96?= =?UTF-8?q?=20If=20=20=E7=B3=BB=E5=88=97=20widget=20=E9=81=A9=E7=94=A8?= =?UTF-8?q?=E6=80=A7=EF=BC=8C=E6=B8=9B=E5=B0=91=E5=9C=A8=E8=85=B3=E6=9C=AC?= =?UTF-8?q?=E4=B8=AD=E7=94=9F=E6=88=90=E5=88=A4=E6=96=B7=E5=87=BD=E5=BC=8F?= =?UTF-8?q?=EF=BC=9B=E9=87=8D=E6=A7=8B=20:=20=E5=8F=96=E6=B6=88=E7=B6=81?= =?UTF-8?q?=E5=AE=9A=E7=B4=84=E5=AE=9A=E4=BB=A5=E6=B8=9B=E5=B0=91=E8=A8=AD?= =?UTF-8?q?=E8=A8=88=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Default/InspectorMaidSettings.cs | 8 +-- .../Editor/Widgets/Core/IfScopeWidgetOf.cs | 67 +++++++++++++++++++ .../Widgets/Core/IfScopeWidgetOf.cs.meta | 11 +++ .../Editor/Widgets/Core/ScopeWidget.cs | 3 - .../Editor/Widgets/Core/VisualWidget.cs | 12 +++- .../Editor/Widgets/Styler/LabelWidget.cs | 5 +- .../Widgets/Visual/DisableIfScopeWidget.cs | 23 ++----- .../Widgets/Visual/EnableIfScopeWidget.cs | 24 ++----- .../Editor/Widgets/Visual/HelpBoxWidget.cs | 5 +- .../Widgets/Visual/HideIfScopeWidget.cs | 41 +++--------- .../Widgets/Visual/ShowIfScopeWidget.cs | 41 +++--------- .../Runtime/ButtonAttribute.cs | 2 +- .../Runtime/ConditionLogic.cs | 9 +++ .../Runtime/ConditionLogic.cs.meta | 11 +++ .../Runtime/Core/IfScopeAttribute.cs | 65 ++++++++++++++++++ .../Runtime/Core/IfScopeAttribute.cs.meta | 11 +++ .../Runtime/DisableIfScopeAttribute.cs | 29 +++++--- .../Runtime/EnableIfScopeAttribute.cs | 29 +++++--- .../Runtime/HelpBoxAttribute.cs | 3 +- .../Runtime/HideIfScopeAttribute.cs | 29 +++++--- .../Runtime/LabelAttribute.cs | 2 +- .../Runtime/ShowIfScopeAttribute.cs | 29 +++++--- .../Scripts/ButtonSample.cs | 6 +- 23 files changed, 302 insertions(+), 163 deletions(-) create mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IfScopeWidgetOf.cs create mode 100644 Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IfScopeWidgetOf.cs.meta create mode 100644 Packages/com.naukri.inspector-maid/Runtime/ConditionLogic.cs create mode 100644 Packages/com.naukri.inspector-maid/Runtime/ConditionLogic.cs.meta create mode 100644 Packages/com.naukri.inspector-maid/Runtime/Core/IfScopeAttribute.cs create mode 100644 Packages/com.naukri.inspector-maid/Runtime/Core/IfScopeAttribute.cs.meta diff --git a/Packages/com.naukri.inspector-maid/Editor/Services/Default/InspectorMaidSettings.cs b/Packages/com.naukri.inspector-maid/Editor/Services/Default/InspectorMaidSettings.cs index 0c11c41..e48e6f0 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Services/Default/InspectorMaidSettings.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Services/Default/InspectorMaidSettings.cs @@ -17,11 +17,11 @@ namespace Naukri.InspectorMaid.Editor.Services.Default // Add support for custom type [Divider("Working On")] [RowScope] - [DisableIfScope(nameof(IsSupported), args: typeof(MonoBehaviour))] - [Button("MonoBehaviour", binding: nameof(AddSupport), args: typeof(MonoBehaviour)), Style(height: "24")] + [DisableIfScope(nameof(IsSupported), args: new object[] { typeof(MonoBehaviour) })] + [Button("MonoBehaviour", binding: nameof(AddSupport), args: new object[] { typeof(MonoBehaviour) }), Style(height: "24")] [EndScope] - [DisableIfScope(nameof(IsSupported), args: typeof(ScriptableObject))] - [Button("ScriptableObject", binding: nameof(AddSupport), args: typeof(ScriptableObject)), Style(height: "24")] + [DisableIfScope(nameof(IsSupported), args: new object[] { typeof(ScriptableObject) })] + [Button("ScriptableObject", binding: nameof(AddSupport), args: new object[] { typeof(ScriptableObject) }), Style(height: "24")] [EndScope] [Spacer, Style(flexGrow: "1")] [Button("Custom Type", binding: nameof(AddSupportOfCustomType)), Style(height: "24")] diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IfScopeWidgetOf.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IfScopeWidgetOf.cs new file mode 100644 index 0000000..13eb386 --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IfScopeWidgetOf.cs @@ -0,0 +1,67 @@ +using Naukri.InspectorMaid.Core; +using Naukri.InspectorMaid.Editor.Extensions; +using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.UIElements.Compose; +using System; +using System.Linq; +using UnityEngine.UIElements; + +namespace Naukri.InspectorMaid.Editor.Widgets.Core +{ + public abstract class IfScopeWidgetOf : ScopeWidgetOf + where TAttribute : IfScopeAttribute + { + public sealed override VisualElement Build(IBuildContext context) + { + var container = new VisualElement().Compose(c => + { + c.children = BuildChildren(context); + }); + + var bindingValue = context.GetBindingValue(); + UpdateElement(container, bindingValue); + + if (attribute.IsBinding()) + { + context.ListenBindingValue(v => + { + UpdateElement(container, v); + }); + } + + return container; + } + + protected abstract void OnUpdateElement(VisualElement visualElement, bool condition); + + private void UpdateElement(VisualElement visualElement, object bindingValue) + { + var condition = Condition(bindingValue); + OnUpdateElement(visualElement, condition); + } + + private bool Condition(object bindingValue) + { + var res = false; + + if (attribute.conditionLogic == ConditionLogic.Value) + { + res = attribute.values.Length switch + { + 0 => (bool)bindingValue, + _ => attribute.values.Any(it => bindingValue.Equals(it)), + }; + } + else if (attribute.conditionLogic == ConditionLogic.Flag) + { + res = bindingValue switch + { + Enum enumValue => attribute.values.Cast().Any(flag => enumValue.HasFlag(flag)), + _ => throw new Exception($"The binding value is not Enum. {bindingValue}"), + }; + } + + return res; + } + } +} diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IfScopeWidgetOf.cs.meta b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IfScopeWidgetOf.cs.meta new file mode 100644 index 0000000..c35ce14 --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/IfScopeWidgetOf.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3cc2ffdb4f1c688489126cd1ffca7d76 +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 index 0590317..0f0b58b 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/ScopeWidget.cs @@ -1,13 +1,10 @@ using Naukri.InspectorMaid.Editor.Contexts; using Naukri.InspectorMaid.Editor.Contexts.Core; -using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Core { public abstract class ScopeWidget : VisualWidget { public sealed override VisualContext CreateContext() => new MultiChildVisualContext(this); - - public delegate void ChildBuildedCallback(Context ctx, VisualElement e); } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs index 71a3e47..f12d16e 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Core/VisualWidget.cs @@ -1,6 +1,6 @@ using Naukri.InspectorMaid.Editor.Contexts.Core; +using System.Collections.Generic; using UnityEngine.UIElements; -using static Naukri.InspectorMaid.Editor.Widgets.Core.ScopeWidget; namespace Naukri.InspectorMaid.Editor.Widgets.Core { @@ -13,8 +13,9 @@ public abstract class VisualWidget : IWidget // 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 void BuildChildren(IBuildContext context, ChildBuildedCallback callback) + public VisualElement[] BuildChildren(IBuildContext context, ChildBuildedCallback callback = null) { + var children = new List(); context.VisitChildContexts(child => { if (child is VisualContext visualContext) @@ -23,12 +24,17 @@ public void BuildChildren(IBuildContext context, ChildBuildedCallback callback) if (childElement != null) { - callback(child, childElement); + 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/Styler/LabelWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/LabelWidget.cs index d052663..4f8b89b 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/LabelWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Styler/LabelWidget.cs @@ -1,4 +1,5 @@ -using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.Extensions; +using Naukri.InspectorMaid.Editor.Services; using UnityEditor; using UnityEngine.UIElements; @@ -21,7 +22,7 @@ public override void OnStyling(IBuildContext context, VisualElement stylingEleme labelElement.text = ActualLabel(labelText); - if (context.IsBinding()) + if (attribute.IsBinding()) { context.ListenBindingValue(message => { diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/DisableIfScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/DisableIfScopeWidget.cs index 04942ee..21400e7 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/DisableIfScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/DisableIfScopeWidget.cs @@ -1,28 +1,13 @@ -using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.Widgets.Core; using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Visual { - public class DisableIfScopeWidget : ScopeWidgetOf + public class DisableIfScopeWidget : IfScopeWidgetOf { - public override VisualElement Build(IBuildContext context) + protected override void OnUpdateElement(VisualElement visualElement, bool condition) { - var disable = context.GetBindingValue(); - var container = new VisualElement(); - - BuildChildren(context, (ctx, e) => - { - container.Add(e); - }); - - container.SetEnabled(!disable); - - context.ListenBindingValue(d => - { - container.SetEnabled(!d); - }); - - return container; + visualElement.SetEnabled(!condition); } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/EnableIfScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/EnableIfScopeWidget.cs index 2a6aafe..927a430 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/EnableIfScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/EnableIfScopeWidget.cs @@ -1,29 +1,13 @@ -using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.Widgets.Core; using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Visual { - public class EnableIfScopeWidget : ScopeWidgetOf + public class EnableIfScopeWidget : IfScopeWidgetOf { - public override VisualElement Build(IBuildContext context) + protected override void OnUpdateElement(VisualElement visualElement, bool condition) { - var enable = context.GetBindingValue(); - - var container = new VisualElement(); - - BuildChildren(context, (ctx, e) => - { - container.Add(e); - }); - - container.SetEnabled(enable); - - context.ListenBindingValue(e => - { - container.SetEnabled(e); - }); - - return container; + visualElement.SetEnabled(condition); } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/HelpBoxWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/HelpBoxWidget.cs index 11980c4..0e85452 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/HelpBoxWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/HelpBoxWidget.cs @@ -1,4 +1,5 @@ -using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.Extensions; +using Naukri.InspectorMaid.Editor.Services; using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Visual @@ -9,7 +10,7 @@ public override VisualElement Build(IBuildContext context) { var helpBox = new HelpBox(attribute.message, attribute.messageType); - if (context.IsBinding()) + if (attribute.IsBinding()) { context.ListenBindingValue(message => { diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/HideIfScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/HideIfScopeWidget.cs index e7968a5..c04b604 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/HideIfScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/HideIfScopeWidget.cs @@ -1,47 +1,22 @@ -using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.Widgets.Core; using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Visual { - public class HideIfScopeWidget : ScopeWidgetOf + public class HideIfScopeWidget : IfScopeWidgetOf { - public override VisualElement Build(IBuildContext context) + protected override void OnUpdateElement(VisualElement visualElement, bool condition) { - var hide = context.GetBindingValue(); - - var container = new VisualElement(); - - BuildChildren(context, (ctx, e) => - { - container.Add(e); - }); - - if (hide) + if (condition) { - container.style.display = DisplayStyle.None; - container.style.visibility = Visibility.Hidden; + visualElement.style.display = DisplayStyle.None; + visualElement.style.visibility = Visibility.Hidden; } else { - container.style.display = DisplayStyle.Flex; - container.style.visibility = Visibility.Visible; + visualElement.style.display = DisplayStyle.Flex; + visualElement.style.visibility = Visibility.Visible; } - - context.ListenBindingValue(h => - { - if (h) - { - container.style.display = DisplayStyle.None; - container.style.visibility = Visibility.Hidden; - } - else - { - container.style.display = DisplayStyle.Flex; - container.style.visibility = Visibility.Visible; - } - }); - - return container; } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ShowIfScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ShowIfScopeWidget.cs index 1c8b74c..cf05e91 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ShowIfScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ShowIfScopeWidget.cs @@ -1,47 +1,22 @@ -using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.Widgets.Core; using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Visual { - public class ShowIfScopeWidget : ScopeWidgetOf + public class ShowIfScopeWidget : IfScopeWidgetOf { - public override VisualElement Build(IBuildContext context) + protected override void OnUpdateElement(VisualElement visualElement, bool condition) { - var show = context.GetBindingValue(); - - var container = new VisualElement(); - - BuildChildren(context, (ctx, e) => - { - container.Add(e); - }); - - if (show) + if (condition) { - container.style.display = DisplayStyle.Flex; - container.style.visibility = Visibility.Visible; + visualElement.style.display = DisplayStyle.Flex; + visualElement.style.visibility = Visibility.Visible; } else { - container.style.display = DisplayStyle.None; - container.style.visibility = Visibility.Hidden; + visualElement.style.display = DisplayStyle.None; + visualElement.style.visibility = Visibility.Hidden; } - - context.ListenBindingValue(s => - { - if (s) - { - container.style.display = DisplayStyle.Flex; - container.style.visibility = Visibility.Visible; - } - else - { - container.style.display = DisplayStyle.None; - container.style.visibility = Visibility.Hidden; - } - }); - - return container; } } } diff --git a/Packages/com.naukri.inspector-maid/Runtime/ButtonAttribute.cs b/Packages/com.naukri.inspector-maid/Runtime/ButtonAttribute.cs index 0ddf614..df62ef7 100644 --- a/Packages/com.naukri.inspector-maid/Runtime/ButtonAttribute.cs +++ b/Packages/com.naukri.inspector-maid/Runtime/ButtonAttribute.cs @@ -7,7 +7,7 @@ public class ButtonAttribute : ItemAttribute, IBindingDataProvider public ButtonAttribute( string text = "", string binding = null, - params object[] args + object[] args = null ) { this.text = text; diff --git a/Packages/com.naukri.inspector-maid/Runtime/ConditionLogic.cs b/Packages/com.naukri.inspector-maid/Runtime/ConditionLogic.cs new file mode 100644 index 0000000..83c4690 --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Runtime/ConditionLogic.cs @@ -0,0 +1,9 @@ +namespace Naukri.InspectorMaid +{ + public enum ConditionLogic + { + Value, + + Flag, + } +} diff --git a/Packages/com.naukri.inspector-maid/Runtime/ConditionLogic.cs.meta b/Packages/com.naukri.inspector-maid/Runtime/ConditionLogic.cs.meta new file mode 100644 index 0000000..7b6604f --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Runtime/ConditionLogic.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2965536d62a43f741982986b69589ca3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Runtime/Core/IfScopeAttribute.cs b/Packages/com.naukri.inspector-maid/Runtime/Core/IfScopeAttribute.cs new file mode 100644 index 0000000..31675e2 --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Runtime/Core/IfScopeAttribute.cs @@ -0,0 +1,65 @@ +namespace Naukri.InspectorMaid.Core +{ + public class IfScopeAttribute : ScopeAttribute, IBindingDataProvider + { + public IfScopeAttribute( + string binding, + object[] args = null + ) : this(binding, new object[0], ConditionLogic.Value, args) { } + + public IfScopeAttribute( + string binding, + object value, + ConditionLogic conditionLogic = ConditionLogic.Value, + object[] args = null + ) : this(binding, new object[] { value }, conditionLogic, args) { } + + public IfScopeAttribute( + string binding, + object value1, + object value2, + ConditionLogic conditionLogic = ConditionLogic.Value, + object[] args = null + ) : this(binding, new object[] { value1, value2 }, conditionLogic, args) { } + + public IfScopeAttribute( + string binding, + object value1, + object value2, + object value3, + ConditionLogic conditionLogic = ConditionLogic.Value, + object[] args = null + ) : this(binding, new object[] { value1, value2, value3 }, conditionLogic, args) { } + + public IfScopeAttribute( + string binding, + object value1, + object value2, + object value3, + object value4, + ConditionLogic conditionLogic = ConditionLogic.Value, + object[] args = null + ) : this(binding, new object[] { value1, value2, value3, value4 }, conditionLogic, args) { } + + public IfScopeAttribute( + string binding, + object[] values, + ConditionLogic conditionLogic = ConditionLogic.Value, + object[] args = null + ) + { + this.binding = binding; + this.values = values; + this.conditionLogic = conditionLogic; + this.args = args; + } + + public readonly object[] values; + + public readonly ConditionLogic conditionLogic; + + public string binding { get; } + + public object[] args { get; } + } +} diff --git a/Packages/com.naukri.inspector-maid/Runtime/Core/IfScopeAttribute.cs.meta b/Packages/com.naukri.inspector-maid/Runtime/Core/IfScopeAttribute.cs.meta new file mode 100644 index 0000000..244014a --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Runtime/Core/IfScopeAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d8b48c0c00ea3947908bc67a902df43 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Runtime/DisableIfScopeAttribute.cs b/Packages/com.naukri.inspector-maid/Runtime/DisableIfScopeAttribute.cs index 6b95182..6a2c10c 100644 --- a/Packages/com.naukri.inspector-maid/Runtime/DisableIfScopeAttribute.cs +++ b/Packages/com.naukri.inspector-maid/Runtime/DisableIfScopeAttribute.cs @@ -2,19 +2,30 @@ namespace Naukri.InspectorMaid { - public class DisableIfScopeAttribute : ScopeAttribute, IBindingDataProvider + public class DisableIfScopeAttribute : IfScopeAttribute { - public DisableIfScopeAttribute( - string binding = null, - params object[] args - ) + public DisableIfScopeAttribute(string binding, object[] args = null) : base(binding, args) { - this.binding = binding; - this.args = args; } - public object[] args { get; } + public DisableIfScopeAttribute(string binding, object value, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value, conditionLogic, args) + { + } - public string binding { get; } + public DisableIfScopeAttribute(string binding, object value1, object value2, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, conditionLogic, args) + { + } + + public DisableIfScopeAttribute(string binding, object value1, object value2, object value3, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, value3, conditionLogic, args) + { + } + + public DisableIfScopeAttribute(string binding, object value1, object value2, object value3, object value4, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, value3, value4, conditionLogic, args) + { + } + + public DisableIfScopeAttribute(string binding, object[] values, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, values, conditionLogic, args) + { + } } } diff --git a/Packages/com.naukri.inspector-maid/Runtime/EnableIfScopeAttribute.cs b/Packages/com.naukri.inspector-maid/Runtime/EnableIfScopeAttribute.cs index 724ce07..d39e389 100644 --- a/Packages/com.naukri.inspector-maid/Runtime/EnableIfScopeAttribute.cs +++ b/Packages/com.naukri.inspector-maid/Runtime/EnableIfScopeAttribute.cs @@ -2,19 +2,30 @@ namespace Naukri.InspectorMaid { - public class EnableIfScopeAttribute : ScopeAttribute, IBindingDataProvider + public class EnableIfScopeAttribute : IfScopeAttribute { - public EnableIfScopeAttribute( - string binding = null, - params object[] args - ) + public EnableIfScopeAttribute(string binding, object[] args = null) : base(binding, args) { - this.binding = binding; - this.args = args; } - public object[] args { get; } + public EnableIfScopeAttribute(string binding, object value, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value, conditionLogic, args) + { + } - public string binding { get; } + public EnableIfScopeAttribute(string binding, object[] values, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, values, conditionLogic, args) + { + } + + public EnableIfScopeAttribute(string binding, object value1, object value2, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, conditionLogic, args) + { + } + + public EnableIfScopeAttribute(string binding, object value1, object value2, object value3, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, value3, conditionLogic, args) + { + } + + public EnableIfScopeAttribute(string binding, object value1, object value2, object value3, object value4, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, value3, value4, conditionLogic, args) + { + } } } diff --git a/Packages/com.naukri.inspector-maid/Runtime/HelpBoxAttribute.cs b/Packages/com.naukri.inspector-maid/Runtime/HelpBoxAttribute.cs index 67da06d..a3f0f7b 100644 --- a/Packages/com.naukri.inspector-maid/Runtime/HelpBoxAttribute.cs +++ b/Packages/com.naukri.inspector-maid/Runtime/HelpBoxAttribute.cs @@ -1,6 +1,5 @@ using Naukri.InspectorMaid.Core; using UnityEngine.UIElements; -using IBindingDataProvider = Naukri.InspectorMaid.Core.IBindingDataProvider; namespace Naukri.InspectorMaid { @@ -10,7 +9,7 @@ public HelpBoxAttribute( string message = "", HelpBoxMessageType messageType = HelpBoxMessageType.None, string binding = null, - params object[] args + object[] args = null ) { this.message = message; diff --git a/Packages/com.naukri.inspector-maid/Runtime/HideIfScopeAttribute.cs b/Packages/com.naukri.inspector-maid/Runtime/HideIfScopeAttribute.cs index 084bc8e..e06967b 100644 --- a/Packages/com.naukri.inspector-maid/Runtime/HideIfScopeAttribute.cs +++ b/Packages/com.naukri.inspector-maid/Runtime/HideIfScopeAttribute.cs @@ -2,19 +2,30 @@ namespace Naukri.InspectorMaid { - public class HideIfScopeAttribute : ScopeAttribute, IBindingDataProvider + public class HideIfScopeAttribute : IfScopeAttribute { - public HideIfScopeAttribute( - string binding = null, - params object[] args - ) + public HideIfScopeAttribute(string binding, object[] args = null) : base(binding, args) { - this.binding = binding; - this.args = args; } - public object[] args { get; } + public HideIfScopeAttribute(string binding, object value, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value, conditionLogic, args) + { + } - public string binding { get; } + public HideIfScopeAttribute(string binding, object[] values, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, values, conditionLogic, args) + { + } + + public HideIfScopeAttribute(string binding, object value1, object value2, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, conditionLogic, args) + { + } + + public HideIfScopeAttribute(string binding, object value1, object value2, object value3, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, value3, conditionLogic, args) + { + } + + public HideIfScopeAttribute(string binding, object value1, object value2, object value3, object value4, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, value3, value4, conditionLogic, args) + { + } } } diff --git a/Packages/com.naukri.inspector-maid/Runtime/LabelAttribute.cs b/Packages/com.naukri.inspector-maid/Runtime/LabelAttribute.cs index 9304971..49f2a30 100644 --- a/Packages/com.naukri.inspector-maid/Runtime/LabelAttribute.cs +++ b/Packages/com.naukri.inspector-maid/Runtime/LabelAttribute.cs @@ -8,7 +8,7 @@ public LabelAttribute( string label = "", bool useNicifyName = false, string binding = null, - params object[] args + object[] args = null ) { this.label = label; diff --git a/Packages/com.naukri.inspector-maid/Runtime/ShowIfScopeAttribute.cs b/Packages/com.naukri.inspector-maid/Runtime/ShowIfScopeAttribute.cs index fc6f309..4f3464e 100644 --- a/Packages/com.naukri.inspector-maid/Runtime/ShowIfScopeAttribute.cs +++ b/Packages/com.naukri.inspector-maid/Runtime/ShowIfScopeAttribute.cs @@ -2,19 +2,30 @@ namespace Naukri.InspectorMaid { - public class ShowIfScopeAttribute : ScopeAttribute, IBindingDataProvider + public class ShowIfScopeAttribute : IfScopeAttribute { - public ShowIfScopeAttribute( - string binding = null, - params object[] args - ) + public ShowIfScopeAttribute(string binding, object[] args = null) : base(binding, args) { - this.binding = binding; - this.args = args; } - public object[] args { get; } + public ShowIfScopeAttribute(string binding, object value, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value, conditionLogic, args) + { + } - public string binding { get; } + public ShowIfScopeAttribute(string binding, object[] values, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, values, conditionLogic, args) + { + } + + public ShowIfScopeAttribute(string binding, object value1, object value2, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, conditionLogic, args) + { + } + + public ShowIfScopeAttribute(string binding, object value1, object value2, object value3, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, value3, conditionLogic, args) + { + } + + public ShowIfScopeAttribute(string binding, object value1, object value2, object value3, object value4, ConditionLogic conditionLogic = ConditionLogic.Value, object[] args = null) : base(binding, value1, value2, value3, value4, conditionLogic, args) + { + } } } diff --git a/Packages/com.naukri.inspector-maid/Samples/01. Widget's Attributes/Scripts/ButtonSample.cs b/Packages/com.naukri.inspector-maid/Samples/01. Widget's Attributes/Scripts/ButtonSample.cs index 9ce21b4..2e95fe0 100644 --- a/Packages/com.naukri.inspector-maid/Samples/01. Widget's Attributes/Scripts/ButtonSample.cs +++ b/Packages/com.naukri.inspector-maid/Samples/01. Widget's Attributes/Scripts/ButtonSample.cs @@ -36,10 +36,8 @@ public class ButtonSample : AttributeSampleBehaviour public int buttonAfterTargetInRow = 0; // Sample 5 - // The 'args' parameter is of type object[], so when passing arguments, you typically declare an object[] when there are multiple arguments. - // However, when you have only one argument, because of 'params' keyword, you can pass that argument without declaring an object[]. - [Button("One Parameter", binding: nameof(MyMethodWithOnlyOneParameter), args: "my message")] - [Button("Multi Parameters", binding: nameof(MyMethodWithParameters), args: new object[] { "hello", "world" })] + // The 'args' parameter is of type object[], so when passing arguments, you declare an object[]. + [Button("With Parameters", binding: nameof(MyMethodWithParameters), args: new object[] { "hello", "world" })] public int buttonWithArgs = 0; public void MyMethod() From 4432f83b778cfa5933ca32c4ad6744191a7a2191 Mon Sep 17 00:00:00 2001 From: Naukri Date: Tue, 14 Nov 2023 01:29:32 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E9=9B=9C=E9=A0=85=20:=20=E5=B0=87=20LogicW?= =?UTF-8?q?idgetOf=20=E5=88=86=E9=9B=A2=E8=87=B3=E5=B0=8D=E6=87=89?= =?UTF-8?q?=E8=85=B3=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/LogicWidgetOf.cs | 33 +++++++++++++++++++ .../Editor/LogicWidgetOf.cs.meta | 11 +++++++ .../Editor/ScopeWidgetOf.cs | 26 --------------- 3 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs create mode 100644 Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs.meta diff --git a/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs b/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs new file mode 100644 index 0000000..590ca00 --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs @@ -0,0 +1,33 @@ +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/LogicWidgetOf.cs.meta b/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs.meta new file mode 100644 index 0000000..f652314 --- /dev/null +++ b/Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 857562b1513c51a4fa8dbd07db076d52 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs b/Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs index 182cc82..b388887 100644 --- a/Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs +++ b/Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs @@ -5,32 +5,6 @@ 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; - } - } - public abstract class ScopeWidgetOf : ScopeWidget, IWidgetProvider where TAttribute : ScopeAttribute { From afcdcf5e168bf0716634758c014b72faee9adf4d Mon Sep 17 00:00:00 2001 From: Naukri Date: Tue, 14 Nov 2023 01:31:01 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E9=9B=9C=E9=A0=85=20:=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20UIElement=20=E7=9B=B8=E4=BE=9D=E5=A5=97=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Packages/com.naukri.inspector-maid/package.json | 5 ++++- Packages/packages-lock.json | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Packages/com.naukri.inspector-maid/package.json b/Packages/com.naukri.inspector-maid/package.json index 62084b6..689b8ff 100644 --- a/Packages/com.naukri.inspector-maid/package.json +++ b/Packages/com.naukri.inspector-maid/package.json @@ -16,5 +16,8 @@ "description": "The usage and samples of how to dispaly property And method", "path": "Samples~/02. Property And Method" } - ] + ], + "dependencies": { + "com.unity.modules.uielements": "" + } } \ No newline at end of file diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 80b4258..9ce0edd 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -4,7 +4,9 @@ "version": "file:com.naukri.inspector-maid", "depth": 0, "source": "embedded", - "dependencies": {} + "dependencies": { + "com.unity.modules.uielements": "" + } }, "com.unity.ai.navigation": { "version": "1.1.5", From 91223c6aa887e78309c47348e27431d123e8416b Mon Sep 17 00:00:00 2001 From: Naukri Date: Tue, 14 Nov 2023 02:05:59 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E9=87=8D=E6=A7=8B=20:=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20Compose=20=E6=A8=A1=E7=B5=84=E9=87=8D=E5=AF=AB=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E5=85=B6=E6=9B=B4=E5=85=B7=E7=B5=90=E6=A7=8B=E6=80=A7?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/Widgets/Visual/CardScopeWidget.cs | 5 +++-- .../Editor/Widgets/Visual/ClassWidget.cs | 7 +++---- .../Editor/Widgets/Visual/ColumnScopeWidget.cs | 9 ++++----- .../Editor/Widgets/Visual/DividerWidget.cs | 4 +--- .../Editor/Widgets/Visual/FoldoutScopeWidget.cs | 9 ++++----- .../Editor/Widgets/Visual/MemberWidget.cs | 7 +++---- .../Editor/Widgets/Visual/RowScopeWidget.cs | 7 +++---- .../Editor/Widgets/Visual/SlotWidget.cs | 7 +++---- 8 files changed, 24 insertions(+), 31 deletions(-) diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/CardScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/CardScopeWidget.cs index a0e675b..9d9f33e 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/CardScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/CardScopeWidget.cs @@ -1,4 +1,5 @@ using Naukri.InspectorMaid.Editor.UIElements; +using Naukri.InspectorMaid.Editor.UIElements.Compose; using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Visual @@ -15,9 +16,9 @@ public override VisualElement Build(IBuildContext context) false => new Card(), }; - BuildChildren(context, (ctx, e) => + card.Compose(c => { - card.Add(e); + c.children = BuildChildren(context); }); return card; diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ClassWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ClassWidget.cs index c167cfc..574d5d8 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ClassWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ClassWidget.cs @@ -2,6 +2,7 @@ using Naukri.InspectorMaid.Editor.Contexts.Core; using Naukri.InspectorMaid.Editor.Helpers; using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.UIElements.Compose; using Naukri.InspectorMaid.Editor.Widgets.Core; using Naukri.InspectorMaid.Editor.Widgets.Receivers; using Naukri.InspectorMaid.Layout; @@ -39,11 +40,9 @@ public void OnContextAttached(Context context) public override VisualElement Build(IBuildContext context) { - var container = new VisualElement(); - - BuildChildren(context, (ctx, e) => + var container = new VisualElement().Compose(c => { - container.Add(e); + c.children = BuildChildren(context); }); var settings = IInspectorMaidSettings.Of(context); diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ColumnScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ColumnScopeWidget.cs index daca8d4..4e5b697 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ColumnScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/ColumnScopeWidget.cs @@ -1,4 +1,5 @@ -using UnityEngine.UIElements; +using Naukri.InspectorMaid.Editor.UIElements.Compose; +using UnityEngine.UIElements; using Column = Naukri.InspectorMaid.Editor.UIElements.Column; namespace Naukri.InspectorMaid.Editor.Widgets.Visual @@ -7,11 +8,9 @@ public class ColumnScopeWidget : ScopeWidgetOf { public override VisualElement Build(IBuildContext context) { - var column = new Column(); - - BuildChildren(context, (ctx, e) => + var column = new Column().Compose(c => { - column.Add(e); + c.children = BuildChildren(context); }); return column; diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/DividerWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/DividerWidget.cs index 6c3994a..755290d 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/DividerWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/DividerWidget.cs @@ -7,9 +7,7 @@ public class DividerWidget : ItemWidgetOf { public override VisualElement Build(IBuildContext context) { - return new Divider( - text: attribute.text - ); + return new Divider(text: attribute.text); } } } diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/FoldoutScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/FoldoutScopeWidget.cs index ed11a64..0d47ba9 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/FoldoutScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/FoldoutScopeWidget.cs @@ -1,4 +1,5 @@ -using UnityEngine.UIElements; +using Naukri.InspectorMaid.Editor.UIElements.Compose; +using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Visual { @@ -10,11 +11,9 @@ public override VisualElement Build(IBuildContext context) { text = attribute.text, value = attribute.expend - }; - - BuildChildren(context, (ctx, e) => + }.Compose(c => { - container.Add(e); + c.children = BuildChildren(context); }); return container; diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/MemberWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/MemberWidget.cs index c5ca473..a0d5a2c 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/MemberWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/MemberWidget.cs @@ -2,6 +2,7 @@ using Naukri.InspectorMaid.Editor.Contexts.Core; using Naukri.InspectorMaid.Editor.Extensions; using Naukri.InspectorMaid.Editor.Helpers; +using Naukri.InspectorMaid.Editor.UIElements.Compose; using Naukri.InspectorMaid.Editor.Widgets.Core; using Naukri.InspectorMaid.Editor.Widgets.Receivers; using System.Linq; @@ -36,11 +37,9 @@ public override VisualElement Build(IBuildContext context) var container = new VisualElement() { name = info.Name - }; - - BuildChildren(context, (ctx, e) => + }.Compose(c => { - container.Add(e); + c.children = BuildChildren(context); }); return container; diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/RowScopeWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/RowScopeWidget.cs index 3eb5017..ef2c500 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/RowScopeWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/RowScopeWidget.cs @@ -1,4 +1,5 @@ using Naukri.InspectorMaid.Editor.UIElements; +using Naukri.InspectorMaid.Editor.UIElements.Compose; using UnityEngine.UIElements; namespace Naukri.InspectorMaid.Editor.Widgets.Visual @@ -7,11 +8,9 @@ public class RowScopeWidget : ScopeWidgetOf { public override VisualElement Build(IBuildContext context) { - var row = new Row(); - - BuildChildren(context, (ctx, e) => + var row = new Row().Compose(c => { - row.Add(e); + c.children = BuildChildren(context); }); return row; diff --git a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/SlotWidget.cs b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/SlotWidget.cs index 41283a1..c1c5778 100644 --- a/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/SlotWidget.cs +++ b/Packages/com.naukri.inspector-maid/Editor/Widgets/Visual/SlotWidget.cs @@ -1,5 +1,6 @@ using Naukri.InspectorMaid.Editor.Contexts.Core; using Naukri.InspectorMaid.Editor.Services; +using Naukri.InspectorMaid.Editor.UIElements.Compose; using Naukri.InspectorMaid.Editor.Widgets.Receivers; using UnityEngine.UIElements; @@ -12,11 +13,9 @@ public override VisualElement Build(IBuildContext context) var container = new VisualElement() { name = "Slot" - }; - - BuildChildren(context, (ctx, e) => + }.Compose(c => { - container.Add(e); + c.children = BuildChildren(context); }); return container; From adde7fd6c8b109dd78ae517bf46e72954a86de75 Mon Sep 17 00:00:00 2001 From: Naukri Date: Tue, 14 Nov 2023 02:06:17 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=96=87=E6=AA=94=20:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3=202.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com.naukri.inspector-maid/CHANGELOG.md | 12 +++ .../Documentation/Introduction.md | 96 +++++++++++-------- .../com.naukri.inspector-maid/package.json | 2 +- 3 files changed, 70 insertions(+), 40 deletions(-) diff --git a/Packages/com.naukri.inspector-maid/CHANGELOG.md b/Packages/com.naukri.inspector-maid/CHANGELOG.md index eaabe23..6099287 100644 --- a/Packages/com.naukri.inspector-maid/CHANGELOG.md +++ b/Packages/com.naukri.inspector-maid/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [2.3.0] - 2023-11-14 + +### 新增 + +- `IfScpoe` 系列小部件新增預設比較方法,減少產生不必要的判斷函式。 + +### 重構 + +- 簡化與快速反射相關的底層 API。 +- 取消綁定約定以減少設計限制。 +- 部分 `Widget` 使用 `Compose` 模組重寫,使其更具結構性。 + ## [2.2.0] - 2023-11-12 ### 新增 diff --git a/Packages/com.naukri.inspector-maid/Documentation/Introduction.md b/Packages/com.naukri.inspector-maid/Documentation/Introduction.md index 1cbefe0..bfc82f7 100644 --- a/Packages/com.naukri.inspector-maid/Documentation/Introduction.md +++ b/Packages/com.naukri.inspector-maid/Documentation/Introduction.md @@ -292,8 +292,6 @@ public void MyMethod() public string message = "Hello World!"; ``` -- 如果要綁定物件本身請使用預先定義的關鍵字 `"this"` - - 依據綁定的成員類型不同,會有不同的回傳邏輯 1. 欄位:該欄位的數值。 @@ -301,20 +299,13 @@ public void MyMethod() 3. 函式:該函式調用後的回傳值,如果該函式有參數則需使用 `args` 定義參數。 ```cs - // 如果只有一個參數,可以利用 params 關鍵字的特性,省略 new object[] { ... } - [HelpBox(binding: nameof(HelloMessage), args: "world")] - // 如果有多個參數,則必須使用 new object[] { ... } 來包裹 - [HelpBox(binding: nameof(HelloTwoMessage), args: new object[] { "world", "you" })] + // 如果目標是帶參數函式,使用 new object[] { ... } 來包裹參數 + [HelpBox(binding: nameof(HelloTwoMessage), args: new object[] { "Hello", "world" })] public string message = ""; - - public string HelloMessage(string message) - { - return $"Hello {message}!"; - } - - public string HelloTwoMessage(string message1, string message2) + + public string CombineMessage(string message1, string message2) { - return $"Hello {message1} and {message2}!"; + return $"{message1} {message2}!"; } ``` @@ -377,31 +368,6 @@ public void MyMethod() ``` ![optional-variable-compare](Images/optional-variable-compare.png) - -4. 如果想要支援資料綁定,你需要讓該 `WidgetAttribute` 繼承 `IBindable` 介面。為了統一綁定邏輯,我們約定永遠使 `binding` 及 `args` 作為最後兩個參數且 `args` 需使用 `params` 關鍵字。 - - ```cs - public class MyItemAttribute : ItemAttribute, IBindable - { - public MyItemAttribute( - string myString, - string binding = null, - params object[] args - ) - { - this.myString = myString; - this.binding = binding; - this.args = args; - } - - public readonly string myString; - - public string binding { get; } - - public object[] args { get; } - } - ``` - ### 建立 `Widget` 根據 `WidgetAttribute` 的不同,我們需要繼承的類別也有所不同 @@ -486,6 +452,58 @@ public class MyStylerWidget : StylerWidgetOf #### 內置 `Receiver` - `IContextAttachedReceiver`:當該 `Widget` 的 `Context` 被附加到 `Context Tree` 時。 + +### 資料綁定 + +如果想要支援資料綁定,你可以在 `WidgetAttribute` 上實作 `IBindable` 介面使 `Widget` 可以使用包裝好的綁定函式,或者你也可以在 `Widget` 上直接使用 `GetValue()` 等函式來存取目標成員。 + +`MyItemAttribute.cs` +```cs +public class MyItemAttribute : ItemAttribute, IBindable +{ + public MyItemAttribute( + string myString, + string binding = null, + params object[] args + ) + { + this.myString = myString; + this.binding = binding; + this.args = args; + } + + public readonly string myString; + + public string binding { get; } + + public object[] args { get; } +} +``` + +`MyItemWidget.cs` +```cs + public class MyItemWidget : ItemWidgetOf + { + public override VisualElement Build(IBuildContext context) + { + // 獲取綁定成員的值 + var bindingValue = context.GetBindingValue(); + // 監聽綁定成員的值 + context.ListenBindingValue(value => + { + // Do something on value changed + }); + + // 你也可以直接指定成員名稱來存取 + var a = context.GetValue("memberName"); + context.ListenValue("memberName" ,value => + { + // Do something + }); + } + } +``` + ## 内置小部件 你可以在 package 中的 Sample 中找到所有内置小部件的 demo 以及詳細的說明。 diff --git a/Packages/com.naukri.inspector-maid/package.json b/Packages/com.naukri.inspector-maid/package.json index 689b8ff..edb757d 100644 --- a/Packages/com.naukri.inspector-maid/package.json +++ b/Packages/com.naukri.inspector-maid/package.json @@ -2,7 +2,7 @@ "name": "com.naukri.inspector-maid", "author": "Naukri", "displayName": "Inspector Maid", - "version": "2.2.0", + "version": "2.3.0", "unity": "2022.3", "description": "This is a Unity Inspector UI customization feature.\r\n You can use it to create some simple interactive functionalities for your Component without the need to write a dedicated Editor. It has several key features:\r\n\r\n\u2022Uses UIElements for rendering.\r\n\r\n\u2022Allows direct access to properties and functions in the Inspector.\r\n\r\n\u2022Supports adding multiple widgets to the same target.\r\n\r\n\u2022Allows customization of custom widgets.\r\n\r\n\u2022Allows dynamic content modification through binding.", "samples": [