private bool CanOptimizeAnimation(KeyFrameAnimationSceneNode nodeToTest)
        {
            TimelineSceneNode.PropertyNodePair elementAndProperty = nodeToTest.TargetElementAndProperty;
            if (elementAndProperty.PropertyReference == null || FromToAnimationSceneNode.GetFromToAnimationForType((ITypeId)elementAndProperty.PropertyReference.ValueTypeId, nodeToTest.ProjectContext) == null || (nodeToTest.KeyFrameCount != 1 || DesignTimeProperties.ExplicitAnimationProperty.Equals((object)elementAndProperty.PropertyReference[0])))
            {
                return(false);
            }
            KeyFrameSceneNode keyFrameAtIndex = nodeToTest.GetKeyFrameAtIndex(0);
            Duration?         nullable        = nodeToTest.GetLocalOrDefaultValueAsWpf(TimelineSceneNode.DurationProperty) as Duration?;
            bool flag = !nullable.HasValue || nullable.Value == Duration.Automatic || nullable.Value.HasTimeSpan && nullable.Value.TimeSpan.TotalSeconds == keyFrameAtIndex.Time;

            if (keyFrameAtIndex.InterpolationType != KeyFrameInterpolationType.Easing || !flag)
            {
                return(false);
            }
            foreach (IMemberId memberId in (IEnumerable <IProperty>)((DocumentCompositeNode)nodeToTest.DocumentNode).Properties.Keys)
            {
                switch (memberId.Name)
                {
                case "Duration":
                case "TargetName":
                case "TargetProperty":
                case "BeginTime":
                case "IsAnimationProxy":
                case "KeyFrames":
                case "ShouldSerialize":
                    continue;

                default:
                    return(false);
                }
            }
            return(true);
        }
示例#2
0
 public static Rect FindMaxAnimatedExtent(SceneElement element, Rect bounds, PropertyReference animationPrefix)
 {
     foreach (StoryboardTimelineSceneNode timelineSceneNode1 in element.ViewModel.AnimationEditor.EnumerateStoryboardsForContainer(element.StoryboardContainer))
     {
         foreach (TimelineSceneNode timelineSceneNode2 in (IEnumerable <TimelineSceneNode>)timelineSceneNode1.Children)
         {
             if (timelineSceneNode2.TargetElement == element && timelineSceneNode2.TargetProperty != null && animationPrefix.IsPrefixOf(timelineSceneNode2.TargetProperty))
             {
                 KeyFrameAnimationSceneNode animationSceneNode = timelineSceneNode2 as KeyFrameAnimationSceneNode;
                 if (animationSceneNode != null)
                 {
                     foreach (KeyFrameSceneNode keyFrameSceneNode in animationSceneNode.KeyFrames)
                     {
                         if (keyFrameSceneNode.Value is Point)
                         {
                             Point point = (Point)keyFrameSceneNode.Value;
                             bounds.Union(point);
                         }
                     }
                 }
             }
         }
     }
     return(bounds);
 }
示例#3
0
        public override void Draw(DrawingContext context, Matrix matrix)
        {
            if (!this.hasValidTranslateAnimationProperty)
            {
                this.TryGetTranslateAnimationProperties();
            }
            if (this.positionXAnimationProperty == null || this.positionYAnimationProperty == null || (this.leftAnimationProperty == null || this.topAnimationProperty == null))
            {
                return;
            }
            StoryboardTimelineSceneNode storyboardTimeline = this.DesignerContext.ActiveSceneViewModel.AnimationEditor.ActiveStoryboardTimeline;

            if (storyboardTimeline == null)
            {
                return;
            }
            KeyFrameAnimationSceneNode animationX    = storyboardTimeline.GetAnimation((SceneNode)this.Element, this.positionXAnimationProperty) as KeyFrameAnimationSceneNode;
            KeyFrameAnimationSceneNode animationY    = storyboardTimeline.GetAnimation((SceneNode)this.Element, this.positionYAnimationProperty) as KeyFrameAnimationSceneNode;
            KeyFrameAnimationSceneNode animationLeft = storyboardTimeline.GetAnimation((SceneNode)this.Element, this.leftAnimationProperty) as KeyFrameAnimationSceneNode;
            KeyFrameAnimationSceneNode animationTop  = storyboardTimeline.GetAnimation((SceneNode)this.Element, this.topAnimationProperty) as KeyFrameAnimationSceneNode;

            if ((animationX == null || animationX.KeyFrameCount == 0) && (animationY == null || animationY.KeyFrameCount == 0) && ((animationLeft == null || animationLeft.KeyFrameCount == 0) && (animationTop == null || animationTop.KeyFrameCount == 0)))
            {
                return;
            }
            this.UpdateMotionPath(animationX, animationY, animationLeft, animationTop);
            this.DrawMotionPath(context, matrix);
        }
 public void UpdateOnDeletion(KeyFrameAnimationSceneNode deletedAnimation)
 {
     AnimationProxyManager.AnimationProxyData animationProxyData;
     if (this.detachingFromStoryboard || !deletedAnimation.IsAnimationProxy || this.activeStoryboard != deletedAnimation.ControllingStoryboard || !this.targetPathToProxyData.TryGetValue(new AnimationProxyManager.TargetNamePropertyPair((TimelineSceneNode)deletedAnimation), out animationProxyData))
     {
         return;
     }
     animationProxyData.ProxyWasUserDeleted = true;
 }
 public FromToAnimationSceneNode GetAnimationForProxy(KeyFrameAnimationSceneNode proxy)
 {
     AnimationProxyManager.AnimationProxyData animationProxyData;
     if (proxy != null && proxy.ControllingStoryboard == this.activeStoryboard && this.targetPathToProxyData.TryGetValue(new AnimationProxyManager.TargetNamePropertyPair((TimelineSceneNode)proxy), out animationProxyData))
     {
         return(animationProxyData.OptimizedAnimation);
     }
     return((FromToAnimationSceneNode)null);
 }
        public static bool IsAnimationProxy(TimelineSceneNode timeline)
        {
            KeyFrameAnimationSceneNode animationSceneNode = timeline as KeyFrameAnimationSceneNode;

            if (animationSceneNode != null)
            {
                return(animationSceneNode.IsAnimationProxy);
            }
            return(false);
        }
        private FromToAnimationSceneNode ConvertToOptimizedAnimation(KeyFrameAnimationSceneNode proxyAnimation)
        {
            StoryboardTimelineSceneNode controllingStoryboard = proxyAnimation.ControllingStoryboard;
            FromToAnimationSceneNode    animationSceneNode    = FromToAnimationSceneNode.Factory.InstantiateWithTarget(this.viewModel, proxyAnimation.TargetElement, proxyAnimation.TargetProperty, proxyAnimation.StoryboardContainer, FromToAnimationSceneNode.GetFromToAnimationForType(proxyAnimation.AnimatedType, proxyAnimation.ProjectContext));
            KeyFrameSceneNode           keyFrameAtIndex       = proxyAnimation.GetKeyFrameAtIndex(0);

            animationSceneNode.Duration = keyFrameAtIndex.Time;
            SceneNode.CopyPropertyValue((SceneNode)keyFrameAtIndex, keyFrameAtIndex.ValueProperty, (SceneNode)animationSceneNode, animationSceneNode.ToProperty);
            SceneNode.CopyPropertyValue((SceneNode)keyFrameAtIndex, keyFrameAtIndex.EasingFunctionProperty, (SceneNode)animationSceneNode, animationSceneNode.EasingFunctionProperty);
            animationSceneNode.IsOptimized  = true;
            proxyAnimation.IsAnimationProxy = true;
            proxyAnimation.ShouldSerialize  = false;
            keyFrameAtIndex.ShouldSerialize = false;
            int index = proxyAnimation.ControllingStoryboard.Children.IndexOf((TimelineSceneNode)proxyAnimation);

            proxyAnimation.ControllingStoryboard.Children.Insert(index, (TimelineSceneNode)animationSceneNode);
            return(animationSceneNode);
        }
