From 2d38eb826435bc5ccc8b12d297ca1a96d7431fab Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 21 Sep 2022 11:04:21 +0200 Subject: [PATCH] Attach animations in styles. --- src/Avalonia.Base/Styling/StyleBase.cs | 6 +++- src/Avalonia.Base/Styling/StyleInstance.cs | 33 +++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Base/Styling/StyleBase.cs b/src/Avalonia.Base/Styling/StyleBase.cs index 4ae48c8882..c914fbf8cc 100644 --- a/src/Avalonia.Base/Styling/StyleBase.cs +++ b/src/Avalonia.Base/Styling/StyleBase.cs @@ -99,7 +99,7 @@ namespace Avalonia.Styling instance = new StyleInstance(this, activator); - if (_setters is object) + if (_setters is not null) { foreach (var setter in _setters) { @@ -109,6 +109,9 @@ namespace Avalonia.Styling } } + if (_animations is not null) + instance.Add(_animations); + if (canShareInstance) { instance.MakeShared(); @@ -117,6 +120,7 @@ namespace Avalonia.Styling } ao.GetValueStore().AddFrame(instance); + instance.ApplyAnimations(ao); return instance; } diff --git a/src/Avalonia.Base/Styling/StyleInstance.cs b/src/Avalonia.Base/Styling/StyleInstance.cs index c2dd55b6f7..3aae5f1d08 100644 --- a/src/Avalonia.Base/Styling/StyleInstance.cs +++ b/src/Avalonia.Base/Styling/StyleInstance.cs @@ -1,5 +1,8 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Reactive.Subjects; +using Avalonia.Animation; using Avalonia.Data; using Avalonia.PropertyStore; using Avalonia.Styling.Activators; @@ -20,6 +23,8 @@ namespace Avalonia.Styling { private readonly IStyleActivator? _activator; private List? _setters; + private List? _animations; + private Subject? _animationTrigger; public StyleInstance(IStyle style, IStyleActivator? activator) { @@ -35,7 +40,11 @@ namespace Avalonia.Styling get { if (_activator?.IsSubscribed == false) + { _activator.Subscribe(this); + _animationTrigger?.OnNext(_activator.IsActive); + } + return _activator?.IsActive ?? true; } } @@ -55,6 +64,24 @@ namespace Avalonia.Styling (_setters ??= new()).Add(instance); } + public void Add(IList animations) + { + if (_animations is null) + _animations = new List(animations); + else + _animations.AddRange(animations); + } + + public void ApplyAnimations(AvaloniaObject control) + { + if (_animations is not null && control is Animatable animatable) + { + _animationTrigger ??= new Subject(); + foreach (var animation in _animations) + animation.Apply(animatable, null, _animationTrigger); + } + } + public override void Dispose() { base.Dispose(); @@ -63,6 +90,10 @@ namespace Avalonia.Styling 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); + } } }