Browse Source

Attach animations in styles.

pull/8600/head
Steven Kirk 4 years ago
parent
commit
2d38eb8264
  1. 6
      src/Avalonia.Base/Styling/StyleBase.cs
  2. 33
      src/Avalonia.Base/Styling/StyleInstance.cs

6
src/Avalonia.Base/Styling/StyleBase.cs

@ -99,7 +99,7 @@ namespace Avalonia.Styling
instance = new StyleInstance(this, activator); instance = new StyleInstance(this, activator);
if (_setters is object) if (_setters is not null)
{ {
foreach (var setter in _setters) foreach (var setter in _setters)
{ {
@ -109,6 +109,9 @@ namespace Avalonia.Styling
} }
} }
if (_animations is not null)
instance.Add(_animations);
if (canShareInstance) if (canShareInstance)
{ {
instance.MakeShared(); instance.MakeShared();
@ -117,6 +120,7 @@ namespace Avalonia.Styling
} }
ao.GetValueStore().AddFrame(instance); ao.GetValueStore().AddFrame(instance);
instance.ApplyAnimations(ao);
return instance; return instance;
} }

33
src/Avalonia.Base/Styling/StyleInstance.cs

@ -1,5 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Reactive.Subjects;
using Avalonia.Animation;
using Avalonia.Data; using Avalonia.Data;
using Avalonia.PropertyStore; using Avalonia.PropertyStore;
using Avalonia.Styling.Activators; using Avalonia.Styling.Activators;
@ -20,6 +23,8 @@ namespace Avalonia.Styling
{ {
private readonly IStyleActivator? _activator; private readonly IStyleActivator? _activator;
private List<ISetterInstance>? _setters; private List<ISetterInstance>? _setters;
private List<IAnimation>? _animations;
private Subject<bool>? _animationTrigger;
public StyleInstance(IStyle style, IStyleActivator? activator) public StyleInstance(IStyle style, IStyleActivator? activator)
{ {
@ -35,7 +40,11 @@ namespace Avalonia.Styling
get get
{ {
if (_activator?.IsSubscribed == false) if (_activator?.IsSubscribed == false)
{
_activator.Subscribe(this); _activator.Subscribe(this);
_animationTrigger?.OnNext(_activator.IsActive);
}
return _activator?.IsActive ?? true; return _activator?.IsActive ?? true;
} }
} }
@ -55,6 +64,24 @@ namespace Avalonia.Styling
(_setters ??= new()).Add(instance); (_setters ??= new()).Add(instance);
} }
public void Add(IList<IAnimation> animations)
{
if (_animations is null)
_animations = new List<IAnimation>(animations);
else
_animations.AddRange(animations);
}
public void ApplyAnimations(AvaloniaObject control)
{
if (_animations is not null && control is Animatable animatable)
{
_animationTrigger ??= new Subject<bool>();
foreach (var animation in _animations)
animation.Apply(animatable, null, _animationTrigger);
}
}
public override void Dispose() public override void Dispose()
{ {
base.Dispose(); base.Dispose();
@ -63,6 +90,10 @@ namespace Avalonia.Styling
public new void MakeShared() => base.MakeShared(); public new void MakeShared() => base.MakeShared();
void IStyleActivatorSink.OnNext(bool value, int tag) => Owner?.OnFrameActivationChanged(this); void IStyleActivatorSink.OnNext(bool value, int tag)
{
Owner?.OnFrameActivationChanged(this);
_animationTrigger?.OnNext(value);
}
} }
} }

Loading…
Cancel
Save