示例#8
0
        public static void ApplyTransformToAnimation(TimelineSceneNode timeline, Transform transform)
        {
            KeyFrameAnimationSceneNode animationSceneNode = timeline as KeyFrameAnimationSceneNode;

            if (animationSceneNode == null)
            {
                return;
            }
            foreach (KeyFrameSceneNode keyFrameSceneNode in animationSceneNode.KeyFrames)
            {
                object obj = keyFrameSceneNode.Value;
                if (obj != null && PlatformTypes.Point.IsAssignableFrom((ITypeId)timeline.Platform.Metadata.GetType(obj.GetType())))
                {
                    Point point1 = (Point)timeline.ViewModel.DefaultView.ConvertToWpfValue(obj);
                    Point point2 = transform.Transform(point1);
                    keyFrameSceneNode.Value = timeline.ViewModel.DefaultView.ConvertFromWpfValue((object)point2);
                }
            }
        }
示例#9
0
 private void ChangeAnimationProperty(PropertyReference fromProperty, PropertyReference toProperty, Dictionary <TimelineSceneNode, StoryboardTimelineSceneNode> toAdd, Dictionary <TimelineSceneNode, StoryboardTimelineSceneNode> toRemove, bool exactMatch)
 {
     foreach (StoryboardTimelineSceneNode timelineSceneNode in this.targetElement.ViewModel.AnimationEditor.EnumerateStoryboardsForContainer(this.targetElement.StoryboardContainer))
     {
         foreach (TimelineSceneNode timeline in (IEnumerable <TimelineSceneNode>)timelineSceneNode.Children)
         {
             if (timeline.TargetElement == this.targetElement && timeline.TargetProperty != null)
             {
                 PropertyReference propertyReference = toProperty;
                 bool flag1 = AnimationProxyManager.IsOptimizedAnimation(timeline);
                 bool flag2 = !flag1 && fromProperty.Equals((object)timeline.TargetProperty);
                 if (!flag1 && !exactMatch && !flag2)
                 {
                     flag2 = fromProperty.IsPrefixOf(timeline.TargetProperty);
                     if (flag2)
                     {
                         for (int count = toProperty.Count; count < timeline.TargetProperty.Count; ++count)
                         {
                             propertyReference = propertyReference.Append(timeline.TargetProperty[count]);
                         }
                     }
                 }
                 if (flag2)
                 {
                     if (toRemove != null)
                     {
                         toRemove[timeline] = timelineSceneNode;
                     }
                     TimelineSceneNode index = (TimelineSceneNode)this.targetElement.ViewModel.GetSceneNode(timeline.DocumentNode.Clone(timeline.DocumentContext));
                     index.TargetProperty  = propertyReference;
                     index.ShouldSerialize = true;
                     KeyFrameAnimationSceneNode animationSceneNode = index as KeyFrameAnimationSceneNode;
                     if (animationSceneNode != null)
                     {
                         animationSceneNode.IsAnimationProxy = false;
                     }
                     toAdd[index] = timelineSceneNode;
                 }
             }
         }
     }
 }
