Skip to content

Commit 9aefcae

Browse files
committed
Bug fixes
1 parent 26118f9 commit 9aefcae

File tree

2 files changed

+66
-22
lines changed

2 files changed

+66
-22
lines changed

Graph/GraphControl.cs

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,10 @@ void SetFlag(IElement element, RenderState flag, bool value, bool setConnections
167167
connection.state = SetFlag(connection.state, flag, value);
168168
if (setConnections)
169169
{
170-
if (connection.From != null)
171-
connection.From.state = SetFlag(connection.From.state, flag, value);
172-
if (connection.To != null)
173-
connection.To.state = SetFlag(connection.To.state, flag, value);
170+
//if (connection.From != null)
171+
// connection.From.state = SetFlag(connection.From.state, flag, value);
172+
//if (connection.To != null)
173+
// connection.To.state = SetFlag(connection.To.state, flag, value);
174174
//SetFlag(connection.From, flag, value, setConnections);
175175
//SetFlag(connection.To, flag, value, setConnections);
176176
}
@@ -679,6 +679,7 @@ protected override void OnPaint(PaintEventArgs e)
679679

680680
e.Graphics.Transform = transformation;
681681

682+
GraphRenderer.PerformLayout(e.Graphics, graphNodes);
682683
GraphRenderer.Render(e.Graphics, graphNodes, ShowLabels);
683684
if (dragging)
684685
{
@@ -830,6 +831,7 @@ protected override void OnMouseMove(MouseEventArgs e)
830831
}
831832
}
832833

834+
NodeConnector destinationConnector = null;
833835
IElement draggingOverElement = null;
834836
var element = FindElementAt(transformed_location);
835837
if (element != null)
@@ -888,27 +890,22 @@ protected override void OnMouseMove(MouseEventArgs e)
888890
case ElementType.InputConnector:
889891
case ElementType.OutputConnector:
890892
{
891-
var connector = element as NodeConnector;
893+
destinationConnector = element as NodeConnector;
892894

893895
if (DragElement != null &&
894896
(DragElement.ElementType == ElementType.InputConnector ||
895897
DragElement.ElementType == ElementType.OutputConnector))
896898
{
897899
var dragConnector = DragElement as NodeConnector;
898-
if (dragConnector.Node == connector.Node ||
900+
if (dragConnector.Node == destinationConnector.Node ||
899901
DragElement.ElementType == element.ElementType)
900902
{
901903
element = null;
902904
break;
903905
}
904906
}
905907

906-
var pre_points = new PointF[] {
907-
new PointF((connector.bounds.Left + connector.bounds.Right) / 2,
908-
(connector.bounds.Top + connector.bounds.Bottom) / 2) };
909-
transformation.TransformPoints(pre_points);
910-
snappedLocation = pre_points[0];
911-
draggingOverElement = connector.Node;
908+
draggingOverElement = destinationConnector.Node;
912909
break;
913910
}
914911
}
@@ -925,6 +922,9 @@ protected override void OnMouseMove(MouseEventArgs e)
925922
if (internalDragOverElement != null)
926923
{
927924
SetFlag(internalDragOverElement, RenderState.DraggedOver, false);
925+
var node = GetElementNode(internalDragOverElement);
926+
if (node != null)
927+
GraphRenderer.PerformLayout(this.CreateGraphics(), node);
928928
needRedraw = true;
929929
}
930930

@@ -933,15 +933,48 @@ protected override void OnMouseMove(MouseEventArgs e)
933933
if (internalDragOverElement != null)
934934
{
935935
SetFlag(internalDragOverElement, RenderState.DraggedOver, true);
936+
var node = GetElementNode(internalDragOverElement);
937+
if (node != null)
938+
GraphRenderer.PerformLayout(this.CreateGraphics(), node);
936939
needRedraw = true;
937940
}
938941
}
939942

943+
if (destinationConnector != null)
944+
{
945+
if (!destinationConnector.bounds.IsEmpty)
946+
{
947+
var pre_points = new PointF[] {
948+
new PointF((destinationConnector.bounds.Left + destinationConnector.bounds.Right) / 2,
949+
(destinationConnector.bounds.Top + destinationConnector.bounds.Bottom) / 2) };
950+
transformation.TransformPoints(pre_points);
951+
snappedLocation = pre_points[0];
952+
}
953+
}
954+
955+
940956
if (needRedraw)
941957
this.Refresh();
942958
}
943959
#endregion
944960

