Skip to content

Commit

Permalink
Merge branch 'release/v2.5.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
naukri7707 committed Nov 21, 2023
2 parents 4bf313a + 80b3a36 commit 86e26d2
Show file tree
Hide file tree
Showing 99 changed files with 468 additions and 693 deletions.
12 changes: 11 additions & 1 deletion Packages/com.naukri.inspector-maid/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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

### 修正

Expand Down
14 changes: 7 additions & 7 deletions Packages/com.naukri.inspector-maid/Documentation/Introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -394,18 +394,18 @@ public void MyMethod()

根據 `WidgetAttribute` 的不同,我們需要繼承的類別也有所不同

- `ItemAttribute` : `ItemWidgetOf<T>`
- `ScopeAttribute` : `ScopeWidgetOf<T>`
- `ItemAttribute` 、`ScopeAttribute` : `VisualWidgetOf<T>`
- `StylerAttribute` : `StylerWidgetOf<T>`

> 由於 Widget 在實作中可能會使用到 UnityEditor 中的函式。所以建議新增在 Editor 資料夾中,使 unity 不在建置時編譯該腳本。否則專案將無法建置
> 由於 `Widget` 在實作中可能會使用到 `UnityEditor` 中的函式。所以建議新增在 Editor 資料夾中,使 unity 不在建置時編譯該腳本。否則專案有可能會無法建置

#### `VisualWidget` : 實作 `Build()`

當你的目標是 `ItemWidget` 或是 `ScopeWidget` 時,你需要實作 `Build()` 函式來描述 `Widget` 的 UI
你也可以回傳 `null`,在這種情況下該 `Widget` 會被視為 `LogicWidget` 此時將不渲染任何元素但執行 `Build()` 中的邏輯。

```cs
public class MyScopeWidget : ScopeWidgetOf<MyScopeAttribute>
public class MyScopeWidget : VisualWidgetOf<MyScopeAttribute>
{
public override VisualElement Build(IBuildContext context)
{
Expand Down Expand Up @@ -440,13 +440,13 @@ public class MyStylerWidget : StylerWidgetOf<MyStylerAttribute>
{
// 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;
}
}
```
Expand Down
Original file line number Diff line number Diff line change
@@ -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<T>() where T : IWidget
public T GetAncestorWidget<T>() where T : Widget
{
T res = default;

Expand All @@ -31,7 +40,7 @@ public T GetAncestorWidget<T>() where T : IWidget
return res;
}

public Context GetContextOfAncestorWidget<T>() where T : IWidget
public Context GetContextOfAncestorWidget<T>() where T : Widget
{
Context res = null;

Expand Down Expand Up @@ -75,6 +84,18 @@ public void Attach(Context child)
child.VisitReceiver<IContextAttachedReceiver>((ctx, r) => r.OnContextAttached(ctx));
}

internal VisualElement Build()
{
renderedElement = _widget.Build(this);

this.VisitChildReceivers<IParentBuiltReceiver>((ctx, r) =>
{
r.OnParentBuilt(ctx, renderedElement);
});

return renderedElement;
}

internal T GetAncestorContext<T>() where T : Context
{
T res = null;
Expand Down
8 changes: 0 additions & 8 deletions Packages/com.naukri.inspector-maid/Editor/Contexts/Core.meta

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<Context> children = new();

public override IWidget Widget { get; }

public override void VisitChildContexts(Action<Context> visitor)
{
VisitChildContextsImpl(children, visitor);
}

protected override void OnChildAttached(Context child)
{
OnChildAttachedImpl(children, child);
}
}

partial class MultiChildContext
{
internal static void VisitChildContextsImpl(List<Context> children, Action<Context> visitor)
{
// copy children to avoid concurrent modification
var childContexts = children.ToArray();
Expand All @@ -39,10 +21,12 @@ internal static void VisitChildContextsImpl(List<Context> children, Action<Conte
}
}

internal static void OnChildAttachedImpl(List<Context> 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);
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<Context> visitor)
{
VisitChildContextsImpl(visitor);
}

protected override void OnChildAttached(Context child)
{
OnChildAttachedImpl(child);
}
}

partial class NoneChildContext
{
internal static void VisitChildContextsImpl(Action<Context> 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.");
}
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<Context> 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<Context> 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;
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Naukri.InspectorMaid.Editor.Widgets.Core
namespace Naukri.InspectorMaid.Editor.Core
{
internal interface IAttributeProvider
{
Expand Down
Loading

0 comments on commit 86e26d2

Please sign in to comment.