Skip to content

Commit f2618d6

Browse files
committed
Added UI to add/remove / edit method parameters.
Closes #6
1 parent d4f561f commit f2618d6

9 files changed

Lines changed: 430 additions & 45 deletions

File tree

src/NodeDev.Blazor/Components/AddMethodMenu.razor

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@typeparam T
2+
@typeparam TProperty
3+
@inherits PropertyColumn<T, TProperty>
4+
5+
@code {
6+
7+
[Parameter]
8+
public Action<T, TProperty> SetCallback { get; set; }
9+
10+
protected override void SetProperty(object item, object value)
11+
{
12+
SetCallback((T)item, (TProperty)Convert.ChangeType(value, typeof(TProperty)));
13+
}
14+
}

src/NodeDev.Blazor/Components/ClassExplorer.razor

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%" @onmouseover="() => Hovered = Item" @onmouseout="() => Hovered = null">
3434
<MudText Style="justify-self: start;">@Item.Text</MudText>
3535
<div style="@($"justify-self: end; visibility: {(Hovered == Item ? "visible" : "hidden")}")">
36+
<MudIconButton Icon="@Icons.Material.Filled.Edit" Size="Size.Medium" Color="Color.Inherit" OnClick="() => ShowMethodEdit(Item.Value)" />
3637
<MudIconButton Icon="@Icons.Material.Filled.Add" Size="Size.Medium" Color="Color.Inherit" OnClick="() => ShowRenameMenu(Item.Value)" />
3738
</div>
3839
</div>
@@ -180,6 +181,19 @@
180181
item.Property!.ChangeType(typeBase);
181182
}
182183

