Exemplo n.º 1
0
        public static void Perform(object @object, string propertyPath, object value, bool createAnimatorIfNeeded = false, bool createInitialKeyframeForNewAnimator = true, int atFrame = -1)
        {
            IAnimator animator;
            var       animationHost = @object as IAnimationHost;
            object    owner         = @object;
            int       index         = -1;

            AnimationUtils.PropertyData propertyData = AnimationUtils.PropertyData.Empty;
            if (animationHost != null)
            {
                (propertyData, owner, index) = AnimationUtils.GetPropertyByPath(animationHost, propertyPath);
            }
            if (index == -1)
            {
                SetProperty.Perform(owner, propertyData.Info?.Name ?? propertyPath, value);
            }
            else
            {
                SetIndexedProperty.Perform(owner, propertyData.Info?.Name ?? propertyPath, index, value);
            }
            if (animationHost != null && (animationHost.Animators.TryFind(propertyPath, out animator, Document.Current.AnimationId) || createAnimatorIfNeeded))
            {
                if (animator == null && createInitialKeyframeForNewAnimator)
                {
                    var propertyValue = propertyData.Info.GetValue(owner);
                    Perform(animationHost, propertyPath, propertyValue, true, false, 0);
                }

                int savedFrame = -1;
                if (atFrame >= 0 && Document.Current.AnimationFrame != atFrame)
                {
                    savedFrame = Document.Current.AnimationFrame;
                    Document.Current.AnimationFrame = atFrame;
                }

                try {
                    var type = propertyData.Info.PropertyType;
                    var key  =
                        animator?.ReadonlyKeys.GetByFrame(Document.Current.AnimationFrame)?.Clone() ??
                        Keyframe.CreateForType(type);
                    key.Frame    = Document.Current.AnimationFrame;
                    key.Function = animator?.Keys.LastOrDefault(k => k.Frame <= key.Frame)?.Function ?? KeyFunction.Linear;
                    key.Value    = value;
                    SetKeyframe.Perform(animationHost, propertyPath, Document.Current.AnimationId, key);
                } finally {
                    if (savedFrame >= 0)
                    {
                        Document.Current.AnimationFrame = savedFrame;
                    }
                }
            }
        }
Exemplo n.º 2
0
        private List <string> GetPaths()
        {
            var result = new List <string>();

            foreach (var obj in EditorParams.Objects)
            {
                var animationHost = obj as IAnimationHost;
                var owner         = obj;
                AnimationUtils.PropertyData propertyData = AnimationUtils.PropertyData.Empty;
                if (animationHost != null)
                {
                    (propertyData, owner, _) = AnimationUtils.GetPropertyByPath(animationHost, EditorParams.PropertyPath);
                }
                if (propertyData.Info != null)
                {
                    result.Add(ValueToStringConverter((T)propertyData.Info.GetValue(owner)));
                }
                else
                {
                    result.Add(ValueToStringConverter((T)owner.GetType().GetProperty(EditorParams.PropertyName).GetValue(owner)));
                }
            }
            return(result);
        }