Skip to content

Commit

Permalink
Merge branch 'release/v2.3.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
naukri7707 committed Nov 13, 2023
2 parents abefc63 + adde7fd commit d8d0a83
Show file tree
Hide file tree
Showing 44 changed files with 553 additions and 365 deletions.
12 changes: 12 additions & 0 deletions Packages/com.naukri.inspector-maid/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Changelog

## [2.3.0] - 2023-11-14

### 新增

- `IfScpoe` 系列小部件新增預設比較方法,減少產生不必要的判斷函式。

### 重構

- 簡化與快速反射相關的底層 API。
- 取消綁定約定以減少設計限制。
- 部分 `Widget` 使用 `Compose` 模組重寫,使其更具結構性。

## [2.2.0] - 2023-11-12

### 新增
Expand Down
96 changes: 57 additions & 39 deletions Packages/com.naukri.inspector-maid/Documentation/Introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -292,29 +292,20 @@ public void MyMethod()
public string message = "Hello World!";
```

- 如果要綁定物件本身請使用預先定義的關鍵字 `"this"`

- 依據綁定的成員類型不同,會有不同的回傳邏輯

1. 欄位:該欄位的數值。
2. 屬性:該屬性 `getMethod` 的回傳值,如果該屬性沒有 `getMethod` 則無法運行。
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}!";
}
```

Expand Down Expand Up @@ -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` 的不同,我們需要繼承的類別也有所不同
Expand Down Expand Up @@ -486,6 +452,58 @@ public class MyStylerWidget : StylerWidgetOf<MyStylerAttribute>
#### 內置 `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<MyItemAttribute>
{
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 以及詳細的說明。
Original file line number Diff line number Diff line change
@@ -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;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 33 additions & 0 deletions Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs
Original file line number Diff line number Diff line change
@@ -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<TAttribute> : 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<TAttribute>)MemberwiseClone();

cloned._attribute = attribute switch
{
TAttribute tAttribute => tAttribute,
_ => throw new Exception($"attribute type mismatch."),
};

return cloned;
}
}
}
11 changes: 11 additions & 0 deletions Packages/com.naukri.inspector-maid/Editor/LogicWidgetOf.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 0 additions & 26 deletions Packages/com.naukri.inspector-maid/Editor/ScopeWidgetOf.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,6 @@

namespace Naukri.InspectorMaid.Editor
{
public abstract class LogicWidgetOf<TAttribute> : 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<TAttribute>)MemberwiseClone();

cloned._attribute = attribute switch
{
TAttribute tAttribute => tAttribute,
_ => throw new Exception($"attribute type mismatch."),
};

return cloned;
}
}

public abstract class ScopeWidgetOf<TAttribute> : ScopeWidget, IWidgetProvider
where TAttribute : ScopeAttribute
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,22 @@ public ChangedNotifierService(IEditorEventService editorEventService, IFastRefle

private readonly IFastReflectionService fastReflectionService;

public void ListenValue<T>(string bindingPath, Action<T> callback)
public void ListenValue(string bindingPath, Action<object> callback)
{
if (valueListeners.TryGetValue(bindingPath, out var listener))
{
((ValueListener<T>)listener).callback += callback;
((ValueListener)listener).callback += callback;
}
else
{
listener = new ValueListener<T>(bindingPath, callback);
listener = new ValueListener(bindingPath, callback);
valueListeners.Add(bindingPath, listener);
}
}

public void ListenFunc<T>(string bindingPath, object[] args, Action<T> callback)
public void ListenFunc(string bindingPath, object[] args, Action<object> callback)
{
var listener = new FuncListener<T>(bindingPath, args, callback);
var listener = new FuncListener(bindingPath, args, callback);
funcListeners.Add(listener);
}

Expand All @@ -58,9 +58,9 @@ public interface IListener
public void CheckValueChanged(IFastReflectionService fastReflectionService);
}

public class FuncListener<T> : ValueListener<T>
public class FuncListener : ValueListener
{
public FuncListener(string bindingPath, object[] args, Action<T> callback) : base(bindingPath, callback)
public FuncListener(string bindingPath, object[] args, Action<object> callback) : base(bindingPath, callback)
{
this.args = args;
}
Expand All @@ -69,7 +69,7 @@ public FuncListener(string bindingPath, object[] args, Action<T> callback) : bas

public override void CheckValueChanged(IFastReflectionService fastReflectionService)
{
var newValue = fastReflectionService.InvokeFunc<T>(bindingPath, args);
var newValue = fastReflectionService.InvokeFunc(bindingPath, args);

if (newValue == null)
{
Expand All @@ -90,23 +90,23 @@ public override void CheckValueChanged(IFastReflectionService fastReflectionServ
}
}

public class ValueListener<T> : IListener
public class ValueListener : IListener
{
public ValueListener(string bindingPath, Action<T> callback)
public ValueListener(string bindingPath, Action<object> callback)
{
this.bindingPath = bindingPath;
this.callback = callback;
}

public string bindingPath;

public Action<T> callback;
public Action<object> callback;

protected T previousValue;
protected object previousValue;

public virtual void CheckValueChanged(IFastReflectionService fastReflectionService)
{
var newValue = fastReflectionService.GetValue<T>(bindingPath);
var newValue = fastReflectionService.GetValue(bindingPath);

if (newValue == null)
{
Expand Down
Loading

0 comments on commit d8d0a83

Please sign in to comment.