184+
private async Task ShowMethodEdit(TreeItem item)
185+
{
186+
var result = await DialogService.Show<EditMethodMenu>("", new()
187+
{
188+
[nameof(EditMethodMenu.Method)] = item.Method
189+
}, new DialogOptions()
190+
{
191+
FullScreen = false,
192+
FullWidth = true,
193+
MaxWidth = MaxWidth.Large
194+
}).Result;
195+
}
196+
183197
private void OnEditTextKeyUp(KeyboardEventArgs args)
184198
{
185199
if (args.Key != "Enter" || string.IsNullOrWhiteSpace(Text) || CurrentlyEditingItem == null)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
@inject IDialogService DialogService
2+
3+
<MudDialog>
4+
<DialogContent>
5+
<div style="height: 50vh; width: 100%; display: flex; flex-direction: column">
6+
<MudText Typo="Typo.h2">@Method.Name</MudText>
7+
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="Method.AddDefaultParameter" Class="px-8">Add parameter</MudButton>
8+
9+
<MudDataGrid Items="Method.Parameters" EditMode="DataGridEditMode.Cell" ReadOnly="false" Class="w100 flex-1">
10+
<Columns>
11+
<TemplateColumn Title="Type" IsEditable="false">
12+
<CellTemplate>
13+
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
14+
<MudText>@context.Item.ParameterType.FriendlyName</MudText>
15+
<div style="justify-self: end;">
16+
<MudIconButton Icon="@Icons.Material.Filled.Edit" OnClick="() => ShowParameterTypeEdit(context.Item)"></MudIconButton>
17+
</div>
18+
</div>
19+
</CellTemplate>
20+
</TemplateColumn>
21+
22+
<CallbackSetColumn Property="x => x.Name" SetCallback="(x, name) => x.Rename(name)" IsEditable="true" />
23+
24+
<TemplateColumn IsEditable="false">
25+
26+
<CellTemplate>
27+
28+
<div style="display: flex; flex-direction: row">
29+
<MudIconButton Icon="@Icons.Material.Filled.ArrowUpward" OnClick="context.Item.MoveUp" Disabled="Method.Parameters.FirstOrDefault() == context.Item"></MudIconButton>
30+
<MudIconButton Icon="@Icons.Material.Filled.ArrowDownward" OnClick="context.Item.MoveDown" Disabled="Method.Parameters.LastOrDefault() == context.Item"></MudIconButton>
31+
<MudIconButton Icon="@Icons.Material.Filled.Delete" OnClick="context.Item.Remove"></MudIconButton>
32+
</div>
33+
34+
</CellTemplate>
35+
36+
</TemplateColumn>
37+
</Columns>
38+
</MudDataGrid>
39+
</div>
40+
41+
</DialogContent>
42+
<DialogActions>
43+
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="Submit">Close</MudButton>
44+
</DialogActions>
45+
</MudDialog>
46+
47+
48+
@code {
49+
[CascadingParameter]
50+
MudDialogInstance MudDialog { get; set; } = null!;
51+
52+
[Parameter]
53+
public NodeDev.Core.Class.NodeClassMethod Method { get; set; } = null!;
54+
55+
void Submit() => MudDialog.Close(DialogResult.Ok(true));
56+
57+
58+
private async Task ShowParameterTypeEdit(NodeDev.Core.Class.NodeClassMethodParameter parameter)
59+
{
60+
var result = await DialogService.Show<TypeSelectorDialog>("", new()
61+
{
62+
[nameof(TypeSelectorDialog.TypeFactory)] = Method.Class.TypeFactory
63+
}, new DialogOptions()
64+
{
65+
FullScreen = true,
66+
FullWidth = true
67+
}).Result;
68+
69+
NodeDev.Core.Types.TypeBase typeBase;
70+
if (result.Data is Type type)
71+
typeBase = Method.Class.TypeFactory.Get(type);
72+
else if (result.Data is NodeDev.Core.Types.TypeBase t)
73+
typeBase = t;
74+
else
75+
return;
76+
77+
parameter.ChangeType(typeBase);
78+
}
79+
}

src/NodeDev.Core/Class/NodeClassMethod.cs

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using NodeDev.Core.Types;
1+
using NodeDev.Core.Nodes;
2+
using NodeDev.Core.Nodes.Flow;
3+
using NodeDev.Core.Types;
24
using System;
35
using System.Collections.Generic;
46
using System.Linq;
@@ -8,8 +10,8 @@
810

911
namespace NodeDev.Core.Class
1012
{
11-
public class NodeClassMethod: IMethodInfo
12-
{
13+
public class NodeClassMethod : IMethodInfo
14+
{
1315

1416
public class RealMethodInfo : IMethodInfo
1517
{
@@ -67,15 +69,15 @@ public NodeClassMethod(NodeClass ownerClass, string name, TypeBase returnType, G
6769
}
6870

6971

70-
public NodeClass Class { get; }
72+
public NodeClass Class { get; }
7173

72-
public string Name { get; private set; }
74+
public string Name { get; private set; }
7375

74-
public TypeBase ReturnType { get; }
76+
public TypeBase ReturnType { get; }
7577

76-
public List<NodeClassMethodParameter> Parameters { get; } = new();
78+
public List<NodeClassMethodParameter> Parameters { get; } = new();
7779

78-
public Graph Graph { get; }
80+
public Graph Graph { get; }
7981

8082
public bool IsStatic => false;
8183

@@ -84,14 +86,36 @@ public NodeClassMethod(NodeClass ownerClass, string name, TypeBase returnType, G
8486

8587
public void Rename(string newName)
8688
{
87-
if(string.IsNullOrWhiteSpace(newName))
89+
if (string.IsNullOrWhiteSpace(newName))
8890
return;
8991

9092
Name = newName;
9193

9294
Class.Project.GraphChangedSubject.OnNext(Graph);
9395
}
9496

97+
public void AddDefaultParameter()
98+
{
99+
var newParameter = new NodeClassMethodParameter("NewParameter", Class.TypeFactory.Get<int>(), this);
100+
Parameters.Add(newParameter);
101+
102+
foreach (var methodCall in Class.Project.GetNodes<MethodCall>())
103+
{
104+
if (methodCall.TargetMethod == this)
105+
{
106+
methodCall.OnNewMethodParameter(newParameter);
107+
Class.Project.GraphChangedSubject.OnNext(methodCall.Graph);
108+
}
109+
}
110+
111+
var entry = Graph.Nodes.Values.OfType<EntryNode>().FirstOrDefault();
112+
if(entry != null)
113+
{
114+
entry.AddNewParameter(newParameter);
115+
Class.Project.GraphChangedSubject.OnNext(Graph);
116+
}
117+
}
118+
95119
public IEnumerable<IMethodParameterInfo> GetParameters()
96120
{
97121
return Parameters;
@@ -101,21 +125,21 @@ public IEnumerable<IMethodParameterInfo> GetParameters()
101125

102126
private SerializedNodeClassMethod? SavedDataDuringDeserializationStep1 { get; set; }
103127
public static NodeClassMethod Deserialize(NodeClass owner, string serialized)
104-
{
105-
var serializedNodeClassMethod = System.Text.Json.JsonSerializer.Deserialize<SerializedNodeClassMethod>(serialized) ?? throw new Exception("Unable to deserialize node class method");
128+
{
129+
var serializedNodeClassMethod = System.Text.Json.JsonSerializer.Deserialize<SerializedNodeClassMethod>(serialized) ?? throw new Exception("Unable to deserialize node class method");
106130

107-
var returnType = TypeBase.Deserialize(owner.Project.TypeFactory, serializedNodeClassMethod.ReturnTypeFullName, serializedNodeClassMethod.ReturnType);
131+
var returnType = TypeBase.Deserialize(owner.Project.TypeFactory, serializedNodeClassMethod.ReturnTypeFullName, serializedNodeClassMethod.ReturnType);
108132
var graph = new Graph();
109133
var nodeClassMethod = new NodeClassMethod(owner, serializedNodeClassMethod.Name, returnType, graph);
110134
graph.SelfMethod = nodeClassMethod; // a bit / really ugly
111135

112136
foreach (var parameter in serializedNodeClassMethod.Parameters)
113-
nodeClassMethod.Parameters.Add(NodeClassMethodParameter.Deserialize(owner.Project.TypeFactory, parameter));
137+
nodeClassMethod.Parameters.Add(NodeClassMethodParameter.Deserialize(owner.Project.TypeFactory, parameter, nodeClassMethod));
114138

115139
nodeClassMethod.SavedDataDuringDeserializationStep1 = serializedNodeClassMethod;
116140

117141
return nodeClassMethod;
118-
}
142+
}
119143

120144
public void Deserialize_Step3()
121145
{
@@ -128,7 +152,7 @@ public void Deserialize_Step3()
128152
}
129153

130154
public string Serialize()
131-
{
155+
{
132156
var serializedNodeClassMethod = new SerializedNodeClassMethod(Name, ReturnType.GetType().FullName!, ReturnType.FullName, Parameters.Select(x => x.Serialize()).ToList(), Graph.Serialize());
133157
return System.Text.Json.JsonSerializer.Serialize(serializedNodeClassMethod);
134158
}

0 commit comments

Comments
 (0)