Skip to content

Commit d9b1a63

Browse files
authored
Merge pull request #26 from WiseTechGlobal/pan_changed_backup
WI00713829 - Ports dont update when resizing nodes in Blazor Diagrams
2 parents 5d6906c + 53a39dd commit d9b1a63

File tree

5 files changed

+145
-1
lines changed

5 files changed

+145
-1
lines changed

src/Blazor.Diagrams.Core/Models/NodeModel.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,13 @@ public void SetSize(double width, double height)
107107
if (newSize.Equals(_size) == true)
108108
return;
109109

110+
Size? oldSize = Size != null ? new Size(Size.Width, Size.Height) : null;
111+
110112
Size = newSize;
113+
if (oldSize != null)
114+
{
115+
UpdatePortPositions(oldSize, newSize);
116+
}
111117
Refresh();
112118
RefreshLinks();
113119
SizeChanging?.Invoke(this);
@@ -156,6 +162,9 @@ public virtual void UpdatePositionSilently(double deltaX, double deltaY)
156162

157163
public virtual bool CanAttachTo(ILinkable other) => other is not PortModel && other is not BaseLinkModel;
158164

165+
/// <summary>
166+
/// Updates port positions when node position changes.
167+
/// </summary>
159168
private void UpdatePortPositions(double deltaX, double deltaY)
160169
{
161170
// Save some JS calls and update ports directly here
@@ -166,6 +175,21 @@ private void UpdatePortPositions(double deltaX, double deltaY)
166175
}
167176
}
168177

178+
/// <summary>
179+
/// Updates port positions when node size changes.
180+
/// </summary>
181+
private void UpdatePortPositions(Size oldSize, Size newSize)
182+
{
183+
var deltaWidth = newSize.Width - oldSize.Width;
184+
var deltaHeight = newSize.Height - oldSize.Height;
185+
186+
foreach (var port in _ports)
187+
{
188+
port.SetPortPositionOnNodeSizeChanged(deltaWidth, deltaHeight);
189+
port.RefreshLinks();
190+
}
191+
}
192+
169193
protected void TriggerMoving()
170194
{
171195
Moving?.Invoke(this);

src/Blazor.Diagrams.Core/Models/PortModel.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,38 @@ public virtual bool CanAttachTo(ILinkable other)
6767
void ILinkable.AddLink(BaseLinkModel link) => _links.Add(link);
6868

6969
void ILinkable.RemoveLink(BaseLinkModel link) => _links.Remove(link);
70+
71+
public virtual void SetPortPositionOnNodeSizeChanged(double deltaWidth, double deltaHeight)
72+
{
73+
switch (Alignment)
74+
{
75+
case PortAlignment.Top:
76+
Position = new Point(Position.X + deltaWidth / 2, Position.Y);
77+
break;
78+
case PortAlignment.TopRight:
79+
Position = new Point(Position.X + deltaWidth, Position.Y);
80+
break;
81+
case PortAlignment.TopLeft:
82+
Position = new Point(Position.X, Position.Y);
83+
break;
84+
case PortAlignment.Right:
85+
Position = new Point(Position.X + deltaWidth, Position.Y + deltaHeight / 2);
86+
break;
87+
case PortAlignment.Left:
88+
Position = new Point(Position.X, Position.Y + deltaHeight / 2);
89+
break;
90+
case PortAlignment.Bottom:
91+
Position = new Point(Position.X + deltaWidth / 2, Position.Y + deltaHeight);
92+
break;
93+
case PortAlignment.BottomRight:
94+
Position = new Point(Position.X + deltaWidth, Position.Y + deltaHeight);
95+
break;
96+
case PortAlignment.BottomLeft:
97+
Position = new Point(Position.X, Position.Y + deltaHeight);
98+
break;
99+
default:
100+
Position = new Point(Position.X, Position.Y);
101+
break;
102+
}
103+
}
70104
}

tests/Blazor.Diagrams.Core.Tests/Blazor.Diagrams.Core.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFramework>net6.0</TargetFramework>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using Blazor.Diagrams.Core.Geometry;
2+
using Blazor.Diagrams.Core.Models;
3+
using Moq;
4+
using Xunit;
5+
6+
namespace Blazor.Diagrams.Core.Tests.Models
7+
{
8+
public class NodeModelTest
9+
{
10+
[Fact]
11+
public void UpdatePortOnSetPosition()
12+
{
13+
var node = new NodeModel(position: new Point(100, 100));
14+
node.Size = new Size(100, 100);
15+
16+
var port = new PortModel(node, PortAlignment.BottomLeft, new Point(50, 50));
17+
node.AddPort(port);
18+
19+
var newX = 200;
20+
var newY = 300;
21+
22+
//Act
23+
node.SetPosition(newX, newY);
24+
25+
//Assert
26+
Assert.Equal(150, port.Position.X);
27+
Assert.Equal(250, port.Position.Y);
28+
}
29+
30+
[Fact]
31+
public void SetPortPositionOnNodeSizeChangedIsCalledOnSetSize()
32+
{
33+
// Arrange
34+
var oldWidth = 100.0;
35+
var oldHeight = 100.0;
36+
var newWidth = 500.0;
37+
var newHeight = 700.0;
38+
var deltaX = newWidth - oldWidth;
39+
var deltaY = newHeight - oldHeight;
40+
41+
var node = new NodeModel(new Point(100, 100)) { Size = new Size(oldWidth, oldHeight) };
42+
var portMock = new Mock<PortModel>(node, PortAlignment.BottomLeft, null, null);
43+
44+
node.AddPort(portMock.Object);
45+
46+
// Act
47+
node.SetSize(newWidth, newHeight);
48+
49+
// Assert
50+
portMock.Verify(m => m.SetPortPositionOnNodeSizeChanged(deltaX, deltaY), Times.Once);
51+
}
52+
}
53+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Blazor.Diagrams.Core.Geometry;
2+
using Blazor.Diagrams.Core.Models;
3+
using Xunit;
4+
5+
namespace Blazor.Diagrams.Core.Tests.Models
6+
{
7+
public class PortModelTest
8+
{
9+
[Theory]
10+
[InlineData(PortAlignment.Top, 50, 0)]
11+
[InlineData(PortAlignment.TopLeft, 0, 0)]
12+
[InlineData(PortAlignment.TopRight, 100, 0)]
13+
[InlineData(PortAlignment.Bottom, 50, 100)]
14+
[InlineData(PortAlignment.BottomLeft, 0, 100)]
15+
[InlineData(PortAlignment.BottomRight, 100, 100)]
16+
[InlineData(PortAlignment.Left, 0, 50)]
17+
[InlineData(PortAlignment.Right, 100, 50)]
18+
public void SetPortPositionOnNodeSizeChangedCalculatesCorrectPosition(PortAlignment alignment, double expectedXPosition, double expectedYPosition)
19+
{
20+
// Arrange
21+
var node = new NodeModel();
22+
var port = new PortModel(node, alignment, new Point(0, 0));
23+
node.Size = new Size(100, 100);
24+
25+
// Act
26+
port.SetPortPositionOnNodeSizeChanged(100, 100);
27+
28+
// Assert
29+
Assert.Equal(expectedXPosition, port.Position.X);
30+
Assert.Equal(expectedYPosition, port.Position.Y);
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)