1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Artemis/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs

89 lines
3.1 KiB
C#

using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive;
using System.Reactive.Disposables;
using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.DryIoc.Factories;
using Artemis.UI.Shared;
using PropertyChanged.SourceGenerator;
using ReactiveUI;
using RGB.NET.Core;
using SkiaSharp;
namespace Artemis.UI.Screens.Device;
public partial class DevicePropertiesViewModel : DialogViewModelBase<object>
{
private readonly IDeviceVmFactory _deviceVmFactory;
[Notify] private ArtemisDevice _device;
public DevicePropertiesViewModel(ArtemisDevice device, IRenderService renderService, IDeviceService deviceService, IDeviceVmFactory deviceVmFactory)
{
_deviceVmFactory = deviceVmFactory;
_device = device;
SelectedLeds = new ObservableCollection<ArtemisLed>();
Tabs = new ObservableCollection<ActivatableViewModelBase>();
AddTabs();
this.WhenActivated(d =>
{
deviceService.DeviceAdded += DeviceServiceOnDeviceAdded;
deviceService.DeviceRemoved += DeviceServiceOnDeviceRemoved;
renderService.FrameRendering += RenderServiceOnFrameRendering;
Disposable.Create(() =>
{
deviceService.DeviceAdded -= DeviceServiceOnDeviceAdded;
deviceService.DeviceRemoved -= DeviceServiceOnDeviceRemoved;
renderService.FrameRendering -= RenderServiceOnFrameRendering;
}).DisposeWith(d);
});
ClearSelectedLeds = ReactiveCommand.Create(ExecuteClearSelectedLeds);
}
public ObservableCollection<ArtemisLed> SelectedLeds { get; }
public ObservableCollection<ActivatableViewModelBase> Tabs { get; }
public ReactiveCommand<Unit, Unit> ClearSelectedLeds { get; }
private void DeviceServiceOnDeviceAdded(object? sender, DeviceEventArgs e)
{
if (e.Device.Identifier != Device.Identifier || Device == e.Device)
return;
Device = e.Device;
AddTabs();
}
private void DeviceServiceOnDeviceRemoved(object? sender, DeviceEventArgs e)
{
Tabs.Clear();
SelectedLeds.Clear();
}
private void AddTabs()
{
Tabs.Add(_deviceVmFactory.DeviceGeneralTabViewModel(Device));
Tabs.Add(_deviceVmFactory.DeviceLayoutTabViewModel(Device));
if (Device.DeviceType == RGBDeviceType.Keyboard)
Tabs.Add(_deviceVmFactory.InputMappingsTabViewModel(Device, SelectedLeds));
Tabs.Add(_deviceVmFactory.DeviceLedsTabViewModel(Device, SelectedLeds));
}
private void ExecuteClearSelectedLeds()
{
SelectedLeds.Clear();
}
private void RenderServiceOnFrameRendering(object? sender, FrameRenderingEventArgs e)
{
if (!SelectedLeds.Any())
return;
using SKPaint highlightPaint = new() {Color = SKColors.White};
using SKPaint dimPaint = new() {Color = new SKColor(0, 0, 0, 192)};
foreach (ArtemisLed artemisLed in Device.Leds)
e.Canvas.DrawRect(artemisLed.AbsoluteRectangle, SelectedLeds.Contains(artemisLed) ? highlightPaint : dimPaint);
}
}