StyleActivatorExtensions.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System;
  2. using System.Reactive.Linq;
  3. using System.Threading.Tasks;
  4. using Avalonia.Reactive;
  5. using Avalonia.Styling.Activators;
  6. using Observable = Avalonia.Reactive.Observable;
  7. namespace Avalonia.Base.UnitTests.Styling
  8. {
  9. internal static class StyleActivatorExtensions
  10. {
  11. public static IDisposable Subscribe(this IStyleActivator activator, Action<bool> action)
  12. {
  13. return Observable.Subscribe(activator.ToObservable(), action);
  14. }
  15. public static async Task<bool> Take(this IStyleActivator activator, int value)
  16. {
  17. return await System.Reactive.Linq.Observable.Take(activator.ToObservable(), value);
  18. }
  19. public static IObservable<bool> ToObservable(this IStyleActivator activator)
  20. {
  21. if (activator == null)
  22. {
  23. throw new ArgumentNullException(nameof(activator));
  24. }
  25. return new ObservableAdapter(activator);
  26. }
  27. private class ObservableAdapter : LightweightObservableBase<bool>, IStyleActivatorSink
  28. {
  29. private readonly IStyleActivator _source;
  30. public ObservableAdapter(IStyleActivator source) => _source = source;
  31. protected override void Initialize() => _source.Subscribe(this);
  32. protected override void Deinitialize() => _source.Unsubscribe(this);
  33. protected override void Subscribed(IObserver<bool> observer, bool first)
  34. {
  35. observer.OnNext(_source.GetIsActive());
  36. }
  37. void IStyleActivatorSink.OnNext(bool value)
  38. {
  39. PublishNext(value);
  40. }
  41. }
  42. }
  43. }