示例#10
0
 private void AdjustKeyframes(Vector offset)
 {
     foreach (StoryboardTimelineSceneNode timelineSceneNode1 in this.EditingElement.ViewModel.AnimationEditor.EnumerateStoryboardsForContainer(this.EditingElement.StoryboardContainer))
     {
         foreach (TimelineSceneNode timelineSceneNode2 in (IEnumerable <TimelineSceneNode>)timelineSceneNode1.Children)
         {
             KeyFrameAnimationSceneNode animationSceneNode = timelineSceneNode2 as KeyFrameAnimationSceneNode;
             if (animationSceneNode != null && timelineSceneNode2.TargetElement == this.EditingElement && (timelineSceneNode2.TargetProperty != null && timelineSceneNode2.TargetProperty.FirstStep.Equals((object)PathElement.DataProperty)))
             {
                 foreach (KeyFrameSceneNode keyFrameSceneNode in animationSceneNode.KeyFrames)
                 {
                     object obj = keyFrameSceneNode.Value;
                     if (obj is Point)
                     {
                         Point point = (Point)obj;
                         keyFrameSceneNode.Value = (object)(point - offset);
                     }
                 }
             }
         }
     }
 }
示例#11
0
        private void UpdateMotionPath(KeyFrameAnimationSceneNode animationX, KeyFrameAnimationSceneNode animationY, KeyFrameAnimationSceneNode animationLeft, KeyFrameAnimationSceneNode animationTop)
        {
            BaseFrameworkElement frameworkElement = (BaseFrameworkElement)this.Element;
            double x = 0.0;
            double y = 0.0;

            if (animationX == null)
            {
                animationX = (KeyFrameAnimationSceneNode)KeyFrameAnimationSceneNode.Factory.Instantiate(this.Element.ViewModel, KeyFrameAnimationSceneNode.GetKeyFrameAnimationForType(PlatformTypes.Double, frameworkElement.ProjectContext));
            }
            if (animationLeft == null)
            {
                animationLeft = (KeyFrameAnimationSceneNode)KeyFrameAnimationSceneNode.Factory.Instantiate(this.Element.ViewModel, KeyFrameAnimationSceneNode.GetKeyFrameAnimationForType(PlatformTypes.Double, frameworkElement.ProjectContext));
            }
            else
            {
                x = (double)frameworkElement.GetComputedValue(CanvasElement.LeftProperty);
            }
            if (animationY == null)
            {
                animationY = (KeyFrameAnimationSceneNode)KeyFrameAnimationSceneNode.Factory.Instantiate(this.Element.ViewModel, KeyFrameAnimationSceneNode.GetKeyFrameAnimationForType(PlatformTypes.Double, frameworkElement.ProjectContext));
            }
            if (animationTop == null)
            {
                animationTop = (KeyFrameAnimationSceneNode)KeyFrameAnimationSceneNode.Factory.Instantiate(this.Element.ViewModel, KeyFrameAnimationSceneNode.GetKeyFrameAnimationForType(PlatformTypes.Double, frameworkElement.ProjectContext));
            }
            else
            {
                y = (double)frameworkElement.GetComputedValue(CanvasElement.TopProperty);
            }
            this.motionPath.AnimationX    = animationX;
            this.motionPath.AnimationY    = animationY;
            this.motionPath.AnimationLeft = animationLeft;
            this.motionPath.AnimationTop  = animationTop;
            this.motionPath.TopLeftOffset = new Vector(x, y);
            this.motionPath.UpdatePath();
        }
示例#12
0
 public static void TransformPointKeyframes(SceneElement element, PropertyReference animationPrefix, Transform transform)
 {
     foreach (StoryboardTimelineSceneNode timelineSceneNode1 in element.ViewModel.AnimationEditor.EnumerateStoryboardsForContainer(element.StoryboardContainer))
     {
         foreach (TimelineSceneNode timelineSceneNode2 in (IEnumerable <TimelineSceneNode>)timelineSceneNode1.Children)
         {
             if (timelineSceneNode2.TargetElement == element && timelineSceneNode2.TargetProperty != null && animationPrefix.IsPrefixOf(timelineSceneNode2.TargetProperty))
             {
                 KeyFrameAnimationSceneNode animationSceneNode = timelineSceneNode2 as KeyFrameAnimationSceneNode;
                 if (animationSceneNode != null)
                 {
                     foreach (KeyFrameSceneNode keyFrameSceneNode in animationSceneNode.KeyFrames)
                     {
                         if (keyFrameSceneNode.Value is Point)
                         {
                             Point point = (Point)keyFrameSceneNode.Value;
                             keyFrameSceneNode.Value = (object)transform.Transform(point);
                         }
                     }
                 }
             }
         }
     }
 }
示例#13
0
        private static void PasteStoryboard(SceneViewModel viewModel, StoryboardTimelineSceneNode storyboard, IList <SceneNode> selectionSet)
        {
            double baseKeyframeOffset = double.MaxValue;

            foreach (TimelineSceneNode timelineSceneNode in (IEnumerable <TimelineSceneNode>)storyboard.Children)
            {
                KeyFrameAnimationSceneNode animationSceneNode = timelineSceneNode as KeyFrameAnimationSceneNode;
                if (animationSceneNode != null)
                {
                    foreach (KeyFrameSceneNode keyFrameSceneNode in animationSceneNode.KeyFrames)
                    {
                        if (keyFrameSceneNode.Time < baseKeyframeOffset)
                        {
                            baseKeyframeOffset = keyFrameSceneNode.Time;
                        }
                    }
                }
            }
            if (baseKeyframeOffset == double.MaxValue)
            {
                baseKeyframeOffset = 0.0;
            }
            IList <SceneElement> list = (IList <SceneElement>)viewModel.ElementSelectionSet.Selection;

            if (list.Count == 0)
            {
                list = (IList <SceneElement>)viewModel.KeyFrameSelectionSet.DerivedTargetElements;
            }
            foreach (SceneElement element in (IEnumerable <SceneElement>)list)
            {
                foreach (TimelineSceneNode animation in (IEnumerable <TimelineSceneNode>)storyboard.Children)
                {
                    viewModel.AnimationEditor.ApplyAnimation(element, animation, baseKeyframeOffset, selectionSet);
                }
            }
        }
