Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }