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; } } } }
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); }