示例#14
0
        private void SubdivideSegment(PathGeometry oldGeometry, int figure, int segment, int pointIndex, double parameter, Dictionary <TimelineSceneNode, StoryboardTimelineSceneNode> subdivisionProperties)
        {
            PropertyReference propertyReference1 = new PropertyReference(this.pathProperty).Append(PathElement.FiguresProperty).Append((ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathFigureCollection, figure));
            PropertyReference propertyReference2 = propertyReference1.Append(PathElement.PathFigureSegmentsProperty);
            PropertyReference propertyReference3 = segment != oldGeometry.Figures[figure].Segments.Count ? propertyReference2.Append((ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathSegmentCollection, segment)) : propertyReference1.Append(PathElement.PathFigureStartPointProperty);
            PropertyReference propertyReference4;

            if (segment == 0)
            {
                propertyReference4 = propertyReference1.Append(PathElement.PathFigureStartPointProperty);
            }
            else
            {
                ReferenceStep step = (ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathSegmentCollection, segment - 1);
                propertyReference4 = propertyReference2.Append(step).Append(this.LastPointProperty(oldGeometry.Figures[figure].Segments[segment - 1]));
            }
            PropertyReference propertyReference5 = (PropertyReference)null;

            if (segment == oldGeometry.Figures[figure].Segments.Count - 1 && PathFigureUtilities.IsClosed(oldGeometry.Figures[figure]) && PathFigureUtilities.IsCloseSegmentDegenerate(oldGeometry.Figures[figure]))
            {
                propertyReference5 = propertyReference1.Append(PathElement.PathFigureStartPointProperty);
            }
            foreach (StoryboardTimelineSceneNode timelineSceneNode1 in this.targetElement.ViewModel.AnimationEditor.EnumerateStoryboardsForContainer(this.targetElement.StoryboardContainer))
            {
                Dictionary <double, List <KeyFrameSceneNode> > keyFrames1 = new Dictionary <double, List <KeyFrameSceneNode> >();
                foreach (KeyValuePair <TimelineSceneNode, StoryboardTimelineSceneNode> keyValuePair in subdivisionProperties)
                {
                    if (keyValuePair.Value == timelineSceneNode1)
                    {
                        KeyFrameAnimationSceneNode keyFrameNode = keyValuePair.Key as KeyFrameAnimationSceneNode;
                        if (keyFrameNode != null)
                        {
                            this.RecordKeyFrames(keyFrames1, keyFrameNode);
                        }
                    }
                }
                Dictionary <double, List <KeyFrameSceneNode> > keyFrames2 = new Dictionary <double, List <KeyFrameSceneNode> >();
                foreach (TimelineSceneNode timelineSceneNode2 in (IEnumerable <TimelineSceneNode>)timelineSceneNode1.Children)
                {
                    if (timelineSceneNode2.TargetElement == this.targetElement && timelineSceneNode2.TargetProperty != null && (propertyReference3.Equals((object)timelineSceneNode2.TargetProperty) || propertyReference3.IsPrefixOf(timelineSceneNode2.TargetProperty) || propertyReference4.Equals((object)timelineSceneNode2.TargetProperty) || propertyReference5 != null && propertyReference5.Equals((object)timelineSceneNode2.TargetProperty)))
                    {
                        KeyFrameAnimationSceneNode keyFrameNode = timelineSceneNode2 as KeyFrameAnimationSceneNode;
                        if (keyFrameNode != null)
                        {
                            this.RecordKeyFrames(keyFrames2, keyFrameNode);
                        }
                    }
                }
                foreach (KeyValuePair <double, List <KeyFrameSceneNode> > keyValuePair in keyFrames2)
                {
                    PathGeometry       path = oldGeometry.Clone();
                    PathGeometryEditor pathGeometryEditor = new PathGeometryEditor(path);
                    foreach (KeyFrameSceneNode keyFrameSceneNode in keyValuePair.Value)
                    {
                        PropertyReference propertyReference6 = this.targetElement.ViewModel.DefaultView.ConvertToWpfPropertyReference(keyFrameSceneNode.TargetProperty.Subreference(1));
                        object            valueToSet         = this.targetElement.ViewModel.DefaultView.ConvertToWpfValue(keyFrameSceneNode.Value);
                        propertyReference6.SetValue((object)path, valueToSet);
                    }
                    pathGeometryEditor.SubdivideSegment(figure, pointIndex, parameter);
                    List <KeyFrameSceneNode> list;
                    if (keyFrames1.TryGetValue(keyValuePair.Key, out list))
                    {
                        foreach (KeyFrameSceneNode keyFrameSceneNode in list)
                        {
                            object obj = this.targetElement.ViewModel.DefaultView.ConvertFromWpfValue(this.targetElement.ViewModel.DefaultView.ConvertToWpfPropertyReference(keyFrameSceneNode.TargetProperty.Subreference(1)).GetCurrentValue((object)path));
                            keyFrameSceneNode.Value = obj;
                        }
                    }
                }
            }
        }
