private void ScaleKeyframes() { var boundaries = GridSelection.GetSelectionBoundaries(); if (boundaries.HasValue || Scale < Mathf.ZeroTolerance) { var saved = new List <IKeyframe>(); for (int i = boundaries.Value.Top; i <= boundaries.Value.Bottom; ++i) { if (!(Document.Current.Rows[i].Components.Get <NodeRow>()?.Node is IAnimationHost animable)) { continue; } foreach (var animator in animable.Animators.ToList()) { saved.Clear(); IEnumerable <IKeyframe> keys = animator.ReadonlyKeys.Where(k => k.Frame >= boundaries.Value.Left && k.Frame < boundaries.Value.Right ).ToList(); if (Scale < 1) { keys = keys.Reverse().ToList(); } foreach (var key in keys) { saved.Add(key); RemoveKeyframe.Perform(animator, key.Frame); } foreach (var key in saved) { // The formula should behave similiar to stretching animation with mouse int newFrame = (int)( boundaries.Value.Left + (key.Frame - boundaries.Value.Left) * (1 + (boundaries.Value.Left - boundaries.Value.Right) * Scale) / (1 + boundaries.Value.Left - boundaries.Value.Right) ); var newKey = key.Clone(); newKey.Frame = newFrame; SetAnimableProperty.Perform( animable, animator.TargetPropertyPath, newKey.Value, createAnimatorIfNeeded: true, createInitialKeyframeForNewAnimator: false, newKey.Frame ); SetKeyframe.Perform(animable, animator.TargetPropertyPath, Document.Current.AnimationId, newKey); } } } ClearGridSelection.Perform(); for (int i = boundaries.Value.Top; i <= boundaries.Value.Bottom; ++i) { SelectGridSpan.Perform(i, boundaries.Value.Left, (int)(boundaries.Value.Left + (boundaries.Value.Right - boundaries.Value.Left) * Scale)); } } else { Document.Current.History.RollbackTransaction(); } }
private void ScaleKeyframes() { if (GridSelection.GetSelectionBoundaries(out var boundaries) && Scale > Mathf.ZeroTolerance) { var processed = new HashSet <IAnimator>(); var saved = new List <IKeyframe>(); foreach (var animable in GridSelection.EnumerateAnimators(boundaries)) { foreach (var animator in animable.Animators) { if (animator.AnimationId != Document.Current.AnimationId || processed.Contains(animator)) { continue; } processed.Add(animator); saved.Clear(); IEnumerable <IKeyframe> keys = animator.ReadonlyKeys.Where(k => k.Frame >= boundaries.Left && k.Frame < boundaries.Right ).ToList(); if (Scale < 1) { keys = keys.Reverse().ToList(); } foreach (var key in keys) { saved.Add(key); RemoveKeyframe.Perform(animator, key.Frame); } foreach (var key in saved) { // The formula should behave similiar to stretching animation with mouse int newFrame = (int)( boundaries.Left + (key.Frame - boundaries.Left) * (1 + (boundaries.Left - boundaries.Right) * Scale) / (1 + boundaries.Left - boundaries.Right) ); var newKey = key.Clone(); newKey.Frame = newFrame; SetAnimableProperty.Perform( animable.Host, animator.TargetPropertyPath, newKey.Value, createAnimatorIfNeeded: true, createInitialKeyframeForNewAnimator: false, newKey.Frame ); SetKeyframe.Perform(animable.Host, animator.TargetPropertyPath, Document.Current.AnimationId, newKey); } } } ClearGridSelection.Perform(); for (int i = boundaries.Top; i <= boundaries.Bottom; ++i) { SelectGridSpan.Perform(i, boundaries.Left, (int)(boundaries.Left + (boundaries.Right - boundaries.Left) * Scale)); } }
private IEnumerator <object> Drag(IntRectangle boundaries, DragSide side) { IntVector2?last = null; Save(boundaries); bool isStretchingMarkers = input.IsKeyPressed(Key.Control); using (Document.Current.History.BeginTransaction()) { while (input.IsMousePressed()) { Utils.ChangeCursorIfDefault(MouseCursor.SizeWE); var current = grid.CellUnderMouse(); if (current == last) { yield return(null); continue; } Document.Current.History.RollbackTransaction(); current.X = Math.Max(current.X, 0); if (side == DragSide.Left) { current.X = Math.Min(current.X, boundaries.Right - 1); } else { current.X = Math.Max(current.X, boundaries.Left + 1); } Stretch(boundaries, side, current.X, stretchMarkers: isStretchingMarkers); if (side == DragSide.Left) { boundaries.Left = current.X; } else { boundaries.Right = current.X; } ClearGridSelection.Perform(); for (int i = boundaries.Top; i <= boundaries.Bottom; ++i) { SelectGridSpan.Perform(i, boundaries.Left, boundaries.Right); } SetCurrentColumn.Perform(boundaries.Right); last = current; yield return(null); } Document.Current.History.CommitTransaction(); } yield return(null); }