/// <summary> /// Starts animation from oldGraph to newGraph. /// </summary> /// <param name="oldGraph"></param> /// <param name="newGraph"></param> /// <param name="diff"></param> public void StartAnimation(PositionedGraph oldGraph, PositionedGraph newGraph, GraphDiff diff) { // account for that the visual controls could have been reused (we are not reusing controls now - NodeControlCache does nothing) this.canvas.Width = newGraph.BoundingRect.Width; this.canvas.Height = newGraph.BoundingRect.Height; if (oldGraph == null) { Draw(newGraph); return; } var durationMove = new Duration(TimeSpan.FromSeconds(animationDurationSeconds)); var durationFade = durationMove; DoubleAnimation fadeOutAnim = new DoubleAnimation(1.0, 0.0, durationFade); DoubleAnimation fadeInAnim = new DoubleAnimation(0.0, 1.0, durationFade); foreach (UIElement drawing in canvas.Children) { var arrow = drawing as Path; if (arrow != null) { arrow.BeginAnimation(UIElement.OpacityProperty, fadeOutAnim); } } foreach (PositionedEdge edge in newGraph.Edges) { AddEdgeToCanvas(edge).BeginAnimation(UIElement.OpacityProperty, fadeInAnim); } foreach (PositionedNode removedNode in diff.RemovedNodes) { removedNode.NodeVisualControl.BeginAnimation(UIElement.OpacityProperty, fadeOutAnim); } foreach (PositionedNode addedNode in diff.AddedNodes) { AddNodeToCanvas(addedNode).BeginAnimation(UIElement.OpacityProperty, fadeInAnim); } bool first = true; foreach (PositionedNode node in diff.ChangedNodes) { var newNode = diff.GetMatchingNewNode(node); PointAnimation anim = new PointAnimation(); if (first) { anim.Completed += (o, e) => { Draw(newGraph); if (oldGraph != null) { foreach (var oldNode in oldGraph.Nodes) { oldNode.ReleaseNodeVisualControl(); } } }; first = false; } anim.From = node.LeftTop; anim.To = newNode.LeftTop; anim.DecelerationRatio = 0.3; anim.AccelerationRatio = 0.3; anim.Duration = durationMove; node.NodeVisualControl.BeginAnimation(CanvasLocationAdapter.LocationProperty, anim); } }
/// <summary> /// Starts animation from oldGraph to newGraph. /// </summary> /// <param name="oldGraph"></param> /// <param name="newGraph"></param> /// <param name="diff"></param> public void StartAnimation(PositionedGraph oldGraph, PositionedGraph newGraph, GraphDiff diff) { if (oldGraph != null) { foreach (var oldNode in oldGraph.Nodes) { foreach (var newNode in newGraph.Nodes) { if (oldNode.NodeVisualControl == newNode.NodeVisualControl) { ClearCanvas(); } } } } this.canvas.Width = newGraph.BoundingRect.Width; this.canvas.Height = newGraph.BoundingRect.Height; if (oldGraph == null) { Draw(newGraph); return; } double seconds = 0.5; var durationMove = new Duration(TimeSpan.FromSeconds(seconds)); var durationFade = durationMove; DoubleAnimation fadeOutAnim = new DoubleAnimation(1.0, 0.0, durationFade); DoubleAnimation fadeInAnim = new DoubleAnimation(0.0, 1.0, durationFade); foreach (UIElement drawing in canvas.Children) { var arrow = drawing as Path; if (arrow != null) { arrow.BeginAnimation(UIElement.OpacityProperty, fadeOutAnim); } } foreach (PositionedEdge edge in newGraph.Edges) { addEdgeToCanvas(edge).BeginAnimation(UIElement.OpacityProperty, fadeInAnim); } foreach (PositionedGraphNode removedNode in diff.RemovedNodes) { removedNode.NodeVisualControl.BeginAnimation(UIElement.OpacityProperty, fadeOutAnim); } foreach (PositionedGraphNode addedNode in diff.AddedNodes) { addNodeToCanvas(addedNode).BeginAnimation(UIElement.OpacityProperty, fadeInAnim); } bool first = true; foreach (PositionedGraphNode node in diff.ChangedNodes) { var newNode = diff.GetMatchingNewNode(node); PointAnimation anim = new PointAnimation(); if (first) { anim.Completed += new EventHandler((o, e) => { Draw(newGraph); }); first = false; } anim.From = node.LeftTop; anim.To = newNode.LeftTop; anim.DecelerationRatio = 0.3; anim.AccelerationRatio = 0.3; anim.Duration = durationMove; node.NodeVisualControl.BeginAnimation(CanvasLocationAdapter.LocationProperty, anim); } }