示例#15
0
        public override DocumentNode GetLocalValueAsDocumentNode(SceneNodeProperty property, GetLocalValueFlags flags, out bool isMixed)
        {
            DocumentNode documentNode = (DocumentNode)null;
            bool         flag         = false;

            foreach (SceneNode sceneNode1 in this.Objects)
            {
                PropertyReference propertyReference1 = SceneNodeObjectSet.FilterProperty(sceneNode1, property.Reference);
                if (propertyReference1 != null)
                {
                    DocumentNode other = (DocumentNode)null;
                    if ((flags & GetLocalValueFlags.CheckKeyframes) != GetLocalValueFlags.None && sceneNode1.ViewModel.AnimationEditor.ActiveStoryboardTimeline != null && this.ShouldAllowAnimation)
                    {
                        SceneNode         ancestor           = (SceneNode)null;
                        PropertyReference propertyReference2 = propertyReference1;
                        SceneNode         sceneNode2         = sceneNode1;
                        if (this.FindAncestor(sceneNode1, out ancestor, ref propertyReference2, new Predicate <SceneNode>(SceneNodeObjectSetBase.IsAnimationParent)))
                        {
                            sceneNode2 = ancestor;
                        }
                        foreach (TimelineSceneNode timelineSceneNode in (IEnumerable <TimelineSceneNode>)sceneNode1.ViewModel.AnimationEditor.ActiveStoryboardTimeline.Children)
                        {
                            TimelineSceneNode.PropertyNodePair elementAndProperty = timelineSceneNode.TargetElementAndProperty;
                            if (elementAndProperty.SceneNode == sceneNode2 && elementAndProperty.PropertyReference != null)
                            {
                                PropertyReference propertyReference3 = SceneNodeObjectSet.FilterProperty(elementAndProperty.SceneNode, elementAndProperty.PropertyReference);
                                if (propertyReference2.Equals((object)propertyReference3))
                                {
                                    KeyFrameAnimationSceneNode animationSceneNode1 = timelineSceneNode as KeyFrameAnimationSceneNode;
                                    FromToAnimationSceneNode   animationSceneNode2 = timelineSceneNode as FromToAnimationSceneNode;
                                    if (animationSceneNode1 != null)
                                    {
                                        KeyFrameSceneNode keyFrameAtTime = animationSceneNode1.GetKeyFrameAtTime(sceneNode1.ViewModel.AnimationEditor.AnimationTime);
                                        if (keyFrameAtTime != null)
                                        {
                                            using ((flags & GetLocalValueFlags.Resolve) == GetLocalValueFlags.None ? this.ViewModel.ForceBaseValue() : (IDisposable)null)
                                            {
                                                other = keyFrameAtTime.ValueNode;
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                    else if (animationSceneNode2 != null)
                                    {
                                        double animationTime = sceneNode1.ViewModel.AnimationEditor.AnimationTime;
                                        using ((flags & GetLocalValueFlags.Resolve) == GetLocalValueFlags.None ? this.ViewModel.ForceBaseValue() : (IDisposable)null)
                                        {
                                            DocumentNodePath documentNodePath = (DocumentNodePath)null;
                                            if (animationTime == animationSceneNode2.Begin + animationSceneNode2.Duration)
                                            {
                                                documentNodePath = animationSceneNode2.GetLocalValueAsDocumentNode(animationSceneNode2.ToProperty);
                                            }
                                            else if (animationTime == animationSceneNode2.Begin)
                                            {
                                                documentNodePath = animationSceneNode2.GetLocalValueAsDocumentNode(animationSceneNode2.FromProperty);
                                            }
                                            other = documentNodePath != null ? documentNodePath.Node : (DocumentNode)null;
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    if (other == null)
                    {
                        if ((flags & GetLocalValueFlags.Resolve) != GetLocalValueFlags.None)
                        {
                            DocumentNodePath valueAsDocumentNode = sceneNode1.GetLocalValueAsDocumentNode(propertyReference1);
                            if (valueAsDocumentNode != null)
                            {
                                other = valueAsDocumentNode.Node;
                            }
                        }
                        else
                        {
                            other = (DocumentNode)sceneNode1.GetLocalValue(propertyReference1, PropertyContext.AsDocumentNodes);
                        }
                    }
                    if (!flag)
                    {
                        if (other == null && (flags & GetLocalValueFlags.SkipCheckIfMixed) != GetLocalValueFlags.None)
                        {
                            isMixed = false;
                            return((DocumentNode)null);
                        }
                        flag         = true;
                        documentNode = other;
                    }
                    else if (documentNode == null && other != null || documentNode != null && !documentNode.Equals(other))
                    {
                        isMixed = true;
                        return((DocumentNode)null);
                    }
                }
            }
            isMixed = false;
            return(documentNode);
        }
示例#16
0
 public AnimationProxyData(FromToAnimationSceneNode optimizedAnimation, KeyFrameAnimationSceneNode proxyAnimation)
 {
     this.OptimizedAnimation = optimizedAnimation;
     this.ProxyAnimation     = proxyAnimation;
 }
示例#17
0
 protected KeyFramedTimelineItem(TimelineItemManager timelineItemManager, SceneElement element, StoryboardTimelineSceneNode parentTimeline, KeyFrameAnimationSceneNode keyFramedAnimationSceneNode)
     : base(timelineItemManager, parentTimeline, (AnimationSceneNode)keyFramedAnimationSceneNode)
 {
     this.keyFrameItems = new ObservableCollection <KeyFrameItem>();
     this.element       = element;
     foreach (KeyFrameSceneNode keyFrameSceneNode in keyFramedAnimationSceneNode.KeyFrames)
     {
         this.AddKeyFrameItem(keyFrameSceneNode.Time);
     }
 }
示例#18
0
        private void UpdateProxyTable(Dictionary <AnimationProxyManager.TargetNamePropertyPair, AnimationProxyManager.AnimationProxyData> proxyTable, StoryboardTimelineSceneNode storyboard, AnimationProxyManager.AllowedChange allowedChange)
        {
            if (allowedChange != AnimationProxyManager.AllowedChange.Any)
            {
                proxyTable.Clear();
            }
            List <KeyFrameAnimationSceneNode> list1 = new List <KeyFrameAnimationSceneNode>();

            foreach (TimelineSceneNode timeline in (IEnumerable <TimelineSceneNode>)storyboard.Children)
            {
                FromToAnimationSceneNode   animationSceneNode = timeline as FromToAnimationSceneNode;
                KeyFrameAnimationSceneNode nodeToTest         = timeline as KeyFrameAnimationSceneNode;
                if (animationSceneNode != null && animationSceneNode.IsOptimized || nodeToTest != null && nodeToTest.IsAnimationProxy)
                {
                    AnimationProxyManager.TargetNamePropertyPair key = new AnimationProxyManager.TargetNamePropertyPair(timeline);
                    if (key.TargetName != null)
                    {
                        AnimationProxyManager.AnimationProxyData animationProxyData;
                        if (!proxyTable.TryGetValue(key, out animationProxyData))
                        {
                            animationProxyData = new AnimationProxyManager.AnimationProxyData((FromToAnimationSceneNode)null, (KeyFrameAnimationSceneNode)null);
                            proxyTable[key]    = animationProxyData;
                        }
                        if (animationSceneNode != null)
                        {
                            animationProxyData.OptimizedAnimation = animationSceneNode;
                        }
                        else
                        {
                            animationProxyData.ProxyAnimation = nodeToTest;
                        }
                    }
                }
                else if (nodeToTest != null && this.CanOptimizeAnimation(nodeToTest))
                {
                    list1.Add(nodeToTest);
                }
            }
            if (allowedChange != AnimationProxyManager.AllowedChange.OnlyNonSerializing && allowedChange != AnimationProxyManager.AllowedChange.Any)
            {
                return;
            }
            if (allowedChange == AnimationProxyManager.AllowedChange.Any)
            {
                foreach (KeyFrameAnimationSceneNode proxyAnimation in list1)
                {
                    FromToAnimationSceneNode optimizedAnimation      = this.ConvertToOptimizedAnimation(proxyAnimation);
                    AnimationProxyManager.TargetNamePropertyPair key = new AnimationProxyManager.TargetNamePropertyPair((TimelineSceneNode)proxyAnimation);
                    AnimationProxyManager.AnimationProxyData     animationProxyData;
                    if (proxyTable.TryGetValue(key, out animationProxyData))
                    {
                        if (animationProxyData.OptimizedAnimation != null && animationProxyData.OptimizedAnimation.IsInDocument)
                        {
                            animationProxyData.OptimizedAnimation.ControllingStoryboard.Children.Remove((TimelineSceneNode)animationProxyData.OptimizedAnimation);
                        }
                        if (animationProxyData.ProxyAnimation != null && animationProxyData.ProxyAnimation.IsInDocument)
                        {
                            animationProxyData.ProxyAnimation.ControllingStoryboard.Children.Remove((TimelineSceneNode)animationProxyData.ProxyAnimation);
                        }
                        proxyTable.Remove(key);
                    }
                    proxyTable.Add(key, new AnimationProxyManager.AnimationProxyData(optimizedAnimation, proxyAnimation));
                }
            }
            List <AnimationProxyManager.TargetNamePropertyPair> list2 = new List <AnimationProxyManager.TargetNamePropertyPair>();

            foreach (KeyValuePair <AnimationProxyManager.TargetNamePropertyPair, AnimationProxyManager.AnimationProxyData> keyValuePair in proxyTable)
            {
                AnimationProxyManager.AnimationProxyData animationProxyData = keyValuePair.Value;
                int count = list2.Count;
                if (animationProxyData.ProxyAnimation != null && !keyValuePair.Key.Equals((object)new AnimationProxyManager.TargetNamePropertyPair((TimelineSceneNode)animationProxyData.ProxyAnimation)))
                {
                    animationProxyData.ProxyAnimation = (KeyFrameAnimationSceneNode)null;
                }
                if (animationProxyData.OptimizedAnimation != null && !keyValuePair.Key.Equals((object)new AnimationProxyManager.TargetNamePropertyPair((TimelineSceneNode)animationProxyData.OptimizedAnimation)))
                {
                    animationProxyData.OptimizedAnimation = (FromToAnimationSceneNode)null;
                }
                if (animationProxyData.OptimizedAnimation == null && animationProxyData.ProxyAnimation == null)
                {
                    list2.Add(keyValuePair.Key);
                }
                else if (animationProxyData.OptimizedAnimation == null || !animationProxyData.OptimizedAnimation.IsInDocument)
                {
                    if (allowedChange == AnimationProxyManager.AllowedChange.Any)
                    {
                        if (animationProxyData.ProxyAnimation != null && animationProxyData.ProxyAnimation.IsInDocument)
                        {
                            this.viewModel.AnimationEditor.RemoveAnimation(storyboard, (TimelineSceneNode)animationProxyData.ProxyAnimation);
                            if (animationProxyData.OptimizedAnimation != null && animationProxyData.OptimizedAnimation.IsInDocument)
                            {
                                animationProxyData.OptimizedAnimation.IsOptimized = false;
                            }
                        }
                        list2.Add(keyValuePair.Key);
                    }
                }
                else if (animationProxyData.ProxyWasUserDeleted && !animationProxyData.OptimizedAnimationAdded)
                {
                    if (allowedChange == AnimationProxyManager.AllowedChange.Any)
                    {
                        this.viewModel.AnimationEditor.RemoveAnimation(storyboard, (TimelineSceneNode)animationProxyData.OptimizedAnimation);
                        list2.Add(keyValuePair.Key);
                    }
                }
                else if (animationProxyData.ProxyAnimation == null || !animationProxyData.ProxyAnimation.IsInDocument)
                {
                    if (allowedChange == AnimationProxyManager.AllowedChange.OnlyNonSerializing || allowedChange == AnimationProxyManager.AllowedChange.Any)
                    {
                        animationProxyData.OptimizedAnimation.Invalidate();
                        if (animationProxyData.OptimizedAnimation.TargetElement != null)
                        {
                            KeyFrameAnimationSceneNode animationSceneNode = KeyFrameAnimationSceneNode.Factory.InstantiateWithTarget(this.viewModel, animationProxyData.OptimizedAnimation.TargetElement, animationProxyData.OptimizedAnimation.TargetProperty, animationProxyData.OptimizedAnimation.StoryboardContainer, KeyFrameAnimationSceneNode.GetKeyFrameAnimationForType(animationProxyData.OptimizedAnimation.AnimatedType, animationProxyData.OptimizedAnimation.ProjectContext));
                            animationSceneNode.AddKeyFrame(animationProxyData.OptimizedAnimation.Duration, animationProxyData.OptimizedAnimation.To);
                            KeyFrameSceneNode keyFrameAtIndex = animationSceneNode.GetKeyFrameAtIndex(0);
                            SceneNode.CopyPropertyValue((SceneNode)animationProxyData.OptimizedAnimation, animationProxyData.OptimizedAnimation.EasingFunctionProperty, (SceneNode)keyFrameAtIndex, keyFrameAtIndex.EasingFunctionProperty);
                            keyFrameAtIndex.ShouldSerialize     = false;
                            animationSceneNode.ShouldSerialize  = false;
                            animationSceneNode.IsAnimationProxy = true;
                            storyboard.Children.Insert(storyboard.Children.IndexOf((TimelineSceneNode)animationProxyData.OptimizedAnimation) + 1, (TimelineSceneNode)animationSceneNode);
                            animationProxyData.ProxyAnimation = animationSceneNode;
                        }
                    }
                }
                else if (!this.CanOptimizeAnimation(animationProxyData.ProxyAnimation))
                {
                    if (allowedChange == AnimationProxyManager.AllowedChange.Any)
                    {
                        this.RemoveOptimizedAndPromoteProxy(animationProxyData);
                        list2.Add(keyValuePair.Key);
                    }
                }
                else if ((!animationProxyData.OptimizedAnimation.IsOptimized || !AnimationProxyManager.CanFromToAnimationBeOptimized(animationProxyData.OptimizedAnimation)) && allowedChange == AnimationProxyManager.AllowedChange.Any)
                {
                    this.viewModel.AnimationEditor.RemoveAnimation(storyboard, (TimelineSceneNode)animationProxyData.ProxyAnimation);
                    animationProxyData.OptimizedAnimation.IsOptimized = false;
                    list2.Add(keyValuePair.Key);
                }
                if (count == list2.Count && allowedChange == AnimationProxyManager.AllowedChange.Any)
                {
                    if (!animationProxyData.OptimizedAnimationPropertyChanged && !animationProxyData.OptimizedAnimationAdded)
                    {
                        this.MovePropertiesFromProxyToOptimized(animationProxyData);
                    }
                    else
                    {
                        this.MovePropertiesFromOptimizedToProxy(animationProxyData);
                    }
                }
                animationProxyData.ResetUpdateState();
            }
            foreach (AnimationProxyManager.TargetNamePropertyPair key in list2)
            {
                proxyTable.Remove(key);
            }
        }
示例#19
0
 public PropertyTimelineItem(TimelineItemManager timelineItemManager, TimelineItem targetTimelineItem, SceneElement targetElement, StoryboardTimelineSceneNode parentTimeline, KeyFrameAnimationSceneNode propertyAnimation)
     : base(timelineItemManager, targetElement, parentTimeline, propertyAnimation)
 {
     this.targetTimelineItem = targetTimelineItem;
     this.targetTimelineItem.PropertyChanged += new PropertyChangedEventHandler(this.TargetTimelineItem_PropertyChanged);
 }
示例#20
0
        private void RecordKeyFrames(Dictionary <double, List <KeyFrameSceneNode> > keyFrames, KeyFrameAnimationSceneNode keyFrameNode)
        {
            PropertyReference targetProperty = keyFrameNode.TargetProperty;

            if (!PlatformTypes.Point.IsAssignableFrom((ITypeId)targetProperty.ValueTypeId))
            {
                return;
            }
            foreach (KeyFrameSceneNode keyFrameSceneNode in keyFrameNode.KeyFrames)
            {
                List <KeyFrameSceneNode> list;
                if (!keyFrames.TryGetValue(keyFrameSceneNode.Time, out list))
                {
                    list = new List <KeyFrameSceneNode>();
                    keyFrames[keyFrameSceneNode.Time] = list;
                }
                list.Add(keyFrameSceneNode);
            }
        }
示例#21
0
        protected static IEnumerable <SceneNode> Enumerate(SceneNode pivot, SearchAxis axis, ISearchPredicate continueTester)
        {
            SceneViewModel viewModel = pivot.ViewModel;

            switch (axis.axisType)
            {
            case SearchAxis.AxisType.DocumentAncestor:
                foreach (DocumentNode node in pivot.DocumentNode.AncestorNodes)
                {
                    SceneNode sceneNode = viewModel.GetSceneNode(node);
                    yield return(sceneNode);

                    if (continueTester != null && !continueTester.Test(sceneNode))
                    {
                        break;
                    }
                }
                break;

            case SearchAxis.AxisType.DocumentParent:
                DocumentNode parentNode = (DocumentNode)pivot.DocumentNode.Parent;
                if (parentNode == null)
                {
                    break;
                }
                yield return(viewModel.GetSceneNode(parentNode));

                break;

            case SearchAxis.AxisType.DocumentChild:
                foreach (DocumentNode node in pivot.DocumentNode.ChildNodes)
                {
                    SceneNode sceneNode = viewModel.GetSceneNode(node);
                    yield return(sceneNode);
                }
                break;

            case SearchAxis.AxisType.DocumentDescendant:
                foreach (DocumentNode node in SearchAxis.TraverseDocumentDescendants(pivot.DocumentNode, continueTester, viewModel))
                {
                    yield return(viewModel.GetSceneNode(node));
                }
                break;

            case SearchAxis.AxisType.DocumentSelfAndDescendant:
                yield return(pivot);

                foreach (DocumentNode node in SearchAxis.TraverseDocumentDescendants(pivot.DocumentNode, continueTester, viewModel))
                {
                    yield return(viewModel.GetSceneNode(node));
                }
                break;

            case SearchAxis.AxisType.Self:
                yield return(pivot);

                break;

            case SearchAxis.AxisType.Root:
                yield return(viewModel.GetSceneNode(pivot.DocumentNode.DocumentRoot.RootNode));

                break;

            case SearchAxis.AxisType.StoryboardContainer:
                SceneNode thisStoryboardContainer = (SceneNode)pivot.StoryboardContainer;
                if (thisStoryboardContainer == null)
                {
                    break;
                }
                yield return(thisStoryboardContainer);

                break;

            case SearchAxis.AxisType.StoryboardAncestor:
                for (IStoryboardContainer cur = pivot.StoryboardContainer; cur != null; cur = cur.TargetElement.StoryboardContainer)
                {
                    yield return((SceneNode)cur);

                    if (continueTester != null && !continueTester.Test((SceneNode)cur))
                    {
                        break;
                    }
                }
                break;

            case SearchAxis.AxisType.ActiveStoryboard:
                if (pivot.ViewModel.ActiveStoryboardTimeline == null)
                {
                    break;
                }
                yield return((SceneNode)pivot.ViewModel.ActiveStoryboardTimeline);

                break;

            case SearchAxis.AxisType.Animations:
                StoryboardTimelineSceneNode storyboard = pivot as StoryboardTimelineSceneNode;
                if (storyboard == null)
                {
                    break;
                }
                foreach (TimelineSceneNode timelineSceneNode in (IEnumerable <TimelineSceneNode>)storyboard.Children)
                {
                    yield return((SceneNode)timelineSceneNode);
                }
                break;

            case SearchAxis.AxisType.KeyFrames:
                KeyFrameAnimationSceneNode keyFrameAnimation = pivot as KeyFrameAnimationSceneNode;
                if (keyFrameAnimation == null)
                {
                    break;
                }
                foreach (KeyFrameSceneNode keyFrameSceneNode in keyFrameAnimation.KeyFrames)
                {
                    yield return((SceneNode)keyFrameSceneNode);
                }
                break;

            case SearchAxis.AxisType.SceneAncestor:
                for (SceneNode parent = pivot.Parent; parent != null; parent = parent.Parent)
                {
                    yield return(parent);

                    if (continueTester != null && !continueTester.Test(parent))
                    {
                        break;
                    }
                }
                break;

            case SearchAxis.AxisType.SceneParent:
                SceneNode node1 = pivot.Parent;
                if (node1 == null)
                {
                    break;
                }
                yield return(node1);

                break;

            case SearchAxis.AxisType.SceneChild:
                DocumentCompositeNode docNode = pivot.DocumentNode as DocumentCompositeNode;
                if (docNode == null)
                {
                    break;
                }
                if (docNode.SupportsChildren)
                {
                    ISceneNodeCollection <SceneNode> children = pivot.GetChildren();
                    for (int i = 0; i < children.Count; ++i)
                    {
                        yield return(children[i]);
                    }
                    break;
                }
                foreach (IPropertyId propertyKey in (IEnumerable <IProperty>)docNode.Properties.Keys)
                {
                    SceneNode subNode = pivot.GetLocalValueAsSceneNode(propertyKey);
                    yield return(subNode);
                }
                break;

            case SearchAxis.AxisType.SceneDescendant:
                IEnumerator <SceneNode> descendantEnumerator = (IEnumerator <SceneNode>) new SearchAxis.SceneDescendantTraversalEnumerator(pivot, continueTester);
                while (descendantEnumerator.MoveNext())
                {
                    yield return(descendantEnumerator.Current);
                }
                break;

            case SearchAxis.AxisType.Property:
                IProperty resolvedProperty = pivot.ProjectContext.ResolveProperty(axis.Property);
                if (resolvedProperty == null)
                {
                    break;
                }
                SceneNode node2 = pivot.GetLocalValueAsSceneNode((IPropertyId)resolvedProperty);
                if (node2 == null)
                {
                    break;
                }
                yield return(node2);

                break;

            case SearchAxis.AxisType.CollectionChild:
                SceneNode node3 = pivot.GetChildren()[axis.ChildIndex];
                if (node3 == null)
                {
                    break;
                }
                yield return(node3);

                break;
            }
        }