Browse Source

Allow clocks to be bindable and inherited down the logical tree.

pull/1715/head
Jeremy Koritzinsky 8 years ago
parent
commit
ec9c61bbbe
  1. 23
      src/Avalonia.Animation/Animatable.cs
  2. 4
      src/Avalonia.Animation/AnimationInstance`1.cs
  3. 2
      src/Avalonia.Animation/TransitionInstance.cs
  4. 19
      src/Avalonia.Styling/Styling/Style.cs
  5. 2
      src/Avalonia.Visuals/Animation/TransformAnimator.cs

23
src/Avalonia.Animation/Animatable.cs

@ -18,25 +18,10 @@ namespace Avalonia.Animation
public static readonly StyledProperty<IClock> ClockProperty =
AvaloniaProperty.Register<Animatable, IClock>(nameof(Clock), inherits: true);
/// <summary>
/// Defines the <see cref="PlayState"/> property.
/// </summary>
public static readonly DirectProperty<Animatable, PlayState> PlayStateProperty =
AvaloniaProperty.RegisterDirect<Animatable, PlayState>(
nameof(PlayState),
o => o.PlayState,
(o, v) => o.PlayState = v);
private PlayState _playState = PlayState.Run;
/// <summary>
/// Gets or sets the state of the animation for this
/// control.
/// </summary>
public PlayState PlayState
public IClock Clock
{
get { return _playState; }
set { SetAndRaise(PlayStateProperty, ref _playState, value); }
get => GetValue(ClockProperty);
set => SetValue(ClockProperty, value);
}
/// <summary>
@ -72,7 +57,7 @@ namespace Avalonia.Animation
if (match != null)
{
match.Apply(this, Clock.GlobalClock, e.OldValue, e.NewValue);
match.Apply(this, Clock ?? Avalonia.Animation.Clock.GlobalClock, e.OldValue, e.NewValue);
}
}
}

4
src/Avalonia.Animation/AnimationInstance`1.cs

@ -34,7 +34,7 @@ namespace Avalonia.Animation
private Action _onCompleteAction;
private Func<double, T, T> _interpolator;
private IDisposable _timerSubscription;
private readonly Clock _clock;
private readonly IClock _clock;
public AnimationInstance(Animation animation, Animatable control, Animator<T> animator, Clock clock, Action OnComplete, Func<double, T, T> Interpolator)
{
@ -117,7 +117,7 @@ namespace Avalonia.Animation
private void DoPlayStatesAndTime(TimeSpan systemTime)
{
if (_clock.PlayState == PlayState.Stop || _targetControl.PlayState == PlayState.Stop)
if (_clock.PlayState == PlayState.Stop)
DoComplete();
if (!_gotFirstKFValue)

2
src/Avalonia.Animation/TransitionInstance.cs

@ -18,7 +18,7 @@ namespace Avalonia.Animation
private IDisposable timerSubscription;
private TimeSpan startTime;
private TimeSpan duration;
private readonly Clock _clock;
private readonly IClock _clock;
public TransitionInstance(Clock clock, TimeSpan Duration)
{

19
src/Avalonia.Styling/Styling/Style.cs

@ -111,17 +111,20 @@ namespace Avalonia.Styling
{
var subs = GetSubscriptions(control);
foreach (var animation in Animations)
if (control is Animatable animatable)
{
IObservable<bool> obsMatch = match.ObservableResult;
if (match.ImmediateResult == true)
foreach (var animation in Animations)
{
obsMatch = Observable.Return(true);
}
IObservable<bool> obsMatch = match.ObservableResult;
var sub = animation.Apply((Animatable)control, Clock.GlobalClock, obsMatch);
subs.Add(sub);
if (match.ImmediateResult == true)
{
obsMatch = Observable.Return(true);
}
var sub = animation.Apply(animatable, animatable.Clock ?? Clock.GlobalClock, obsMatch);
subs.Add(sub);
}
}
foreach (var setter in Setters)

2
src/Avalonia.Visuals/Animation/TransformAnimator.cs

@ -12,7 +12,7 @@ namespace Avalonia.Animation
DoubleAnimator childKeyFrames;
/// <inheritdoc/>
public override IDisposable Apply(Animation animation, Animatable control, Clock clock, IObservable<bool> obsMatch, Action onComplete)
public override IDisposable Apply(Animation animation, Animatable control, IClock clock, IObservable<bool> obsMatch, Action onComplete)
{
var ctrl = (Visual)control;

Loading…
Cancel
Save