Skip to content

Commit 887a6ef

Browse files
committed
Added property change event
1 parent d0f2cf2 commit 887a6ef

7 files changed

Lines changed: 103 additions & 11 deletions

File tree

src/NodeDev.Blazor/Components/ClassExplorer.razor

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
<MudStack Row="false" Class="wh100">
1+
@inject IDialogService DialogService
2+
3+
<MudStack Row="false" Class="wh100">
24
<MudText>@Class.Name</MudText>
35

46
<MudTreeView T="TreeItem" Items="Items" SelectedValueChanged="OnSelectedItemChanged" Dense="true" Class="w100">
@@ -44,6 +46,7 @@
4446
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%" @onmouseover="() => Hovered = Item" @onmouseout="() => Hovered = null">
4547
<MudText Style="justify-self: start;">@Item.Value.Property!.PropertyType.FriendlyName @Item.Text</MudText>
4648
<div style="@($"justify-self: end; visibility: {(Hovered == Item ? "visible" : "hidden")}")">
49+
<MudIconButton Icon="@Icons.Material.Filled.ShapeLine" Size="Size.Medium" Color="Color.Inherit" OnClick="() => ShowPropertyTypeEdit(Item.Value)" />
4750
<MudIconButton Icon="@Icons.Material.Filled.Edit" Size="Size.Medium" Color="Color.Inherit" OnClick="() => ShowRenameMenu(Item.Value)" />
4851
<MudIconButton Icon="@Icons.Material.Filled.Delete" Size="Size.Medium" Color="Color.Inherit" />
4952
</div>
@@ -55,6 +58,7 @@
5558
</MudTreeView>
5659
</MudStack>
5760

61+
5862
@code {
5963

6064
private enum TreeItemType
@@ -154,6 +158,28 @@
154158
Text = CurrentlyEditingItem.Name;
155159
}
156160

161+
private async Task ShowPropertyTypeEdit(TreeItem item)
162+
{
163+
var result = await DialogService.Show<TypeSelectorDialog>("", new()
164+
{
165+
[nameof(TypeSelectorDialog.TypeFactory)] = Class.TypeFactory
166+
}, new DialogOptions()
167+
{
168+
FullScreen = true,
169+
FullWidth = true
170+
}).Result;
171+
172+
NodeDev.Core.Types.TypeBase typeBase;
173+
if (result.Data is Type type)
174+
typeBase = Class.TypeFactory.Get(type);
175+
else if (result.Data is NodeDev.Core.Types.TypeBase t)
176+
typeBase = t;
177+
else
178+
return;
179+
180+
item.Property!.ChangeType(typeBase);
181+
}
182+
157183
private void OnEditTextKeyUp(KeyboardEventArgs args)
158184
{
159185
if (args.Key != "Enter" || string.IsNullOrWhiteSpace(Text) || CurrentlyEditingItem == null)
@@ -191,7 +217,7 @@
191217
CurrentlyEditingItem.Method.Rename(Text);
192218
CurrentlyEditingItem.Name = Text;
193219
}
194-
else if(CurrentlyEditingItem.Property != null)
220+
else if (CurrentlyEditingItem.Property != null)
195221
{
196222
CurrentlyEditingItem.Property.Rename(Text);
197223
CurrentlyEditingItem.Name = Text;

src/NodeDev.Blazor/Components/GraphCanvas.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
@if (IsShowingGenericTypeSelection)
1111
{
1212
<div @onclick="CancelPopup" style="background-color: var(--mud-palette-overlay-dark); width: 100%; height: 100%; position: absolute; z-index: 1">
13-
<NodeDev.Blazor.Components.TypeSelector PositionX="PopupX" PositionY="PopupY" GraphCanvas="this" OnTypeSelected="OnGenericTypeSelected" />
13+
<NodeDev.Blazor.Components.TypeSelector PositionX="PopupX" PositionY="PopupY" TypeFactory="Graph.SelfClass.TypeFactory" OnTypeSelected="OnGenericTypeSelected" />
1414
</div>
1515
}
1616
@if (IsShowingOverloadSelection && PopupNode != null)

src/NodeDev.Blazor/Components/GraphCanvas.razor.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Collections.Generic;
1111
using System.Linq;
1212
using System.Numerics;
13+
using System.Reactive.Linq;
1314
using System.Text;
1415
using System.Threading.Tasks;
1516
using System.Xml.Linq;
@@ -55,11 +56,27 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
5556

5657
await Task.Delay(100);
5758
await Graph.Invoke(InitializeCanvasWithGraphNodes);
59+
60+
GraphChangedSubscription = Graph.SelfClass.Project.GraphChanged.Where(x => x == Graph).AcceptThenSample(TimeSpan.FromMilliseconds(250)).Subscribe(OnGraphChangedFromCore);
5861
}
5962
}
6063

6164
#endregion
6265

66+
#region OnGraphChangedFromCore
67+
68+
private void OnGraphChangedFromCore(Graph _)
69+
{
70+
InvokeAsync(() =>
71+
{
72+
UpdateNodes(Graph.Nodes.Values); // update all the nodes
73+
74+
StateHasChanged();
75+
});
76+
}
77+
78+
#endregion
79+
6380
#region UpdateConnectionType
6481

