From 94011e803b246b883e8cea93717f91488ff77b51 Mon Sep 17 00:00:00 2001 From: zHaytam Date: Thu, 31 Dec 2020 22:05:24 +0100 Subject: [PATCH 01/14] feat: nest groups (wip) --- .../Default/GroupingSubManager.cs | 48 +++++++++---------- src/Blazor.Diagrams.Core/DiagramManager.cs | 34 +++++++++---- src/Blazor.Diagrams.Core/Models/Core/Size.cs | 2 +- src/Blazor.Diagrams.Core/Models/GroupModel.cs | 37 ++++++++++---- .../Components/Groups/GroupContainer.razor.cs | 32 +++++++++++-- .../Components/Groups/GroupNodes.razor | 9 +++- 6 files changed, 113 insertions(+), 49 deletions(-) diff --git a/src/Blazor.Diagrams.Core/Default/GroupingSubManager.cs b/src/Blazor.Diagrams.Core/Default/GroupingSubManager.cs index 8e57c159..db4e423d 100644 --- a/src/Blazor.Diagrams.Core/Default/GroupingSubManager.cs +++ b/src/Blazor.Diagrams.Core/Default/GroupingSubManager.cs @@ -20,36 +20,36 @@ private void DiagramManager_KeyDown(KeyboardEventArgs e) if (DiagramManager.SelectedModels.Count == 0) return; - if (e.CtrlKey && e.AltKey && e.Key.Equals("g", StringComparison.InvariantCultureIgnoreCase)) - { - var selectedNodes = DiagramManager.SelectedModels - .Where(m => m is NodeModel) - .Select(m => (NodeModel)m) - .ToArray(); + if (!e.CtrlKey || !e.AltKey || !e.Key.Equals("g", StringComparison.InvariantCultureIgnoreCase)) + return; - var nodesWithGroup = selectedNodes.Where(n => n.Group != null).ToArray(); - if (nodesWithGroup.Length > 0) + var selectedNodes = DiagramManager.SelectedModels + .Where(m => m is NodeModel) + .Select(m => (NodeModel)m) + .ToArray(); + + var nodesWithGroup = selectedNodes.Where(n => n.Group != null).ToArray(); + if (nodesWithGroup.Length > 0) + { + // Ungroup + foreach (var group in nodesWithGroup.GroupBy(n => n.Group!).Select(g => g.Key)) { - // Ungroup - foreach (var group in nodesWithGroup.GroupBy(n => n.Group!).Select(g => g.Key)) - { - DiagramManager.Ungroup(group); - } + DiagramManager.Ungroup(group); } - else - { - // Group - if (selectedNodes.Length < 2) - return; + } + else + { + // Group + if (selectedNodes.Length < 2) + return; - if (selectedNodes.Any(n => n.Group != null)) - return; + if (selectedNodes.Any(n => n.Group != null)) + return; - if (selectedNodes.Select(n => n.Layer).Distinct().Count() > 1) - return; + if (selectedNodes.Select(n => n.Layer).Distinct().Count() > 1) + return; - DiagramManager.Group(selectedNodes); - } + DiagramManager.Group(selectedNodes); } } diff --git a/src/Blazor.Diagrams.Core/DiagramManager.cs b/src/Blazor.Diagrams.Core/DiagramManager.cs index 57c0eba4..1a4b6d31 100644 --- a/src/Blazor.Diagrams.Core/DiagramManager.cs +++ b/src/Blazor.Diagrams.Core/DiagramManager.cs @@ -174,26 +174,33 @@ public void RemoveLink(LinkModel link, bool triggerEvent = true) } } - public GroupModel Group(params NodeModel[] nodes) + public GroupModel Group(params NodeModel[] children) { - if (nodes.Length < 2) + if (children.Length < 2) throw new ArgumentException("Number of nodes must be >= 2"); - var layers = nodes.Select(n => n.Layer).Distinct(); + var layers = children.Select(n => n.Layer).Distinct(); if (layers.Count() > 1) throw new InvalidOperationException("Cannot group nodes with different layers"); if (layers.First() == RenderLayer.SVG) throw new InvalidOperationException("SVG groups aren't imeplemtend yet"); - if (nodes.Any(n => n.Group != null)) + if (children.Any(n => n.Group != null)) throw new InvalidOperationException("Cannot group nodes that already belong to another group"); - var group = new GroupModel(this, nodes); + var group = new GroupModel(this, children); - foreach (var node in nodes) + foreach (var child in children) { - _nodes.Remove(node); + if (child is GroupModel g) + { + _groups.Remove(g); + } + else + { + _nodes.Remove(child); + } } _groups.Add(group); @@ -209,8 +216,17 @@ public void Ungroup(GroupModel group) group.Ungroup(); - foreach (var node in group.Children) - _nodes.Add(node); + foreach (var child in group.Children) + { + if (child is GroupModel g) + { + _groups.Add(g); + } + else + { + _nodes.Add(child); + } + } GroupRemoved?.Invoke(group); Refresh(); diff --git a/src/Blazor.Diagrams.Core/Models/Core/Size.cs b/src/Blazor.Diagrams.Core/Models/Core/Size.cs index c90ac5dc..32559404 100644 --- a/src/Blazor.Diagrams.Core/Models/Core/Size.cs +++ b/src/Blazor.Diagrams.Core/Models/Core/Size.cs @@ -17,7 +17,7 @@ public Size(double width, double height) public Size Add(double value) => new Size(Width + value, Height + value); - public bool Equals(Size size) => size != null && Width == size.Width && Height == size.Height; + public bool Equals(Size? size) => size != null && Width == size.Width && Height == size.Height; public override string ToString() => $"Size(width={Width}, height={Height})"; } diff --git a/src/Blazor.Diagrams.Core/Models/GroupModel.cs b/src/Blazor.Diagrams.Core/Models/GroupModel.cs index 3ad2a52e..40474d5d 100644 --- a/src/Blazor.Diagrams.Core/Models/GroupModel.cs +++ b/src/Blazor.Diagrams.Core/Models/GroupModel.cs @@ -1,25 +1,28 @@ -using Blazor.Diagrams.Core.Models.Base; -using Blazor.Diagrams.Core.Models.Core; +using Blazor.Diagrams.Core.Models.Core; using System.Collections.Generic; using System.Linq; namespace Blazor.Diagrams.Core.Models { - public class GroupModel : MovableModel + public class GroupModel : NodeModel { private readonly DiagramManager _diagramManager; + private readonly byte _padding; + private readonly HashSet _allLinks; - public GroupModel(DiagramManager diagramManager, NodeModel[] children) + public GroupModel(DiagramManager diagramManager, NodeModel[] children, byte padding = 30) { _diagramManager = diagramManager; + _allLinks = new HashSet(); + _padding = padding; + + Size = Size.Zero; Children = children; Initialize(); } public NodeModel[] Children { get; private set; } - public Size Size { get; private set; } = Size.Zero; - - public IEnumerable AllLinks => Children.SelectMany(n => n.AllLinks).Distinct(); + public new IReadOnlyCollection AllLinks => _allLinks; public override void SetPosition(double x, double y) { @@ -33,6 +36,14 @@ public override void SetPosition(double x, double y) Refresh(); } + public override void UpdatePositionSilently(double deltaX, double deltaY) + { + base.UpdatePositionSilently(deltaX, deltaY); + + foreach (var child in Children) + child.UpdatePositionSilently(deltaX, deltaY); + } + public void Ungroup() { foreach (var node in Children) @@ -50,6 +61,14 @@ private void Initialize() node.Group = this; node.SizeChanged += OnNodeChanged; node.Moving += OnNodeChanged; + + foreach (var link in node.AllLinks) + { + if (link.SourcePort.Parent != node) + continue; + + _allLinks.Add(link); + } } UpdateDimensions(); @@ -67,8 +86,8 @@ private void UpdateDimensions() return; (var nodesMinX, var nodesMaxX, var nodesMinY, var nodesMaxY) = _diagramManager.GetNodesRect(Children); - Size = new Size(nodesMaxX - nodesMinX, nodesMaxY - nodesMinY); - Position = new Point(nodesMinX, nodesMinY); + Size = new Size(nodesMaxX - nodesMinX + _padding * 2, nodesMaxY - nodesMinY + _padding * 2); + Position = new Point(nodesMinX - _padding, nodesMinY - _padding); } } } diff --git a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs index 4d2f0d9b..49c83bfb 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs +++ b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs @@ -1,13 +1,18 @@ using Blazor.Diagrams.Core; using Blazor.Diagrams.Core.Models; +using Blazor.Diagrams.Core.Models.Core; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; using System; +using System.Diagnostics; namespace Blazor.Diagrams.Components.Groups { public partial class GroupContainer : IDisposable { + private readonly Stopwatch _stopwatch = new Stopwatch(); + private int _totalRenders = 0; + [Parameter] public GroupModel Group { get; set; } @@ -20,10 +25,10 @@ public partial class GroupContainer : IDisposable [CascadingParameter(Name = "DiagramManager")] public DiagramManager DiagramManager { get; set; } - public double X => Group.Position.X - Padding; - public double Y => Group.Position.Y - Padding; - public double Width => Group.Size.Width + Padding * 2; - public double Height => Group.Size.Height + Padding * 2; + public double X => Group.Position.X; + public double Y => Group.Position.Y; + public double Width => Group.Size.Width; + public double Height => Group.Size.Height; public void Dispose() { @@ -35,7 +40,24 @@ protected override void OnParametersSet() Group.Changed += OnGroupChanged; } - private void OnGroupChanged() => StateHasChanged(); // Todo: Use _shouldRender pattern + protected override bool ShouldRender() + { + _stopwatch.Start(); + return true; + } + + protected override void OnAfterRender(bool firstRender) + { + base.OnAfterRender(firstRender); + _totalRenders++; + Console.WriteLine($"Group: {Group.Id}, Render: #{_totalRenders}, Time: {_stopwatch.Elapsed.TotalMilliseconds}ms"); + _stopwatch.Reset(); + } + + private void OnGroupChanged() + { + StateHasChanged(); // Todo: Use _shouldRender pattern + } private void OnMouseDown(MouseEventArgs e) => DiagramManager.OnMouseDown(Group, e); diff --git a/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor b/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor index 3f104525..51e0600e 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor @@ -7,6 +7,13 @@ style="top: @((-GroupContainer.Y).ToInvariantString())px; left: @((-GroupContainer.X).ToInvariantString())px"> @foreach (var node in GroupContainer.Group.Children) { - + if (node is GroupModel g) + { + + } + else + { + + } } \ No newline at end of file From f41b37d47fc8d7e9c0408ca1cb4d774bce8edb7a Mon Sep 17 00:00:00 2001 From: zHaytam Date: Thu, 31 Dec 2020 22:07:01 +0100 Subject: [PATCH 02/14] fix: receiving same size in nodes OnResize triggers rerender --- src/Blazor.Diagrams.Core/Models/NodeModel.cs | 3 +++ src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Blazor.Diagrams.Core/Models/NodeModel.cs b/src/Blazor.Diagrams.Core/Models/NodeModel.cs index c0ea3357..38d92c14 100644 --- a/src/Blazor.Diagrams.Core/Models/NodeModel.cs +++ b/src/Blazor.Diagrams.Core/Models/NodeModel.cs @@ -31,6 +31,9 @@ public Size? Size get => _size; set { + if (value?.Equals(_size) == true) + return; + _size = value; SizeChanged?.Invoke(this); } diff --git a/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs b/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs index 5e0cdc4d..e508a01f 100644 --- a/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs +++ b/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs @@ -52,6 +52,9 @@ public void OnResize(Size size) if (Size.Zero.Equals(size)) return; + if (size.Equals(Node.Size)) + return; + Node.Size = size; Node.Refresh(); From c88f84e0015e6c785daa2ef24a21d84d7ad53edd Mon Sep 17 00:00:00 2001 From: zHaytam Date: Thu, 31 Dec 2020 22:07:47 +0100 Subject: [PATCH 03/14] fix: groups rendering doesn't use @key --- src/Blazor.Diagrams/Components/DiagramCanvas.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Blazor.Diagrams/Components/DiagramCanvas.razor b/src/Blazor.Diagrams/Components/DiagramCanvas.razor index 6216a701..e1a6b440 100644 --- a/src/Blazor.Diagrams/Components/DiagramCanvas.razor +++ b/src/Blazor.Diagrams/Components/DiagramCanvas.razor @@ -31,7 +31,7 @@ @foreach (var group in DiagramManager.Groups) { - + } @foreach (var node in DiagramManager.Nodes.Where(n => n.Layer == RenderLayer.HTML)) From 0736fe49458fa3b05964286cca8995fa90f8ca86 Mon Sep 17 00:00:00 2001 From: zHaytam Date: Thu, 31 Dec 2020 22:11:34 +0100 Subject: [PATCH 04/14] refactor: use shouldRender pattern --- .../Components/Groups/GroupContainer.razor.cs | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs index 49c83bfb..fc6f3b4e 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs +++ b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs @@ -1,17 +1,14 @@ using Blazor.Diagrams.Core; using Blazor.Diagrams.Core.Models; -using Blazor.Diagrams.Core.Models.Core; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; using System; -using System.Diagnostics; namespace Blazor.Diagrams.Components.Groups { public partial class GroupContainer : IDisposable { - private readonly Stopwatch _stopwatch = new Stopwatch(); - private int _totalRenders = 0; + private bool _shouldRender = true; [Parameter] public GroupModel Group { get; set; } @@ -42,21 +39,19 @@ protected override void OnParametersSet() protected override bool ShouldRender() { - _stopwatch.Start(); - return true; - } + if (_shouldRender) + { + _shouldRender = false; + return true; + } - protected override void OnAfterRender(bool firstRender) - { - base.OnAfterRender(firstRender); - _totalRenders++; - Console.WriteLine($"Group: {Group.Id}, Render: #{_totalRenders}, Time: {_stopwatch.Elapsed.TotalMilliseconds}ms"); - _stopwatch.Reset(); + return false; } private void OnGroupChanged() { - StateHasChanged(); // Todo: Use _shouldRender pattern + _shouldRender = true; + StateHasChanged(); } private void OnMouseDown(MouseEventArgs e) => DiagramManager.OnMouseDown(Group, e); From 29bbfa37d01fe559577f7cca784601488bf10d00 Mon Sep 17 00:00:00 2001 From: zHaytam Date: Fri, 1 Jan 2021 22:21:53 +0100 Subject: [PATCH 05/14] refactor: move Padding to GroupModel to calculate accurate size --- src/Blazor.Diagrams.Core/Models/GroupModel.cs | 29 +++++++------------ .../Groups/DefaultGroupWidget.razor | 2 +- .../Components/Groups/GroupContainer.razor.cs | 3 -- .../Components/Groups/GroupLinks.razor | 2 +- 4 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/Blazor.Diagrams.Core/Models/GroupModel.cs b/src/Blazor.Diagrams.Core/Models/GroupModel.cs index 40474d5d..5841856c 100644 --- a/src/Blazor.Diagrams.Core/Models/GroupModel.cs +++ b/src/Blazor.Diagrams.Core/Models/GroupModel.cs @@ -1,4 +1,5 @@ using Blazor.Diagrams.Core.Models.Core; +using System; using System.Collections.Generic; using System.Linq; @@ -8,12 +9,10 @@ public class GroupModel : NodeModel { private readonly DiagramManager _diagramManager; private readonly byte _padding; - private readonly HashSet _allLinks; public GroupModel(DiagramManager diagramManager, NodeModel[] children, byte padding = 30) { _diagramManager = diagramManager; - _allLinks = new HashSet(); _padding = padding; Size = Size.Zero; @@ -22,7 +21,7 @@ public GroupModel(DiagramManager diagramManager, NodeModel[] children, byte padd } public NodeModel[] Children { get; private set; } - public new IReadOnlyCollection AllLinks => _allLinks; + public IEnumerable HandledLinks => Group != null ? Array.Empty() : Children.SelectMany(c => c.AllLinks).Distinct(); public override void SetPosition(double x, double y) { @@ -46,29 +45,21 @@ public override void UpdatePositionSilently(double deltaX, double deltaY) public void Ungroup() { - foreach (var node in Children) + foreach (var child in Children) { - node.Group = null; - node.SizeChanged -= OnNodeChanged; - node.Moving -= OnNodeChanged; + child.Group = null; + child.SizeChanged -= OnNodeChanged; + child.Moving -= OnNodeChanged; } } private void Initialize() { - foreach (var node in Children) + foreach (var child in Children) { - node.Group = this; - node.SizeChanged += OnNodeChanged; - node.Moving += OnNodeChanged; - - foreach (var link in node.AllLinks) - { - if (link.SourcePort.Parent != node) - continue; - - _allLinks.Add(link); - } + child.Group = this; + child.SizeChanged += OnNodeChanged; + child.Moving += OnNodeChanged; } UpdateDimensions(); diff --git a/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor b/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor index f428a845..6b8875d5 100644 --- a/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor +++ b/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor @@ -3,7 +3,7 @@ public GroupModel Group { get; set; } } - + \ No newline at end of file diff --git a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs index fc6f3b4e..ef0e19ee 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs +++ b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs @@ -13,9 +13,6 @@ public partial class GroupContainer : IDisposable [Parameter] public GroupModel Group { get; set; } - [Parameter] - public ushort Padding { get; set; } - [Parameter] public RenderFragment ChildContent { get; set; } diff --git a/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor b/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor index 611ef3be..95843cb0 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor @@ -5,7 +5,7 @@ - @foreach (var link in GroupContainer.Group.AllLinks) + @foreach (var link in GroupContainer.Group.HandledLinks) { } From f8eb14b5d9241f5bb99fa01b2cd3e7ec28156c2e Mon Sep 17 00:00:00 2001 From: zHaytam Date: Fri, 1 Jan 2021 22:25:41 +0100 Subject: [PATCH 06/14] refactor: cascade Group to GroupLinks/Nodes instead of container --- src/Blazor.Diagrams/Components/Groups/GroupContainer.razor | 2 +- .../Components/Groups/GroupContainer.razor.cs | 5 ----- src/Blazor.Diagrams/Components/Groups/GroupLinks.razor | 6 +++--- src/Blazor.Diagrams/Components/Groups/GroupNodes.razor | 6 +++--- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor index 3b0bc2fd..231ed4d8 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor @@ -4,7 +4,7 @@ @onmousedown:stopPropagation @onmouseup="OnMouseUp" @onmouseup:stopPropagation> - + @ChildContent \ No newline at end of file diff --git a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs index ef0e19ee..122fbc51 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs +++ b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs @@ -19,11 +19,6 @@ public partial class GroupContainer : IDisposable [CascadingParameter(Name = "DiagramManager")] public DiagramManager DiagramManager { get; set; } - public double X => Group.Position.X; - public double Y => Group.Position.Y; - public double Width => Group.Size.Width; - public double Height => Group.Size.Height; - public void Dispose() { Group.Changed -= OnGroupChanged; diff --git a/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor b/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor index 95843cb0..d4129b7b 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor @@ -1,11 +1,11 @@ @code { [CascadingParameter] - public GroupContainer GroupContainer { get; set; } + public GroupModel Group { get; set; } } - @foreach (var link in GroupContainer.Group.HandledLinks) + style="top: @((-Group.Position.Y).ToInvariantString())px; left: @((-Group.Position.X).ToInvariantString())px"> + @foreach (var link in Group.Group.HandledLinks) { } diff --git a/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor b/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor index 51e0600e..67dddb1a 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor @@ -1,11 +1,11 @@ @code { [CascadingParameter] - public GroupContainer GroupContainer { get; set; } + public GroupModel Group { get; set; } }
- @foreach (var node in GroupContainer.Group.Children) + style="top: @((-Group.Position.Y).ToInvariantString())px; left: @((-Group.Position.X).ToInvariantString())px"> + @foreach (var node in Group.Group.Children) { if (node is GroupModel g) { From f511a5553846b7cb6660c4ea5a51ba9663441761 Mon Sep 17 00:00:00 2001 From: zHaytam Date: Fri, 1 Jan 2021 22:27:26 +0100 Subject: [PATCH 07/14] fix --- src/Blazor.Diagrams/Components/Groups/GroupContainer.razor | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor index 231ed4d8..706e3699 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor @@ -1,5 +1,6 @@ 
Date: Fri, 1 Jan 2021 22:44:11 +0100 Subject: [PATCH 08/14] temporary fix --- src/Blazor.Diagrams.Core/DiagramManager.cs | 13 ++++++++++++- src/Blazor.Diagrams.Core/Models/GroupModel.cs | 3 +-- .../Components/Groups/GroupLinks.razor | 2 +- .../Components/Groups/GroupNodes.razor | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Blazor.Diagrams.Core/DiagramManager.cs b/src/Blazor.Diagrams.Core/DiagramManager.cs index 1a4b6d31..448ff609 100644 --- a/src/Blazor.Diagrams.Core/DiagramManager.cs +++ b/src/Blazor.Diagrams.Core/DiagramManager.cs @@ -140,6 +140,10 @@ public T AddLink(T link, PortModel source, PortModel? target = null) where T source.Refresh(); target?.Refresh(); + + source.Parent.Group?.Refresh(); + target?.Parent.Group?.Refresh(); + LinkAdded?.Invoke(link); Changed?.Invoke(); return link; @@ -156,6 +160,10 @@ public void AttachLink(LinkModel link, PortModel targetPort) link.SetTargetPort(targetPort); link.Refresh(); targetPort.Refresh(); + + link.SourcePort.Parent.Group?.Refresh(); + targetPort?.Parent.Group?.Refresh(); + LinkAttached?.Invoke(link); } @@ -168,6 +176,9 @@ public void RemoveLink(LinkModel link, bool triggerEvent = true) link.SourcePort.Refresh(); link.TargetPort?.Refresh(); + link.SourcePort.Parent.Group?.Refresh(); + link.TargetPort?.Parent.Group?.Refresh(); + if (triggerEvent) { Changed?.Invoke(); @@ -311,7 +322,7 @@ public void RegisterModelComponent(Type modelType, Type componentType) } public void Refresh() => Changed?.Invoke(); - + public void ZoomToFit(double margin = 10) { if (_nodes.Count == 0) diff --git a/src/Blazor.Diagrams.Core/Models/GroupModel.cs b/src/Blazor.Diagrams.Core/Models/GroupModel.cs index 5841856c..06693d27 100644 --- a/src/Blazor.Diagrams.Core/Models/GroupModel.cs +++ b/src/Blazor.Diagrams.Core/Models/GroupModel.cs @@ -1,5 +1,4 @@ using Blazor.Diagrams.Core.Models.Core; -using System; using System.Collections.Generic; using System.Linq; @@ -21,7 +20,7 @@ public GroupModel(DiagramManager diagramManager, NodeModel[] children, byte padd } public NodeModel[] Children { get; private set; } - public IEnumerable HandledLinks => Group != null ? Array.Empty() : Children.SelectMany(c => c.AllLinks).Distinct(); + public IEnumerable HandledLinks => Children.SelectMany(c => c.AllLinks).Distinct(); public override void SetPosition(double x, double y) { diff --git a/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor b/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor index d4129b7b..7f68cbdd 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupLinks.razor @@ -5,7 +5,7 @@ - @foreach (var link in Group.Group.HandledLinks) + @foreach (var link in Group.HandledLinks) { } diff --git a/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor b/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor index 67dddb1a..e1a5f0ec 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupNodes.razor @@ -5,7 +5,7 @@
- @foreach (var node in Group.Group.Children) + @foreach (var node in Group.Children) { if (node is GroupModel g) { From edc7dcbd9162b720048dfe6619049ee91390aa7e Mon Sep 17 00:00:00 2001 From: zHaytam Date: Sat, 2 Jan 2021 12:23:15 +0100 Subject: [PATCH 09/14] feat: add Class parameter to GroupContainer --- .../Components/Groups/DefaultGroupWidget.razor | 2 +- src/Blazor.Diagrams/Components/Groups/GroupContainer.razor | 2 +- src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs | 3 +++ src/Blazor.Diagrams/wwwroot/default.styles.css | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor b/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor index 6b8875d5..68106caf 100644 --- a/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor +++ b/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor @@ -3,7 +3,7 @@ public GroupModel Group { get; set; } } - + \ No newline at end of file diff --git a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor index 706e3699..cff326be 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor +++ b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor @@ -1,4 +1,4 @@ -
Date: Sun, 3 Jan 2021 23:36:44 +0100 Subject: [PATCH 10/14] perf: remove the need to rerender ports in more than 80% of use cases! Use cases such as: - Fetching the port's position/size: this caused 2 rerenders, now it only does 1. - Node moving: rerenders all the ports every mouse move, now it doesn't at all! It only rerenders the links, since the ports positions in realtime --- src/Blazor.Diagrams.Core/Models/NodeModel.cs | 18 ++++----- src/Blazor.Diagrams.Core/Models/PortModel.cs | 4 +- .../Components/Renderers/NodeRenderer.cs | 2 +- .../Renderers/PortRenderer.razor.cs | 40 +++++++++++++------ 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/Blazor.Diagrams.Core/Models/NodeModel.cs b/src/Blazor.Diagrams.Core/Models/NodeModel.cs index 38d92c14..6f7d4f4d 100644 --- a/src/Blazor.Diagrams.Core/Models/NodeModel.cs +++ b/src/Blazor.Diagrams.Core/Models/NodeModel.cs @@ -70,13 +70,8 @@ public override void SetPosition(double x, double y) var deltaY = y - Position.Y; base.SetPosition(x, y); - // Save some JS calls and update ports directly here - foreach (var port in _ports) - { - port.Position = new Point(port.Position.X + deltaX, port.Position.Y + deltaY); - } - - RefreshAll(); + UpdatePortPositions(deltaX, deltaY); + Refresh(); Moving?.Invoke(this); } @@ -84,13 +79,18 @@ public virtual void UpdatePositionSilently(double deltaX, double deltaY) { base.SetPosition(Position.X + deltaX, Position.Y + deltaY); + UpdatePortPositions(deltaX, deltaY); + Refresh(); + } + + private void UpdatePortPositions(double deltaX, double deltaY) + { // Save some JS calls and update ports directly here foreach (var port in _ports) { port.Position = new Point(port.Position.X + deltaX, port.Position.Y + deltaY); + port.RefreshLinks(); } - - RefreshAll(); } } } \ No newline at end of file diff --git a/src/Blazor.Diagrams.Core/Models/PortModel.cs b/src/Blazor.Diagrams.Core/Models/PortModel.cs index 3ec7fe1d..06b5c5c9 100644 --- a/src/Blazor.Diagrams.Core/Models/PortModel.cs +++ b/src/Blazor.Diagrams.Core/Models/PortModel.cs @@ -37,9 +37,11 @@ public PortModel(string id, NodeModel parent, PortAlignment alignment = PortAlig public void RefreshAll() { Refresh(); - _links.ForEach(l => l.Refresh()); + RefreshLinks(); } + public void RefreshLinks() => _links.ForEach(l => l.Refresh()); + public T GetParent() where T : NodeModel => (T)Parent; public virtual bool CanAttachTo(PortModel port) => port != this && !port.Locked && Parent != port.Parent; diff --git a/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs b/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs index e508a01f..68594fd4 100644 --- a/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs +++ b/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs @@ -61,7 +61,7 @@ public void OnResize(Size size) foreach (var port in Node.Ports) { port.Initialized = false; - port.RefreshAll(); + port.Refresh(); } } diff --git a/src/Blazor.Diagrams/Components/Renderers/PortRenderer.razor.cs b/src/Blazor.Diagrams/Components/Renderers/PortRenderer.razor.cs index 3270d1bd..eb8fa9d9 100644 --- a/src/Blazor.Diagrams/Components/Renderers/PortRenderer.razor.cs +++ b/src/Blazor.Diagrams/Components/Renderers/PortRenderer.razor.cs @@ -51,15 +51,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) if (!Port.Initialized || firstRender) { - var zoom = DiagramManager.Zoom; - var pan = DiagramManager.Pan; - var rect = await JSRuntime.GetBoundingClientRect(_element); - - Port.Size = new Size(rect.Width / zoom, rect.Height / zoom); - Port.Position = new Point((rect.Left - DiagramManager.Container.Left - pan.X) / zoom, - (rect.Top - DiagramManager.Container.Top - pan.Y) / zoom); - Port.Initialized = true; - Port.RefreshAll(); + await UpdateDimensions(); } } @@ -67,10 +59,34 @@ protected override async Task OnAfterRenderAsync(bool firstRender) protected virtual void OnMouseUp(MouseEventArgs e) => DiagramManager.OnMouseUp(Port, e); - private void OnPortChanged() + private async Task UpdateDimensions() { - _shouldRender = true; - StateHasChanged(); + var zoom = DiagramManager.Zoom; + var pan = DiagramManager.Pan; + var rect = await JSRuntime.GetBoundingClientRect(_element); + + Port.Size = new Size(rect.Width / zoom, rect.Height / zoom); + Port.Position = new Point((rect.Left - DiagramManager.Container.Left - pan.X) / zoom, + (rect.Top - DiagramManager.Container.Top - pan.Y) / zoom); + + Port.Initialized = true; + + // We don't really need to refresh the port again, + // let's just refresh the links so that they use the new port's position + Port.RefreshLinks(); + } + + private async void OnPortChanged() + { + if (Port.Initialized) + { + _shouldRender = true; + StateHasChanged(); + } + else + { + await UpdateDimensions(); + } } } } From 461065872bfacb2fd4ddb44c6b6f3eb8a13e47da Mon Sep 17 00:00:00 2001 From: zHaytam Date: Mon, 4 Jan 2021 17:41:47 +0100 Subject: [PATCH 11/14] feat: group ports --- samples/SharedDemo/Demos/Grouping.razor.cs | 11 +++++++--- src/Blazor.Diagrams.Core/DiagramManager.cs | 2 +- src/Blazor.Diagrams.Core/Models/GroupModel.cs | 12 +++++++---- src/Blazor.Diagrams.Core/Models/NodeModel.cs | 9 +++++++++ .../Groups/DefaultGroupWidget.razor | 5 +++++ .../Components/Groups/GroupContainer.razor.cs | 19 +++++++++++++++++- .../Components/Renderers/NodeRenderer.cs | 7 +------ .../wwwroot/default.styles.css | 20 +++++++++---------- 8 files changed, 60 insertions(+), 25 deletions(-) diff --git a/samples/SharedDemo/Demos/Grouping.razor.cs b/samples/SharedDemo/Demos/Grouping.razor.cs index 0c3852cf..770a4f21 100644 --- a/samples/SharedDemo/Demos/Grouping.razor.cs +++ b/samples/SharedDemo/Demos/Grouping.razor.cs @@ -18,11 +18,16 @@ protected override void OnInitialized() var node1 = NewNode(50, 50); var node2 = NewNode(250, 250); - var node3 = NewNode(450, 100); + var node3 = NewNode(500, 100); + + var group = diagramManager.Group(node1, node2); + group.AddPort(PortAlignment.Bottom); + group.AddPort(PortAlignment.Top); + group.AddPort(PortAlignment.Left); + group.AddPort(PortAlignment.Right); diagramManager.AddLink(node1.GetPort(PortAlignment.Right), node2.GetPort(PortAlignment.Left)); - diagramManager.AddLink(node2.GetPort(PortAlignment.Right), node3.GetPort(PortAlignment.Left)); - diagramManager.Group(node1, node2); + diagramManager.AddLink(group.GetPort(PortAlignment.Right), node3.GetPort(PortAlignment.Left)); diagramManager.AddNode(node3); } diff --git a/src/Blazor.Diagrams.Core/DiagramManager.cs b/src/Blazor.Diagrams.Core/DiagramManager.cs index 448ff609..ad09b620 100644 --- a/src/Blazor.Diagrams.Core/DiagramManager.cs +++ b/src/Blazor.Diagrams.Core/DiagramManager.cs @@ -60,7 +60,7 @@ public DiagramManager(DiagramOptions? options = null) } public IReadOnlyCollection Nodes => _nodes; - public IEnumerable AllLinks => _nodes.SelectMany(n => n.AllLinks).Distinct(); + public IEnumerable AllLinks => _nodes.SelectMany(n => n.AllLinks).Union(_groups.SelectMany(g => g.AllLinks)).Distinct(); public IReadOnlyCollection SelectedModels => _selectedModels; public IReadOnlyCollection Groups => _groups; public Rectangle? Container { get; internal set; } diff --git a/src/Blazor.Diagrams.Core/Models/GroupModel.cs b/src/Blazor.Diagrams.Core/Models/GroupModel.cs index 06693d27..a7e70985 100644 --- a/src/Blazor.Diagrams.Core/Models/GroupModel.cs +++ b/src/Blazor.Diagrams.Core/Models/GroupModel.cs @@ -1,4 +1,5 @@ using Blazor.Diagrams.Core.Models.Core; +using System; using System.Collections.Generic; using System.Linq; @@ -66,18 +67,21 @@ private void Initialize() private void OnNodeChanged(NodeModel node) { - UpdateDimensions(); - Refresh(); + if (UpdateDimensions()) + { + Refresh(); + } } - private void UpdateDimensions() + private bool UpdateDimensions() { if (Children.Any(n => n.Size == null)) - return; + return false; (var nodesMinX, var nodesMaxX, var nodesMinY, var nodesMaxY) = _diagramManager.GetNodesRect(Children); Size = new Size(nodesMaxX - nodesMinX + _padding * 2, nodesMaxY - nodesMinY + _padding * 2); Position = new Point(nodesMinX - _padding, nodesMinY - _padding); + return true; } } } diff --git a/src/Blazor.Diagrams.Core/Models/NodeModel.cs b/src/Blazor.Diagrams.Core/Models/NodeModel.cs index 6f7d4f4d..38aeb9fa 100644 --- a/src/Blazor.Diagrams.Core/Models/NodeModel.cs +++ b/src/Blazor.Diagrams.Core/Models/NodeModel.cs @@ -62,6 +62,15 @@ public void RefreshAll() _ports.ForEach(p => p.RefreshAll()); } + public void ReinitializePorts() + { + foreach (var port in Ports) + { + port.Initialized = false; + port.Refresh(); + } + } + public bool RemovePort(PortModel port) => _ports.Remove(port); public override void SetPosition(double x, double y) diff --git a/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor b/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor index 68106caf..11f833dd 100644 --- a/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor +++ b/src/Blazor.Diagrams/Components/Groups/DefaultGroupWidget.razor @@ -6,4 +6,9 @@ + + @foreach (var port in Group.Ports) + { + + } \ No newline at end of file diff --git a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs index 01204ca3..6b1609a1 100644 --- a/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs +++ b/src/Blazor.Diagrams/Components/Groups/GroupContainer.razor.cs @@ -1,5 +1,6 @@ using Blazor.Diagrams.Core; using Blazor.Diagrams.Core.Models; +using Blazor.Diagrams.Core.Models.Core; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; using System; @@ -9,6 +10,7 @@ namespace Blazor.Diagrams.Components.Groups public partial class GroupContainer : IDisposable { private bool _shouldRender = true; + private Size _lastSize; [Parameter] public GroupModel Group { get; set; } @@ -27,7 +29,7 @@ public void Dispose() Group.Changed -= OnGroupChanged; } - protected override void OnParametersSet() + protected override void OnInitialized() { Group.Changed += OnGroupChanged; } @@ -43,6 +45,21 @@ protected override bool ShouldRender() return false; } + protected override void OnAfterRender(bool firstRender) + { + if (Size.Zero.Equals(Group.Size)) + return; + + // Update the port positions (and links) when the size of the group changes + // This will save us some JS trips as well as useless rerenders + + if (_lastSize == null || !_lastSize.Equals(Group.Size)) + { + Group.ReinitializePorts(); + _lastSize = Group.Size; + } + } + private void OnGroupChanged() { _shouldRender = true; diff --git a/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs b/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs index 68594fd4..5f5c3869 100644 --- a/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs +++ b/src/Blazor.Diagrams/Components/Renderers/NodeRenderer.cs @@ -57,12 +57,7 @@ public void OnResize(Size size) Node.Size = size; Node.Refresh(); - - foreach (var port in Node.Ports) - { - port.Initialized = false; - port.Refresh(); - } + Node.ReinitializePorts(); } protected override void OnInitialized() diff --git a/src/Blazor.Diagrams/wwwroot/default.styles.css b/src/Blazor.Diagrams/wwwroot/default.styles.css index 0167dccf..df471b9e 100644 --- a/src/Blazor.Diagrams/wwwroot/default.styles.css +++ b/src/Blazor.Diagrams/wwwroot/default.styles.css @@ -19,7 +19,7 @@ border: 1px solid #6e9fd4; } - .default-node .port { + .default-node .port, .default.group .port { width: 20px; height: 20px; margin: -10px; @@ -30,46 +30,46 @@ position: absolute; } - .default-node .port:hover, .default-node .port.has-links { + .default-node .port:hover, .default-node .port.has-links, .default.group .port.has-links { background-color: black; } - .default-node .port.bottom { + .default-node .port.bottom, .default.group .port.bottom { bottom: 0px; left: 50%; } - .default-node .port.bottomleft { + .default-node .port.bottomleft, .default.group .port.bottomleft { bottom: 0px; left: 0px; } - .default-node .port.bottomright { + .default-node .port.bottomright, .default.group .port.bottomright { bottom: 0px; right: 0px; } - .default-node .port.top { + .default-node .port.top, .default.group .port.top { top: 0px; left: 50%; } - .default-node .port.topleft { + .default-node .port.topleft, .default.group .port.topleft { top: 0px; left: 0px; } - .default-node .port.topright { + .default-node .port.topright, .default.group .port.topright { top: 0px; right: 0px; } - .default-node .port.left { + .default-node .port.left, .default.group .port.left { left: 0px; top: 50%; } - .default-node .port.right { + .default-node .port.right, .default.group .port.right { right: 0px; top: 50%; } From 311fce7a2ed4778743466efbdc9db3489b2aeb2f Mon Sep 17 00:00:00 2001 From: zHaytam Date: Mon, 4 Jan 2021 18:06:13 +0100 Subject: [PATCH 12/14] feat: show groups in Navigator --- .../Components/Navigator.razor | 30 +++++++++++++++++++ .../Components/Navigator.razor.cs | 29 +++++++++++------- src/Blazor.Diagrams/_Imports.razor | 3 +- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/src/Blazor.Diagrams/Components/Navigator.razor b/src/Blazor.Diagrams/Components/Navigator.razor index e50903f8..af6465f7 100644 --- a/src/Blazor.Diagrams/Components/Navigator.razor +++ b/src/Blazor.Diagrams/Components/Navigator.razor @@ -31,6 +31,36 @@ height="@height.ToInvariantString()"> } + + @foreach (var group in DiagramManager.Groups.Where(g => !Size.Zero.Equals(g.Size))) + { + var left = (Math.Max(0, group.Position.X * DiagramManager.Zoom) + addedNodeX) * XFactor; + var top = (Math.Max(0, group.Position.Y * DiagramManager.Zoom) + addedNodeY) * YFactor; + var width = group.Size.Width * DiagramManager.Zoom * XFactor; + var height = group.Size.Height * DiagramManager.Zoom * YFactor; + + + + + + @foreach (var child in group.Children) + { + var childLeft = (Math.Max(0, child.Position.X * DiagramManager.Zoom) + addedNodeX) * XFactor; + var childTop = (Math.Max(0, child.Position.Y * DiagramManager.Zoom) + addedNodeY) * YFactor; + var childWidth = child.Size.Width * DiagramManager.Zoom * XFactor; + var childHeight = child.Size.Height * DiagramManager.Zoom * YFactor; + + + + + } + }
} diff --git a/src/Blazor.Diagrams/Components/Navigator.razor.cs b/src/Blazor.Diagrams/Components/Navigator.razor.cs index 043bb37f..d87010d3 100644 --- a/src/Blazor.Diagrams/Components/Navigator.razor.cs +++ b/src/Blazor.Diagrams/Components/Navigator.razor.cs @@ -1,5 +1,6 @@ using Blazor.Diagrams.Core; using Blazor.Diagrams.Core.Models; +using Blazor.Diagrams.Core.Models.Core; using Microsoft.AspNetCore.Components; using System; using System.Linq; @@ -29,30 +30,34 @@ protected override void OnParametersSet() base.OnParametersSet(); foreach (var node in DiagramManager.Nodes) - node.Changed += Node_Changed; + node.Changed += Refresh; + + foreach (var group in DiagramManager.Groups) + group.Changed += Refresh; DiagramManager.Changed += DiagramManager_Changed; DiagramManager.NodeAdded += DiagramManager_NodeAdded; DiagramManager.NodeRemoved += DiagramManager_NodeRemoved; + DiagramManager.GroupAdded += DiagramManager_GroupAdded; + DiagramManager.GroupRemoved += DiagramManager_GroupRemoved; } private void DiagramManager_Changed() => Refresh(); - private void DiagramManager_NodeAdded(NodeModel node) - { - node.Changed += Node_Changed; - } + private void DiagramManager_NodeAdded(NodeModel node) => node.Changed += Refresh; - private void Node_Changed() => Refresh(); + private void DiagramManager_NodeRemoved(NodeModel node) => node.Changed -= Refresh; - private void DiagramManager_NodeRemoved(NodeModel node) - { - node.Changed -= Node_Changed; - } + private void DiagramManager_GroupAdded(GroupModel group) => group.Changed += Refresh; + + private void DiagramManager_GroupRemoved(GroupModel group) => group.Changed -= Refresh; private void Refresh() { - var nodes = DiagramManager.Nodes.Where(n => n.Size != null).ToList(); + var nodes = DiagramManager.Nodes + .Union(DiagramManager.Groups) + .Where(n => n.Size?.Equals(Size.Zero) == false).ToList(); + if (nodes.Count == 0) return; @@ -181,6 +186,8 @@ public void Dispose() DiagramManager.Changed -= DiagramManager_Changed; DiagramManager.NodeAdded -= DiagramManager_NodeAdded; DiagramManager.NodeRemoved -= DiagramManager_NodeRemoved; + + // Todo: unregister node/group changed events } } } \ No newline at end of file diff --git a/src/Blazor.Diagrams/_Imports.razor b/src/Blazor.Diagrams/_Imports.razor index ad8ea3da..041dae76 100644 --- a/src/Blazor.Diagrams/_Imports.razor +++ b/src/Blazor.Diagrams/_Imports.razor @@ -2,4 +2,5 @@ @using Blazor.Diagrams.Core; @using Blazor.Diagrams.Core.Extensions; @using Blazor.Diagrams.Core.Models; -@using Blazor.Diagrams.Components.Renderers \ No newline at end of file +@using Blazor.Diagrams.Components.Renderers +@using Blazor.Diagrams.Core.Models.Core; \ No newline at end of file From 238fa622d109f6828b54baa5745b3af7fe8cbc5a Mon Sep 17 00:00:00 2001 From: zHaytam Date: Tue, 5 Jan 2021 14:00:06 +0100 Subject: [PATCH 13/14] Update Versions, CHANGELOG & README --- CHANGELOG.md | 22 +++++++++++++++++++ README.md | 3 ++- .../Blazor.Diagrams.Core.csproj | 6 ++--- src/Blazor.Diagrams/Blazor.Diagrams.csproj | 6 ++--- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23a6c92a..4c8b7e5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Diagrams [1.5.0] - 2021-01-05 + +## Added + +- The ability to have ports on groups. +- **EXPERIMENTAL/INCOMPLETE** Nested groups. Since `GroupModel` now inherits `NodeMode`, it became possible to have nested groups, but there are still problems with the order of links between groups. +- A `Class` parameter to `GroupContainer`. + +## Changed + +- Only rerender groups when necessary. +- Receiving the same size from `ResizeObserver` doesn't trigger a rerender anymore. +- Avoid rerendering ports twice to update positions. +- Avoid rerendering ports when their parent node is moving. +- Padding is now handled in `GroupModel` instead of `GroupContainer` (UI). This is because the padding is necessary to have accurate size/position in the group model directly. + +## Fixed + +- Use `@key` when rendering the list of groups. Not using it caused big/weird render times. +- Groups not showing in Navigator/Overview. + + ## Diagrams [1.4.2] - 2020-12-30 ## Added diff --git a/README.md b/README.md index 52019b62..3b07d614 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,8 @@ You can get started very easily & quickly using: - Customizable Diagram Overview/Preview/Navigator (on the bottom right by default) - Snap to Grid - Grouping: [CTRL + ALT + G] to (un)group -- Clipping: only draw nodes that are visible to the users +- Groups with ports/links and nested groups (**experimental**) +- Virtualization: only draw nodes that are visible to the users - Algorithms ## Preview diff --git a/src/Blazor.Diagrams.Core/Blazor.Diagrams.Core.csproj b/src/Blazor.Diagrams.Core/Blazor.Diagrams.Core.csproj index 7d51a688..93d5abe8 100644 --- a/src/Blazor.Diagrams.Core/Blazor.Diagrams.Core.csproj +++ b/src/Blazor.Diagrams.Core/Blazor.Diagrams.Core.csproj @@ -7,10 +7,10 @@ MIT zHaytam A fully customizable and extensible all-purpose diagrams library for Blazor - 1.4.2 - 1.4.2 + 1.5.0 + 1.5.0 https://github.com/zHaytam/Blazor.Diagrams - 1.4.2 + 1.5.0 Z.Blazor.Diagrams.Core blazor diagrams diagramming svg drag Z.Blazor.Diagrams.Core diff --git a/src/Blazor.Diagrams/Blazor.Diagrams.csproj b/src/Blazor.Diagrams/Blazor.Diagrams.csproj index 2b4bf204..286c057f 100644 --- a/src/Blazor.Diagrams/Blazor.Diagrams.csproj +++ b/src/Blazor.Diagrams/Blazor.Diagrams.csproj @@ -5,11 +5,11 @@ 3.0 zHaytam MIT - 1.4.2 - 1.4.2 + 1.5.0 + 1.5.0 https://github.com/zHaytam/Blazor.Diagrams A fully customizable and extensible all-purpose diagrams library for Blazor - 1.4.2 + 1.5.0 true blazor diagrams diagramming svg drag Z.Blazor.Diagrams From f0f1d3bbe6a5a3694f8986abb135698321a93688 Mon Sep 17 00:00:00 2001 From: zHaytam Date: Tue, 5 Jan 2021 14:18:03 +0100 Subject: [PATCH 14/14] Update CHANGELOG.md --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c8b7e5d..6a1dae76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Use `@key` when rendering the list of groups. Not using it caused big/weird render times. - Groups not showing in Navigator/Overview. - ## Diagrams [1.4.2] - 2020-12-30 ## Added