Skip to content

Commit e337190

Browse files
committed
Account for diagram zoom when dragging resizers (#16)
* add test * add fix * enable zoom for testing * finish writing tests * add fix for remaining resizers * Revert "enable zoom for testing" This reverts commit 69fa0aa. * fix formatting * make fields nullable * fix nullables * use file scoped namespaces
1 parent 69c8198 commit e337190

File tree

10 files changed

+642
-378
lines changed

10 files changed

+642
-378
lines changed

src/Blazor.Diagrams.Core/Positions/Resizing/BottomLeftResizerProvider.cs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ namespace Blazor.Diagrams.Core.Positions.Resizing
77
{
88
public class BottomLeftResizerProvider : IResizerProvider
99
{
10-
public string? Class => "bottomleft";
10+
public string? Class => "bottomleft";
11+
12+
private Size? _originalSize;
13+
private Point? _originalPosition;
14+
private Point? _originalMousePosition;
15+
private NodeModel? _nodeModel;
16+
private Diagram? _diagram;
1117

12-
private Size _originalSize = null!;
13-
private Point _originalPosition = null!;
14-
private Point _originalMousePosition = null!;
15-
private NodeModel _nodeModel = null!;
1618

1719
public Point? GetPosition(Model model)
1820
{
@@ -29,22 +31,23 @@ public void OnResizeStart(Diagram diagram, Model model, PointerEventArgs eventAr
2931
{
3032
_originalPosition = new Point(nodeModel.Position.X, nodeModel.Position.Y);
3133
_originalMousePosition = new Point(eventArgs.ClientX, eventArgs.ClientY);
32-
_originalSize = nodeModel.Size!;
34+
_originalSize = nodeModel.Size;
3335
_nodeModel = nodeModel;
36+
_diagram = diagram;
3437
}
3538
}
3639

3740
public void OnPointerMove(Model? model, PointerEventArgs args)
3841
{
39-
if (_nodeModel is null)
42+
if (_originalSize is null || _originalPosition is null || _originalMousePosition is null || _nodeModel is null || _diagram is null)
4043
{
4144
return;
4245
}
4346

44-
var height = _originalSize.Height + (args.ClientY - _originalMousePosition.Y);
45-
var width = _originalSize.Width - (args.ClientX - _originalMousePosition.X);
47+
var height = _originalSize.Height + (args.ClientY - _originalMousePosition.Y) / _diagram.Zoom;
48+
var width = _originalSize.Width - (args.ClientX - _originalMousePosition.X) / _diagram.Zoom;
4649

47-
var positionX = _originalPosition.X + (args.ClientX - _originalMousePosition.X);
50+
var positionX = _originalPosition.X + (args.ClientX - _originalMousePosition.X) / _diagram.Zoom;
4851
var positionY = _originalPosition.Y;
4952

5053
if (width < _nodeModel.MinimumDimensions.Width)
@@ -65,10 +68,11 @@ public void OnPointerMove(Model? model, PointerEventArgs args)
6568
public void OnResizeEnd(Model? model, PointerEventArgs args)
6669
{
6770
_nodeModel?.TriggerSizeChanged();
68-
_originalSize = null!;
69-
_originalPosition = null!;
70-
_originalMousePosition = null!;
71-
_nodeModel = null!;
71+
_originalSize = null;
72+
_originalPosition = null;
73+
_originalMousePosition = null;
74+
_nodeModel = null;
75+
_diagram = null;
7276
}
7377

7478
}

src/Blazor.Diagrams.Core/Positions/Resizing/BottomRightResizerProvider.cs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ public class BottomRightResizerProvider : IResizerProvider
99
{
1010
public string? Class => "bottomright";
1111

12-
private Size _originalSize = null!;
13-
private Point _originalMousePosition = null!;
14-
private NodeModel _nodeModel = null!;
12+
private Size? _originalSize;
13+
private Point? _originalMousePosition;
14+
private NodeModel? _nodeModel;
15+
private Diagram? _diagram;
1516

16-
public Point? GetPosition(Model model)
17+
public Point? GetPosition(Model model)
1718
{
1819
if (model is NodeModel nodeModel && nodeModel.Size is not null)
1920
{
@@ -27,20 +28,21 @@ public void OnResizeStart(Diagram diagram, Model model, PointerEventArgs eventAr
2728
if (model is NodeModel nodeModel)
2829
{
2930
_originalMousePosition = new Point(eventArgs.ClientX, eventArgs.ClientY);
30-
_originalSize = nodeModel.Size!;
31+
_originalSize = nodeModel.Size;
3132
_nodeModel = nodeModel;
33+
_diagram = diagram;
3234
}
3335
}
3436

3537
public void OnPointerMove(Model? model, PointerEventArgs args)
3638
{
37-
if (_nodeModel is null)
39+
if (_originalSize is null || _originalMousePosition is null || _nodeModel is null || _diagram is null)
3840
{
3941
return;
4042
}
4143

42-
var height = _originalSize.Height + (args.ClientY - _originalMousePosition.Y);
43-
var width = _originalSize.Width + (args.ClientX - _originalMousePosition.X);
44+
var height = _originalSize.Height + (args.ClientY - _originalMousePosition.Y) / _diagram.Zoom;
45+
var width = _originalSize.Width + (args.ClientX - _originalMousePosition.X) / _diagram.Zoom;
4446

4547
if (width < _nodeModel.MinimumDimensions.Width)
4648
{
@@ -57,9 +59,10 @@ public void OnPointerMove(Model? model, PointerEventArgs args)
5759
public void OnResizeEnd(Model? model, PointerEventArgs args)
5860
{
5961
_nodeModel?.TriggerSizeChanged();
60-
_originalSize = null!;
61-
_originalMousePosition = null!;
62-
_nodeModel = null!;
62+
_originalSize = null;
63+
_originalMousePosition = null;
64+
_nodeModel = null;
65+
_diagram = null;
6366
}
6467

6568
}

src/Blazor.Diagrams.Core/Positions/Resizing/TopLeftResizerProvider.cs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ namespace Blazor.Diagrams.Core.Positions.Resizing
77
{
88
public class TopLeftResizerProvider : IResizerProvider
99
{
10-
public string? Class => "topleft";
10+
public string? Class => "topleft";
1111

12-
private Size _originalSize = null!;
13-
private Point _originalPosition = null!;
14-
private Point _originalMousePosition = null!;
15-
private NodeModel _nodeModel = null!;
12+
private Size? _originalSize;
13+
private Point? _originalPosition;
14+
private Point? _originalMousePosition;
15+
private NodeModel? _nodeModel;
16+
private Diagram? _diagram;
1617

1718
public Point? GetPosition(Model model)
1819
{
@@ -29,23 +30,24 @@ public void OnResizeStart(Diagram diagram, Model model, PointerEventArgs eventAr
2930
{
3031
_originalPosition = new Point(nodeModel.Position.X, nodeModel.Position.Y);
3132
_originalMousePosition = new Point(eventArgs.ClientX, eventArgs.ClientY);
32-
_originalSize = nodeModel.Size!;
33+
_originalSize = nodeModel.Size;
3334
_nodeModel = nodeModel;
35+
_diagram = diagram;
3436
}
3537
}
3638

3739
public void OnPointerMove(Model? model, PointerEventArgs args)
3840
{
39-
if (_nodeModel is null)
41+
if (_originalSize is null || _originalPosition is null || _originalMousePosition is null || _nodeModel is null || _diagram is null)
4042
{
4143
return;
4244
}
4345

44-
var height = _originalSize.Height - (args.ClientY - _originalMousePosition.Y);
45-
var width = _originalSize.Width - (args.ClientX - _originalMousePosition.X);
46+
var height = _originalSize.Height - (args.ClientY - _originalMousePosition.Y) / _diagram.Zoom;
47+
var width = _originalSize.Width - (args.ClientX - _originalMousePosition.X) / _diagram.Zoom;
4648

47-
var positionX = _originalPosition.X + (args.ClientX - _originalMousePosition.X);
48-
var positionY = _originalPosition.Y + (args.ClientY - _originalMousePosition.Y);
49+
var positionX = _originalPosition.X + (args.ClientX - _originalMousePosition.X) / _diagram.Zoom;
50+
var positionY = _originalPosition.Y + (args.ClientY - _originalMousePosition.Y) / _diagram.Zoom;
4951

5052
if (width < _nodeModel.MinimumDimensions.Width)
5153
{
@@ -65,10 +67,11 @@ public void OnPointerMove(Model? model, PointerEventArgs args)
6567
public void OnResizeEnd(Model? model, PointerEventArgs args)
6668
{
6769
_nodeModel?.TriggerSizeChanged();
68-
_originalSize = null!;
69-
_originalPosition = null!;
70-
_originalMousePosition = null!;
71-
_nodeModel = null!;
70+
_originalSize = null;
71+
_originalPosition = null;
72+
_originalMousePosition = null;
73+
_nodeModel = null;
74+
_diagram = null;
7275
}
7376

7477
}

src/Blazor.Diagrams.Core/Positions/Resizing/TopRightResizerProvider.cs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ namespace Blazor.Diagrams.Core.Positions.Resizing
77
{
88
public class TopRightResizerProvider : IResizerProvider
99
{
10-
public string? Class => "topright";
10+
public string? Class => "topright";
1111

12-
private Size _originalSize = null!;
13-
private Point _originalPosition = null!;
14-
private Point _originalMousePosition = null!;
15-
private NodeModel _nodeModel = null!;
12+
private Size? _originalSize;
13+
private Point? _originalPosition;
14+
private Point? _originalMousePosition;
15+
private NodeModel? _nodeModel;
16+
private Diagram? _diagram;
1617

1718
public Point? GetPosition(Model model)
1819
{
@@ -29,22 +30,24 @@ public void OnResizeStart(Diagram diagram, Model model, PointerEventArgs eventAr
2930
{
3031
_originalPosition = new Point(nodeModel.Position.X, nodeModel.Position.Y);
3132
_originalMousePosition = new Point(eventArgs.ClientX, eventArgs.ClientY);
32-
_originalSize = nodeModel.Size!;
33+
_originalSize = nodeModel.Size;
3334
_nodeModel = nodeModel;
35+
_diagram = diagram;
3436
}
3537
}
3638

3739
public void OnPointerMove(Model? model, PointerEventArgs args)
3840
{
39-
if (_nodeModel is null)
41+
if (_originalSize is null || _originalPosition is null || _originalMousePosition is null || _nodeModel is null || _diagram is null)
4042
{
4143
return;
4244
}
43-
var height = _originalSize.Height - (args.ClientY - _originalMousePosition.Y);
44-
var width = _originalSize.Width + (args.ClientX - _originalMousePosition.X);
45+
46+
var height = _originalSize.Height - (args.ClientY - _originalMousePosition.Y) / _diagram.Zoom;
47+
var width = _originalSize.Width + (args.ClientX - _originalMousePosition.X) / _diagram.Zoom;
4548

4649
var positionX = _originalPosition.X;
47-
var positionY = _originalPosition.Y + (args.ClientY - _originalMousePosition.Y);
50+
var positionY = _originalPosition.Y + (args.ClientY - _originalMousePosition.Y) / _diagram.Zoom;
4851

4952
if (width < _nodeModel.MinimumDimensions.Width)
5053
{
@@ -64,11 +67,12 @@ public void OnPointerMove(Model? model, PointerEventArgs args)
6467
public void OnResizeEnd(Model? model, PointerEventArgs args)
6568
{
6669
_nodeModel?.TriggerSizeChanged();
67-
_originalSize = null!;
68-
_originalPosition = null!;
69-
_originalMousePosition = null!;
70-
_nodeModel = null!;
70+
_originalSize = null;
71+
_originalPosition = null;
72+
_originalMousePosition = null;
73+
_nodeModel = null;
74+
_diagram = null;
7175
}
7276

7377
}
74-
}
78+
}

tests/Blazor.Diagrams.Core.Tests/Controls/ResizeControlTests.cs

Lines changed: 51 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,71 +5,70 @@
55
using Moq;
66
using Xunit;
77

8-
namespace Blazor.Diagrams.Core.Tests.Controls
8+
namespace Blazor.Diagrams.Core.Tests.Controls;
9+
10+
public class ResizeControlTests
911
{
10-
public class ResizeControlTests
12+
[Fact]
13+
public void GetPosition_ShouldUseResizeProviderGetPosition()
1114
{
12-
[Fact]
13-
public void GetPosition_ShouldUseResizeProviderGetPosition()
14-
{
15-
var resizeProvider = new Mock<IResizerProvider>();
16-
var control = new ResizeControl(resizeProvider.Object);
17-
var model = new Mock<Model>();
15+
var resizeProvider = new Mock<IResizerProvider>();
16+
var control = new ResizeControl(resizeProvider.Object);
17+
var model = new Mock<Model>();
1818

19-
control.GetPosition(model.Object);
19+
control.GetPosition(model.Object);
2020

21-
resizeProvider.Verify(m => m.GetPosition(model.Object), Times.Once);
22-
}
21+
resizeProvider.Verify(m => m.GetPosition(model.Object), Times.Once);
22+
}
2323

24-
[Fact]
25-
public void OnPointerDown_ShouldInvokeResizeStart()
26-
{
27-
var resizeProvider = new Mock<IResizerProvider>();
28-
var control = new ResizeControl(resizeProvider.Object);
29-
var diagram = Mock.Of<Diagram>();
30-
var model = Mock.Of<Model>();
31-
var eventArgs = new PointerEventArgs(0, 0, 0, 0, false, false, false, 0, 0, 0, 0, 0, 0, string.Empty, true);
24+
[Fact]
25+
public void OnPointerDown_ShouldInvokeResizeStart()
26+
{
27+
var resizeProvider = new Mock<IResizerProvider>();
28+
var control = new ResizeControl(resizeProvider.Object);
29+
var diagram = Mock.Of<Diagram>();
30+
var model = Mock.Of<Model>();
31+
var eventArgs = new PointerEventArgs(0, 0, 0, 0, false, false, false, 0, 0, 0, 0, 0, 0, string.Empty, true);
3232

33-
control.OnPointerDown(diagram, model, eventArgs);
33+
control.OnPointerDown(diagram, model, eventArgs);
3434

35-
resizeProvider.Verify(m => m.OnResizeStart(diagram, model, eventArgs), Times.Once);
36-
}
35+
resizeProvider.Verify(m => m.OnResizeStart(diagram, model, eventArgs), Times.Once);
36+
}
3737

38-
[Fact]
39-
public void OnPointerDown_ShouldAddEventHandlers()
40-
{
41-
var resizeProvider = new Mock<IResizerProvider>();
42-
var control = new ResizeControl(resizeProvider.Object);
43-
var diagram = new TestDiagram();
44-
var model = Mock.Of<Model>();
45-
var eventArgs = new PointerEventArgs(0, 0, 0, 0, false, false, false, 0, 0, 0, 0, 0, 0, string.Empty, true);
38+
[Fact]
39+
public void OnPointerDown_ShouldAddEventHandlers()
40+
{
41+
var resizeProvider = new Mock<IResizerProvider>();
42+
var control = new ResizeControl(resizeProvider.Object);
43+
var diagram = new TestDiagram();
44+
var model = Mock.Of<Model>();
45+
var eventArgs = new PointerEventArgs(0, 0, 0, 0, false, false, false, 0, 0, 0, 0, 0, 0, string.Empty, true);
4646

47-
control.OnPointerDown(diagram, model, eventArgs);
48-
49-
diagram.TriggerPointerMove(model, eventArgs);
50-
resizeProvider.Verify(m => m.OnPointerMove(model, eventArgs), Times.Once);
47+
control.OnPointerDown(diagram, model, eventArgs);
48+
49+
diagram.TriggerPointerMove(model, eventArgs);
50+
resizeProvider.Verify(m => m.OnPointerMove(model, eventArgs), Times.Once);
5151

52-
diagram.TriggerPointerUp(model, eventArgs);
53-
resizeProvider.Verify(m => m.OnResizeEnd(model, eventArgs), Times.Once);
54-
}
52+
diagram.TriggerPointerUp(model, eventArgs);
53+
resizeProvider.Verify(m => m.OnResizeEnd(model, eventArgs), Times.Once);
54+
}
5555

56-
[Fact]
57-
public void OnPointerUp_ShouldRemoveEventHandlers()
58-
{
59-
var resizeProvider = new Mock<IResizerProvider>();
60-
var control = new ResizeControl(resizeProvider.Object);
61-
var diagram = new TestDiagram();
62-
var model = Mock.Of<Model>();
63-
var eventArgs = new PointerEventArgs(0, 0, 0, 0, false, false, false, 0, 0, 0, 0, 0, 0, string.Empty, true);
56+
[Fact]
57+
public void OnPointerUp_ShouldRemoveEventHandlers()
58+
{
59+
var resizeProvider = new Mock<IResizerProvider>();
60+
var control = new ResizeControl(resizeProvider.Object);
61+
var diagram = new TestDiagram();
62+
var model = Mock.Of<Model>();
63+
var eventArgs = new PointerEventArgs(0, 0, 0, 0, false, false, false, 0, 0, 0, 0, 0, 0, string.Empty, true);
6464

65-
control.OnPointerDown(diagram, model, eventArgs);
66-
diagram.TriggerPointerUp(model, eventArgs);
65+
control.OnPointerDown(diagram, model, eventArgs);
66+
diagram.TriggerPointerUp(model, eventArgs);
6767

68-
diagram.TriggerPointerMove(model, eventArgs);
69-
resizeProvider.Verify(m => m.OnPointerMove(model, eventArgs), Times.Never);
68+
diagram.TriggerPointerMove(model, eventArgs);
69+
resizeProvider.Verify(m => m.OnPointerMove(model, eventArgs), Times.Never);
7070

71-
diagram.TriggerPointerUp(model, eventArgs);
72-
resizeProvider.Verify(m => m.OnResizeEnd(model, eventArgs), Times.Once);
73-
}
71+
diagram.TriggerPointerUp(model, eventArgs);
72+
resizeProvider.Verify(m => m.OnResizeEnd(model, eventArgs), Times.Once);
7473
}
7574
}

0 commit comments

Comments
 (0)