6582
private void UpdateConnectionType(Connection connection)
@@ -489,10 +506,14 @@ private NodeCreationInfo GetNodeCreationInfo(Node node)
489506

490507
#region Dispose
491508

509+
private IDisposable? GraphChangedSubscription;
492510
public void Dispose()
493511
{
494512
Ref?.Dispose();
495513
Ref = null!;
514+
515+
GraphChangedSubscription?.Dispose();
516+
GraphChangedSubscription = null;
496517
}
497518

498519
#endregion

src/NodeDev.Blazor/Components/TypeSelector.razor

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@using NodeDev.Core.Types;
22

3-
<div style="@($"position: absolute; left: calc(50vw - 300px); top: calc(50vh - 200px); width: 600px; height: 400px")" @onclick:stopPropagation="true">
3+
<div style="@(MudDialog == null ? $"position: absolute; left: calc(50vw - 300px); top: calc(50vh - 200px); width: 600px; height: 400px" : "width: 100%; height: 100%")" @onclick:stopPropagation="true">
44

55
<MudPaper Style="height: 100%; width: 100%">
66

@@ -17,7 +17,6 @@
1717

1818
</MudStack>
1919

20-
2120
</MudPaper>
2221
</div>
2322

@@ -28,21 +27,24 @@
2827

2928
[Parameter]
3029
public int PositionY { get; set; }
31-
30+
3231
[Parameter]
33-
public GraphCanvas GraphCanvas { get; set; } = null!;
32+
public TypeFactory TypeFactory { get; set; } = null!;
3433

3534
[Parameter]
3635
public EventCallback<Type> OnTypeSelected { get; set; }
3736

37+
[CascadingParameter]
38+
public MudDialogInstance? MudDialog { get; set; } = null!;
39+
3840
private string? Error;
3941
private Type? Type;
4042

4143
private string TypeText { get; set; } = "";
4244

4345
private void TypeToCreateChanged()
4446
{
45-
Error = GraphCanvas.Graph.SelfClass.TypeFactory.CreateBaseFromUserInput(TypeText, out Type);
47+
Error = TypeFactory.CreateBaseFromUserInput(TypeText, out Type);
4648
}
4749

4850
private async Task OnKeyDown(KeyboardEventArgs args)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<MudDialog>
2+
<DialogContent>
3+
<TypeSelector TypeFactory="TypeFactory" OnTypeSelected="MudDialog.Close<Type>" />
4+
</DialogContent>
5+
<DialogActions>
6+
<MudButton OnClick="Cancel">Cancel</MudButton>
7+
</DialogActions>
8+
</MudDialog>
9+
@code {
10+
[CascadingParameter]
11+
public MudDialogInstance MudDialog { get; set; } = null!;
12+
13+
[Parameter, EditorRequired]
14+
public NodeDev.Core.Types.TypeFactory TypeFactory { get; set; } = null!;
15+
16+
void Cancel() => MudDialog.Cancel();
17+
}

src/NodeDev.Core/Class/NodeClassProperty.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace NodeDev.Core.Class
99
{
10-
public class NodeClassProperty: IMemberInfo
10+
public class NodeClassProperty : IMemberInfo
1111
{
1212
private record class SerializedNodeClassProperty(string Name, string TypeFullName, string Type);
1313
public NodeClassProperty(NodeClass ownerClass, string name, TypeBase propertyType)
@@ -17,12 +17,11 @@ public NodeClassProperty(NodeClass ownerClass, string name, TypeBase propertyTyp
1717
PropertyType = propertyType;
1818
}
1919

20-
2120
public NodeClass Class { get; }
2221

2322
public string Name { get; private set; }
2423

25-
public TypeBase PropertyType { get; }
24+
public TypeBase PropertyType { get; private set; }
2625

2726
public List<NodeClassMethodParameter> Parameters { get; } = new();
2827

@@ -38,6 +37,29 @@ public void Rename(string newName)
3837
return;
3938

4039
Name = newName;
40+
UpdateGraphUsingProperty();
41+
}
42+
43+
public void ChangeType(TypeBase type)
44+
{
45+
PropertyType = type;
46+
47+
UpdateGraphUsingProperty();
48+
}
49+
50+
private void UpdateGraphUsingProperty()
51+
{
52+
foreach (var nodeClass in Class.Project.Classes)
53+
{
54+
foreach (var method in nodeClass.Methods)
55+
{
56+
var hasAnyGetProperty = method.Graph.Nodes.Values.OfType<Nodes.GetPropertyOrField>().Any();
57+
var hasAnySetProperty = method.Graph.Nodes.Values.OfType<Nodes.SetPropertyOrField>().Any();
58+
59+
if (hasAnySetProperty || hasAnyGetProperty)
60+
Class.Project.GraphChangedSubject.OnNext(method.Graph);
61+
}
62+
}
4163
}
4264

4365
#region Serialization

src/NodeDev.Core/NodeDev.Core.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,8 @@
66
<Nullable>enable</Nullable>
77
</PropertyGroup>
88

9+
<ItemGroup>
10+
<PackageReference Include="System.Reactive" Version="6.0.0" />
11+
</ItemGroup>
12+
913
</Project>

0 commit comments

Comments
 (0)