Fixed disposer?

This commit is contained in:
TheXamlGuy
2024-01-28 19:31:09 +00:00
parent 6d40220412
commit 3917639e8d
10 changed files with 79 additions and 88 deletions
@@ -4,7 +4,8 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:interactions="using:Microsoft.Xaml.Interactions.Core"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity">
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
Visibility="{x:Bind ViewModel.Visible, Mode=OneWay}">
<UserControl.Resources>
<SolidColorBrush x:Key="ButtonBackground" Color="Transparent" />
<SolidColorBrush x:Key="ButtonBorderBrush" Color="Transparent" />
@@ -8,4 +8,6 @@ public sealed partial class MediaButtonView :
{
public MediaButtonView() =>
this.InitializeComponent(ref _contentLoaded);
private MediaButtonViewModel ViewModel => (MediaButtonViewModel)DataContext;
}
@@ -2,27 +2,19 @@
namespace Hyperbar.Widget.MediaController.Windows;
public class MediaButtonViewModel :
WidgetButtonViewModel,
public class MediaButtonViewModel(IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer,
ITemplateFactory templateFactory,
PlaybackButtonType buttonType,
Guid guid = default,
string? text = null,
string? icon = null,
RelayCommand? command = null) :
WidgetButtonViewModel(serviceFactory, mediator, disposer, templateFactory, guid, text, icon, command),
IInitialization,
INotificationHandler<Changed<PlaybackInformation>>
{
private readonly PlaybackButtonType buttonType;
public MediaButtonViewModel(IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer,
ITemplateFactory templateFactory,
PlaybackButtonType buttonType,
Guid guid = default,
string? text = null,
string? icon = null,
RelayCommand? command = null) : base (serviceFactory, mediator, disposer, templateFactory, guid, text, icon, command)
{
this.buttonType = buttonType;
mediator.Subscribe(this);
}
public Task Handle(Changed<PlaybackInformation> notification,
CancellationToken cancellationToken)
{
@@ -31,10 +23,10 @@ public class MediaButtonViewModel :
switch (buttonType)
{
case PlaybackButtonType.Play:
Visible = information.Status is PlaybackStatus.Playing;
Visible = information.Status is PlaybackStatus.Paused;
break;
case PlaybackButtonType.Pause:
Visible = information.Status is PlaybackStatus.Paused;
Visible = information.Status is PlaybackStatus.Playing;
break;
}
}
@@ -5,28 +5,31 @@ namespace Hyperbar.Widget.MediaController.Windows;
public class MediaControllerHandler(IMediator mediator,
IServiceScopeProvider<MediaController> scopeProvider,
ICache<MediaController, MediaControllerViewModel> cache) :
INotificationHandler<Created<MediaController>>
INotificationHandler<Created<MediaController>>,
INotificationHandler<Removed<MediaController>>
{
public async Task Handle(Created<MediaController> notification,
CancellationToken cancellationToken)
{
if (notification.Value is MediaController mediaController)
if (notification.Value is MediaController mediaController &&
scopeProvider.TryGet(mediaController, out IServiceScope? serviceScope) &&
serviceScope?.ServiceProvider.GetService<IFactory<MediaController, MediaControllerViewModel?>>()
is IFactory<MediaController, MediaControllerViewModel?> factory &&
factory.Create(mediaController) is MediaControllerViewModel viewModel)
{
if (scopeProvider.TryGet(mediaController, out IServiceScope? serviceScope))
cache.Add(mediaController, viewModel);
await mediator.PublishAsync(new Created<MediaControllerViewModel>(viewModel), cancellationToken);
}
}
if (serviceScope is not null)
{
if (serviceScope.ServiceProvider.GetService<IFactory<MediaController, MediaControllerViewModel?>>()
is IFactory<MediaController, MediaControllerViewModel?> factory)
{
if (factory.Create(mediaController) is MediaControllerViewModel mediaControllerViewModel)
{
cache.Add(mediaController, mediaControllerViewModel);
await mediator.PublishAsync(new Created<MediaControllerViewModel>(mediaControllerViewModel),
cancellationToken);
}
}
}
public async Task Handle(Removed<MediaController> notification, CancellationToken cancellationToken)
{
if (notification.Value is MediaController mediaController &&
cache.TryGetValue(mediaController, out MediaControllerViewModel? viewModel) &&
viewModel is not null)
{
await mediator.PublishAsync(new Removed<MediaControllerViewModel>(viewModel), cancellationToken);
cache.Remove(mediaController);
}
}
}
@@ -48,7 +48,7 @@ public class MediaControllerManager(IMediator mediator,
{
if (!sessions.Any(x => x.SourceAppUserModelId == session.Key.SourceAppUserModelId))
{
await dispatcher.InvokeAsync(() => disposer.Dispose(session.Value));
await mediator.PublishAsync(new Removed<MediaController>(session.Value));
cache.Remove(session);
}
}
@@ -30,8 +30,6 @@ public class MediaControllerViewModel :
Add<MediaButtonViewModel>(PlaybackButtonType.Forward,
"Forward", "\uEB9D",
new RelayCommand(async () => await mediator.PublishAsync<Forward>()));
mediator.Subscribe(this);
}
public ITemplateFactory TemplateFactory { get; set; }