961+
#region GetElementNode
962+
private Node GetElementNode(IElement element)
963+
{
964+
if (element == null)
965+
return null;
966+
switch (element.ElementType)
967+
{
968+
default:
969+
case ElementType.Connection: return null;
970+
case ElementType.InputConnector: return ((NodeInputConnector)element).Node;
971+
case ElementType.OutputConnector: return ((NodeInputConnector)element).Node;
972+
case ElementType.NodeItem: return ((NodeItem)element).Node;
973+
case ElementType.Node: return (Node)element;
974+
}
975+
}
976+
#endregion
977+
945978
#region OnMouseUp
946979
protected override void OnMouseUp(MouseEventArgs e)
947980
{
@@ -979,10 +1012,7 @@ protected override void OnMouseUp(MouseEventArgs e)
9791012
return;
9801013
}
9811014
case ElementType.Connection:
982-
{
983-
needRedraw = true;
984-
return;
985-
}
1015+
case ElementType.NodeItem:
9861016
case ElementType.Node:
9871017
{
9881018
needRedraw = true;
@@ -1017,10 +1047,11 @@ protected override void OnMouseUp(MouseEventArgs e)
10171047
#endregion
10181048

10191049
#region OnDoubleClick
1050+
bool ignoreDoubleClick = false;
10201051
protected override void OnDoubleClick(EventArgs e)
10211052
{
10221053
base.OnDoubleClick(e);
1023-
if (mouseMoved)
1054+
if (mouseMoved || ignoreDoubleClick)
10241055
return;
10251056

10261057
var points = new Point[] { lastLocation };
@@ -1053,6 +1084,7 @@ protected override void OnDoubleClick(EventArgs e)
10531084
#region OnClick
10541085
protected override void OnClick(EventArgs e)
10551086
{
1087+
ignoreDoubleClick = false;
10561088
base.OnClick(e);
10571089
if (mouseMoved)
10581090
return;
@@ -1072,7 +1104,7 @@ protected override void OnClick(EventArgs e)
10721104
var item = element as NodeItem;
10731105
if (item.OnClick())
10741106
{
1075-
mouseMoved = true; // to avoid double-click from firing
1107+
ignoreDoubleClick = true; // to avoid double-click from firing
10761108
this.Refresh();
10771109
return;
10781110
}

Graph/GraphRenderer.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public static class GraphRenderer
3333
{
3434
static IEnumerable<NodeItem> EnumerateNodeItems(Node node)
3535
{
36+
if (node == null)
37+
yield break;
38+
3639
yield return node.titleItem;
3740
if (node.Collapsed)
3841
yield break;
@@ -43,6 +46,9 @@ static IEnumerable<NodeItem> EnumerateNodeItems(Node node)
4346

4447
public static SizeF Measure(IDeviceContext context, Node node)
4548
{
49+
if (node == null)
50+
return SizeF.Empty;
51+
4652
SizeF size = Size.Empty;
4753
size.Height = //(int)NodeConstants.TopHeight +
4854
(int)GraphConstants.BottomHeight;
@@ -101,13 +107,17 @@ static void RenderArrow(Graphics graphics, RectangleF bounds, RenderState connec
101107
}
102108
}
103109

104-
public static void Render(Graphics graphics, IEnumerable<Node> nodes, bool showLabels)
110+
public static void PerformLayout(Graphics graphics, IEnumerable<Node> nodes)
105111
{
106-
var skipConnections = new HashSet<NodeConnection>();
107112
foreach (var node in nodes.Reverse<Node>())
108113
{
109-
GraphRenderer.PreRender(graphics, node);
114+
GraphRenderer.PerformLayout(graphics, node);
110115
}
116+
}
117+
118+
public static void Render(Graphics graphics, IEnumerable<Node> nodes, bool showLabels)
119+
{
120+
var skipConnections = new HashSet<NodeConnection>();
111121
foreach (var node in nodes.Reverse<Node>())
112122
{
113123
GraphRenderer.RenderConnections(graphics, node, skipConnections, showLabels);
@@ -118,8 +128,10 @@ public static void Render(Graphics graphics, IEnumerable<Node> nodes, bool showL
118128
}
119129
}
120130

121-
public static void PreRender(Graphics graphics, Node node)
131+
public static void PerformLayout(Graphics graphics, Node node)
122132
{
133+
if (node == null)
134+
return;
123135
var size = Measure(graphics, node);
124136
var position = node.Location;
125137
node.bounds = new RectangleF(position, size);

0 commit comments

Comments
 (0)