diff --git a/src/NodeDev.Blazor/Components/AlternateOverloadsSelection.razor b/src/NodeDev.Blazor/Components/AlternateOverloadsSelection.razor index 7f34f70..0e3dc22 100644 --- a/src/NodeDev.Blazor/Components/AlternateOverloadsSelection.razor +++ b/src/NodeDev.Blazor/Components/AlternateOverloadsSelection.razor @@ -3,7 +3,7 @@ - + @foreach (var overload in Node.AlternatesOverloads) { diff --git a/src/NodeDev.Blazor/Components/ClassExplorer.razor b/src/NodeDev.Blazor/Components/ClassExplorer.razor index 5d1dbfa..1098a28 100644 --- a/src/NodeDev.Blazor/Components/ClassExplorer.razor +++ b/src/NodeDev.Blazor/Components/ClassExplorer.razor @@ -1,271 +1,306 @@ @inject IDialogService DialogService - @Class.Name - - - - @if (context == CurrentlyEditingItem) - { - - - - - - } - else if (context.Type == TreeItemType.MethodsFolder || context.Type == TreeItemType.PropertiesFolder) - { - - -
- @Item.Text -
- -
-
-
-
- } - else if (context.Type == TreeItemType.Method) - { - - -
- @Item.Value!.Method!.ReturnType.FriendlyName @Item.Text (@string.Join(',', Item.Value.Method!.Parameters.Select(x => $"{x.ParameterType.FriendlyName} {x.Name}"))) -
- - -
-
-
-
- } - else if (context.Type == TreeItemType.Property && context.Property != null) - { - - -
- @Item.Value!.Property!.PropertyType.FriendlyName @Item.Text -
- - - -
-
-
-
- } -
-
+ @Class.Name + + + + @if (context.Value == null) + { } + else if (context.Value == CurrentlyEditingItem) + { + + + + + + } + else if (context.Value.Type == TreeItemType.MethodsFolder || context.Value.Type == TreeItemType.PropertiesFolder) + { + + +
+ @Item.Text +
+ +
+
+
+
+ } + else if (context.Value.Type == TreeItemType.Method) + { + + +
+ @Item.Value!.Method!.ReturnType.FriendlyName @Item.Text (@string.Join(',', Item.Value.Method!.Parameters.Select(x => $"{x.ParameterType.FriendlyName} {x.Name}"))) +
+ + +
+
+
+
+ } + else if (context.Value.Type == TreeItemType.Property && context.Value.Property != null) + { + + +
+ @Item.Value!.Property!.PropertyType.FriendlyName @Item.Value!.Name +
+ + + +
+
+
+
+ } +
+
@code { - private enum TreeItemType - { - PropertiesFolder, - Property, - MethodsFolder, - Method - } - private record class TreeItem(HashSet Children, TreeItemType Type, NodeDev.Core.Class.NodeClassMethod? Method, NodeDev.Core.Class.NodeClassProperty? Property) - { - public string Name { get; set; } = ""; - public bool IsExpanded { get; set; } = true; - } - - [Parameter] - public NodeDev.Core.Class.NodeClass Class { get; set; } = null!; - - [Parameter] - public NodeDev.Core.Class.NodeClassMethod? SelectedMethod { get; set; } - - [Parameter] - public EventCallback SelectedMethodChanged { get; set; } - - private TreeItem? SelectedTreeItem; - - private HashSet Items { get; } = new(); - - private MudTreeViewItem? Hovered = null; - - private TreeItem? CurrentlyEditingItem = null; - private string? Text = null; - public bool IsNew = false; - - protected override void OnInitialized() - { - base.OnInitialized(); - - Items.Add(new(new(), TreeItemType.MethodsFolder, null, null) - { - Name = "Methods" - }); - - Items.Add(new(new(), TreeItemType.PropertiesFolder, null, null) - { - Name = "Properties" - }); - - foreach (var method in Class.Methods) - { - Items.First(x => x.Type == TreeItemType.MethodsFolder).Children.Add(new(new(), TreeItemType.Method, method, null) - { - Name = method.Name - }); - } - - foreach (var property in Class.Properties) - { - Items.First(x => x.Type == TreeItemType.PropertiesFolder).Children.Add(new(new(), TreeItemType.Property, null, property) - { - Name = property.Name - }); - } - } - - private void ShowAddMethodMenu() - { - CurrentlyEditingItem = new TreeItem(new(), TreeItemType.Method, null, null) - { - Name = "NewMethod" - }; - IsNew = true; - Text = CurrentlyEditingItem.Name; - - Items.First(x => x.Type == TreeItemType.MethodsFolder).Children.Add(CurrentlyEditingItem); - } - - private void ShowNewProperty() - { - CurrentlyEditingItem = new TreeItem(new(), TreeItemType.Property, null, null) - { - Name = "NewProperty" - }; - IsNew = true; - Text = CurrentlyEditingItem.Name; - - Items.First(x => x.Type == TreeItemType.PropertiesFolder).Children.Add(CurrentlyEditingItem); - } - - private void ShowRenameMenu(TreeItem item) - { - if (item == null) - return; - - CurrentlyEditingItem = item; - IsNew = false; - Text = CurrentlyEditingItem.Name; - } - - private async Task ShowPropertyTypeEdit(TreeItem item) - { - var result = await DialogService.Show("", new() - { - [nameof(TypeSelectorDialog.TypeFactory)] = Class.TypeFactory - }, new DialogOptions() - { - FullScreen = true, - FullWidth = true - }).Result; - - NodeDev.Core.Types.TypeBase typeBase; - if (result.Data is Type type) - typeBase = Class.TypeFactory.Get(type, null); - else if (result.Data is NodeDev.Core.Types.TypeBase t) - typeBase = t; - else - return; - - item.Property!.ChangeType(typeBase); - } - - private async Task ShowMethodEdit(TreeItem item) - { - var result = await DialogService.Show("", new() - { - [nameof(EditMethodMenu.Method)] = item.Method - }, new DialogOptions() - { - FullScreen = false, - FullWidth = true, - MaxWidth = MaxWidth.Large - }).Result; - } - - private void OnEditTextKeyUp(KeyboardEventArgs args) - { - if (args.Key != "Enter" || string.IsNullOrWhiteSpace(Text) || CurrentlyEditingItem == null) - return; - - if (IsNew) - { - if (CurrentlyEditingItem.Type == TreeItemType.Method) - { - var method = new Core.Class.NodeClassMethod(Class, Text, Class.TypeFactory.Get(typeof(void), null), new Core.Graph()); - method.Graph.AddNode(new Core.Nodes.Flow.EntryNode(method.Graph), false); - method.Graph.AddNode(new Core.Nodes.Flow.ReturnNode(method.Graph), false); - Class.Methods.Add(method); - - Items.First(x => x.Type == TreeItemType.MethodsFolder).Children.Remove(CurrentlyEditingItem); - Items.First(x => x.Type == TreeItemType.MethodsFolder).Children.Add(new(new(), TreeItemType.Method, method, null) - { - Name = method.Name - }); - } - else if (CurrentlyEditingItem.Type == TreeItemType.Property) - { - var property = new Core.Class.NodeClassProperty(Class, Text, Class.TypeFactory.Get()); - Class.Properties.Add(property); - - Items.First(x => x.Type == TreeItemType.PropertiesFolder).Children.Remove(CurrentlyEditingItem); - Items.First(x => x.Type == TreeItemType.PropertiesFolder).Children.Add(new(new(), TreeItemType.Property, null, property) - { - Name = property.Name - }); - } - } - else if (CurrentlyEditingItem.Method != null) - { - CurrentlyEditingItem.Method.Rename(Text); - CurrentlyEditingItem.Name = Text; - } - else if (CurrentlyEditingItem.Property != null) - { - CurrentlyEditingItem.Property.Rename(Text); - CurrentlyEditingItem.Name = Text; - } - - CurrentlyEditingItem = null; - Text = null; - } - - private void OnSelectedItemChanged(TreeItem? tree) - { - if (CurrentlyEditingItem != null) - { - // remove the textbox - if (IsNew) - Items.First().Children.Remove(CurrentlyEditingItem); - - CurrentlyEditingItem = null; - Text = null; - } - - SelectedTreeItem = tree; - - if (tree?.Type == TreeItemType.Method) - { - SelectedMethod = tree.Method; - _ = SelectedMethodChanged.InvokeAsync(SelectedMethod); - } - else - { - SelectedMethod = null; - _ = SelectedMethodChanged.InvokeAsync(SelectedMethod); - } - - } + private enum TreeItemType + { + PropertiesFolder, + Property, + MethodsFolder, + Method + } + private record class TreeItem(TreeItemType Type, NodeDev.Core.Class.NodeClassMethod? Method, NodeDev.Core.Class.NodeClassProperty? Property) + { + public string Name { get; set; } = ""; + public bool IsExpanded { get; set; } = true; + } + + [Parameter] + public NodeDev.Core.Class.NodeClass Class { get; set; } = null!; + + [Parameter] + public NodeDev.Core.Class.NodeClassMethod? SelectedMethod { get; set; } + + [Parameter] + public EventCallback SelectedMethodChanged { get; set; } + + private TreeItem? SelectedTreeItem; + + private List> Items { get; } = []; + + private TreeItem? Hovered = null; + + private TreeItem? CurrentlyEditingItem = null; + private string? Text = null; + public bool IsNew = false; + + protected override void OnInitialized() + { + base.OnInitialized(); + + TreeItemData methodsFolder; + TreeItemData propertiesFolder; + + Items.Add(methodsFolder = new() + { + Value = new(TreeItemType.MethodsFolder, null, null) + { + Name = "Methods" + }, + Children = [] + }); + + Items.Add(propertiesFolder = new() + { + Value = new(TreeItemType.PropertiesFolder, null, null) + { + Name = "Properties" + }, + Children = [] + }); + + foreach (var method in Class.Methods) + { + methodsFolder.Children.Add(new() + { + Value = new(TreeItemType.Method, method, null) + { + Name = method.Name + } + }); + } + + foreach (var property in Class.Properties) + { + propertiesFolder.Children.Add(new() + { + Value = new(TreeItemType.Property, null, property) + { + Name = property.Name + } + }); + } + } + + private void ShowAddMethodMenu() + { + var newItem = new TreeItemData() + { + Value = new TreeItem(TreeItemType.Method, null, null) + { + Name = "NewMethod" + } + }; + Items.First(x => x.Value?.Type == TreeItemType.MethodsFolder).Children!.Add(newItem); + + CurrentlyEditingItem = newItem.Value; + IsNew = true; + Text = CurrentlyEditingItem.Name; + + } + + private void ShowNewProperty() + { + var newItem = new TreeItemData() + { + Value = new(TreeItemType.Property, null, null) + { + Name = "NewProperty" + } + }; + Items.First(x => x.Value!.Type == TreeItemType.PropertiesFolder).Children!.Add(newItem); + + CurrentlyEditingItem = newItem.Value; + IsNew = true; + Text = CurrentlyEditingItem.Name; + + } + + private void ShowRenameMenu(TreeItem item) + { + if (item == null) + return; + + Text = item.Name; + CurrentlyEditingItem = item; + IsNew = false; + } + + private async Task ShowPropertyTypeEdit(TreeItem item) + { + var result = await DialogService.Show("", new() + { + [nameof(TypeSelectorDialog.TypeFactory)] = Class.TypeFactory + }, new DialogOptions() + { + FullScreen = true, + FullWidth = true + }).Result; + + NodeDev.Core.Types.TypeBase typeBase; + if (result.Data is Type type) + typeBase = Class.TypeFactory.Get(type, null); + else if (result.Data is NodeDev.Core.Types.TypeBase t) + typeBase = t; + else + return; + + item.Property!.ChangeType(typeBase); + } + + private async Task ShowMethodEdit(TreeItem item) + { + var result = await DialogService.Show("", new() + { + [nameof(EditMethodMenu.Method)] = item.Method + }, new DialogOptions() + { + FullScreen = false, + FullWidth = true, + MaxWidth = MaxWidth.Large + }).Result; + } + + private void OnEditTextKeyUp(KeyboardEventArgs args) + { + if (args.Key != "Enter" || string.IsNullOrWhiteSpace(Text) || CurrentlyEditingItem == null) + return; + + if (IsNew) + { + if (CurrentlyEditingItem!.Type == TreeItemType.Method) + { + var method = new Core.Class.NodeClassMethod(Class, Text, Class.TypeFactory.Get(typeof(void), null), new Core.Graph()); + method.Graph.AddNode(new Core.Nodes.Flow.EntryNode(method.Graph), false); + method.Graph.AddNode(new Core.Nodes.Flow.ReturnNode(method.Graph), false); + Class.Methods.Add(method); + + Items.First(x => x.Value!.Type == TreeItemType.MethodsFolder).Children!.RemoveAll(x => x.Value == CurrentlyEditingItem); + Items.First(x => x.Value!.Type == TreeItemType.MethodsFolder).Children!.Add(new() + { + Value = new(TreeItemType.Method, method, null) + { + Name = method.Name + } + }); + } + else if (CurrentlyEditingItem.Type == TreeItemType.Property) + { + var property = new Core.Class.NodeClassProperty(Class, Text, Class.TypeFactory.Get()); + Class.Properties.Add(property); + + Items.First(x => x.Value!.Type == TreeItemType.PropertiesFolder).Children!.RemoveAll(x => x.Value == CurrentlyEditingItem); + Items.First(x => x.Value!.Type == TreeItemType.PropertiesFolder).Children!.Add(new() + { + Value = new(TreeItemType.Property, null, property) + { + Name = property.Name + } + }); + } + } + else if (CurrentlyEditingItem.Method != null) + { + CurrentlyEditingItem.Method.Rename(Text); + CurrentlyEditingItem.Name = Text; + } + else if (CurrentlyEditingItem.Property != null) + { + CurrentlyEditingItem.Property.Rename(Text); + CurrentlyEditingItem.Name = Text; + } + + CurrentlyEditingItem = null; + Text = null; + } + + private void OnSelectedItemChanged(TreeItem? tree) + { + if (CurrentlyEditingItem != null) + { + // remove the textbox + if (IsNew) + Items.First().Children!.RemoveAll(x => x.Value == CurrentlyEditingItem); + + CurrentlyEditingItem = null; + Text = null; + } + + SelectedTreeItem = tree; + + if (tree?.Type == TreeItemType.Method) + { + SelectedMethod = tree.Method; + _ = SelectedMethodChanged.InvokeAsync(SelectedMethod); + } + else + { + SelectedMethod = null; + _ = SelectedMethodChanged.InvokeAsync(SelectedMethod); + } + + } } \ No newline at end of file diff --git a/src/NodeDev.Blazor/Components/EditMethodMenu.razor b/src/NodeDev.Blazor/Components/EditMethodMenu.razor index 5670981..0d185b3 100644 --- a/src/NodeDev.Blazor/Components/EditMethodMenu.razor +++ b/src/NodeDev.Blazor/Components/EditMethodMenu.razor @@ -8,7 +8,7 @@ - +
@context.Item.ParameterType.FriendlyName diff --git a/src/NodeDev.Blazor/Components/NodeSelection.razor b/src/NodeDev.Blazor/Components/NodeSelection.razor index 5eaa4c8..15adca3 100644 --- a/src/NodeDev.Blazor/Components/NodeSelection.razor +++ b/src/NodeDev.Blazor/Components/NodeSelection.razor @@ -8,7 +8,7 @@ - + @foreach (var type in NodeDev.Core.NodeProvider.Search(GraphCanvas.Graph.SelfClass.Project, SearchText, Connection).Take(1000)) { @if (type is NodeDev.Core.NodeProvider.MethodCallNode methodCallNode) diff --git a/src/NodeDev.Blazor/Components/ProjectExplorer.razor b/src/NodeDev.Blazor/Components/ProjectExplorer.razor index 269f6fa..dfff331 100644 --- a/src/NodeDev.Blazor/Components/ProjectExplorer.razor +++ b/src/NodeDev.Blazor/Components/ProjectExplorer.razor @@ -2,15 +2,17 @@ Project - + - @if (context.Type == TreeItemType.Folder) + @if (context.Value == null) + { } + else if (context.Value.Type == TreeItemType.Folder) { - + } - else if (context.Type == TreeItemType.Class) + else if (context.Value.Type == TreeItemType.Class) { - + } @@ -23,7 +25,8 @@ Folder, Class } - private record class TreeItem(string Name, HashSet? Children, TreeItemType Type, NodeDev.Core.Class.NodeClass? Class) + + private record class TreeItem(string Name, TreeItemType Type, NodeDev.Core.Class.NodeClass? Class) { public bool IsExpanded { get; set; } = true; } @@ -37,13 +40,15 @@ [Parameter] public EventCallback SelectedClassChanged { get; set; } - private HashSet Items { get; } = new(); + private TreeItem? Selected = null; + + private List> Items { get; } = new(); - private void OnSelectedItemChanged(TreeItem treeItem) + private void OnSelectedItemChanged() { - if (treeItem?.Type == TreeItemType.Class) + if (Selected?.Type == TreeItemType.Class) { - SelectedClass = treeItem.Class; + SelectedClass = Selected.Class; _ = SelectedClassChanged.InvokeAsync(SelectedClass); } else @@ -63,24 +68,31 @@ private void AddClass(NodeDev.Core.Class.NodeClass nodeClass) { - // find the the folder already exists in the tree + // find the folder that already exists in the tree var folders = nodeClass.Namespace.Split('.'); - TreeItem? folder = null; + TreeItemData? folder = null; for (int i = 0; i < folders.Length; ++i) { var parent = folder?.Children ?? Items; - folder = parent.FirstOrDefault(x => x.Name == folders[i] && x.Type == TreeItemType.Folder); + folder = parent.FirstOrDefault(x => x.Value?.Name == folders[i] && x.Value?.Type == TreeItemType.Folder); if (folder == null) { - folder = new TreeItem(folders[i], new(), TreeItemType.Folder, null); + folder = new TreeItemData() + { + Value = new(folders[i], TreeItemType.Folder, null), + Children = [] + }; parent.Add(folder); } } - if (folder == null) + if (folder?.Children == null) throw new Exception("Call cannot have no namespace ??"); - folder.Children?.Add(new(nodeClass.Name, null, TreeItemType.Class, nodeClass)); + folder.Children.Add(new() + { + Value = new(nodeClass.Name, TreeItemType.Class, nodeClass) + }); } } diff --git a/src/NodeDev.Blazor/Index.razor b/src/NodeDev.Blazor/Index.razor index e1c50e7..60a12f9 100644 --- a/src/NodeDev.Blazor/Index.razor +++ b/src/NodeDev.Blazor/Index.razor @@ -1,6 +1,7 @@ @inject Services.DebuggedPathService DebuggedPathService + diff --git a/src/NodeDev.Blazor/NodeDev.Blazor.csproj b/src/NodeDev.Blazor/NodeDev.Blazor.csproj index c22e2ec..9a54d6d 100644 --- a/src/NodeDev.Blazor/NodeDev.Blazor.csproj +++ b/src/NodeDev.Blazor/NodeDev.Blazor.csproj @@ -12,9 +12,9 @@ - - - + + +