diff --git a/src/Blazor.Diagrams.Core/Models/Base/BaseLinkModel.cs b/src/Blazor.Diagrams.Core/Models/Base/BaseLinkModel.cs index 26a28dae..f6fe5e47 100644 --- a/src/Blazor.Diagrams.Core/Models/Base/BaseLinkModel.cs +++ b/src/Blazor.Diagrams.Core/Models/Base/BaseLinkModel.cs @@ -14,6 +14,8 @@ public abstract class BaseLinkModel : SelectableModel, IHasBounds, ILinkable public event Action? SourceChanged; public event Action? TargetChanged; public event Action? TargetAttached; + public event Action? VertexAdded; + public event Action? VertexRemoved; protected BaseLinkModel(Anchor source, Anchor target) { @@ -38,6 +40,7 @@ protected BaseLinkModel(string id, Anchor source, Anchor target) : base(id) public LinkMarker? SourceMarker { get; set; } public LinkMarker? TargetMarker { get; set; } public bool Segmentable { get; set; } = false; + public bool DoubleClickToSegment { get; set; } = false; public List Vertices { get; } = new(); public List Labels { get; } = new(); public IReadOnlyList Links => _links; @@ -67,9 +70,27 @@ public LinkVertexModel AddVertex(Point? position = null) { var vertex = new LinkVertexModel(this, position); Vertices.Add(vertex); + VertexAdded?.Invoke(this, vertex); + Refresh(); return vertex; } + public LinkVertexModel InsertVertex(Point? position, int index) + { + var vex = new LinkVertexModel(this, position); + Vertices.Insert(index, vex); + VertexAdded?.Invoke(this, vex); + Refresh(); + return vex; + } + + public void RemoveVertex(LinkVertexModel vertex) + { + Vertices.Remove(vertex); + VertexRemoved?.Invoke(this, vertex); + Refresh(); + } + public void SetSource(Anchor anchor) { ArgumentNullException.ThrowIfNull(anchor, nameof(anchor)); diff --git a/src/Blazor.Diagrams/Components/LinkWidget.razor.cs b/src/Blazor.Diagrams/Components/LinkWidget.razor.cs index 5f1d6d58..e700b367 100644 --- a/src/Blazor.Diagrams/Components/LinkWidget.razor.cs +++ b/src/Blazor.Diagrams/Components/LinkWidget.razor.cs @@ -27,20 +27,31 @@ private RenderFragment GetSelectionHelperPath(string color, string d, int index) builder.AddAttribute(8, "onmouseenter", EventCallback.Factory.Create(this, OnMouseEnter)); builder.AddAttribute(9, "onmouseleave", EventCallback.Factory.Create(this, OnMouseLeave)); builder.AddAttribute(10, "onpointerdown", EventCallback.Factory.Create(this, e => OnPointerDown(e, index))); - builder.AddEventStopPropagationAttribute(11, "onpointerdown", Link.Segmentable); + builder.AddAttribute(11, "ondblclick", EventCallback.Factory.Create(this, e => OnPointerDoubleClick(e, index))); + builder.AddEventStopPropagationAttribute(12, "onpointerdown", Link.Segmentable && !Link.DoubleClickToSegment); + builder.AddEventStopPropagationAttribute(13, "ondblclick", Link.Segmentable && Link.DoubleClickToSegment); builder.CloseElement(); }; } private void OnPointerDown(PointerEventArgs e, int index) { - if (!Link.Segmentable) + if (!Link.Segmentable || Link.DoubleClickToSegment) return; var vertex = CreateVertex(e.ClientX, e.ClientY, index); BlazorDiagram.TriggerPointerDown(vertex, e.ToCore()); } + private void OnPointerDoubleClick(MouseEventArgs e, int index) + { + if (!Link.Segmentable || !Link.DoubleClickToSegment) + return; + + var vertex = CreateVertex(e.ClientX, e.ClientY, index); + BlazorDiagram.TriggerPointerDoubleClick(vertex, e.ToCore()); + } + private void OnMouseEnter(MouseEventArgs e) { _hovered = true; @@ -54,9 +65,7 @@ private void OnMouseLeave(MouseEventArgs e) private LinkVertexModel CreateVertex(double clientX, double clientY, int index) { var rPt = BlazorDiagram.GetRelativeMousePoint(clientX, clientY); - var vertex = new LinkVertexModel(Link, rPt); - Link.Vertices.Insert(index, vertex); - Link.Refresh(); + var vertex = Link.InsertVertex(rPt, index); return vertex; } } diff --git a/src/Blazor.Diagrams/Components/Renderers/LinkVertexRenderer.cs b/src/Blazor.Diagrams/Components/Renderers/LinkVertexRenderer.cs index 7fa149d2..f16b85ed 100644 --- a/src/Blazor.Diagrams/Components/Renderers/LinkVertexRenderer.cs +++ b/src/Blazor.Diagrams/Components/Renderers/LinkVertexRenderer.cs @@ -89,7 +89,6 @@ private void OnPointerUp(PointerEventArgs e) private void OnDoubleClick(MouseEventArgs e) { - Vertex.Parent.Vertices.Remove(Vertex); - Vertex.Parent.Refresh(); + Vertex.Parent.RemoveVertex(Vertex); } }