From 212d13c1c807e3091970373d8fbe9643ce4cdd23 Mon Sep 17 00:00:00 2001 From: Robert Date: Sun, 21 Aug 2022 20:15:43 +0200 Subject: [PATCH] Device dialog - Recreate tabs on device reload --- .../Screens/Device/DevicePropertiesView.axaml | 23 ++++++--- .../Device/DevicePropertiesViewModel.cs | 50 +++++++++++++++---- .../SurfaceEditor/SurfaceEditorViewModel.cs | 32 +++++++++++- 3 files changed, 86 insertions(+), 19 deletions(-) diff --git a/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml b/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml index 4c1b080a6..4cc1f6a55 100644 --- a/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml +++ b/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml @@ -37,7 +37,7 @@ ShowColors="True" Margin="20" LedClicked="DeviceVisualizer_OnLedClicked" - Clicked="DeviceVisualizer_OnClicked"/> + Clicked="DeviceVisualizer_OnClicked" /> - - - - - - - + + + + + + + + + + Waiting for device... + + + + diff --git a/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs b/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs index b29985ac1..98ea28983 100644 --- a/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs +++ b/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs @@ -14,20 +14,22 @@ namespace Artemis.UI.Screens.Device; public class DevicePropertiesViewModel : DialogViewModelBase { - public DevicePropertiesViewModel(ArtemisDevice device, ICoreService coreService, IDeviceVmFactory deviceVmFactory) + private readonly IDeviceVmFactory _deviceVmFactory; + private ArtemisDevice _device; + + public DevicePropertiesViewModel(ArtemisDevice device, ICoreService coreService, IRgbService rgbService, IDeviceVmFactory deviceVmFactory) { - Device = device; + _deviceVmFactory = deviceVmFactory; + _device = device; + SelectedLeds = new ObservableCollection(); Tabs = new ObservableCollection(); - Tabs.Add(deviceVmFactory.DevicePropertiesTabViewModel(device)); - Tabs.Add(deviceVmFactory.DeviceInfoTabViewModel(device)); - if (Device.DeviceType == RGBDeviceType.Keyboard) - Tabs.Add(deviceVmFactory.InputMappingsTabViewModel(device, SelectedLeds)); - Tabs.Add(deviceVmFactory.DeviceLedsTabViewModel(device, SelectedLeds)); - + AddTabs(); this.WhenActivated(d => { + rgbService.DeviceAdded += RgbServiceOnDeviceAdded; + rgbService.DeviceRemoved += RgbServiceOnDeviceRemoved; coreService.FrameRendering += CoreServiceOnFrameRendering; Disposable.Create(() => coreService.FrameRendering -= CoreServiceOnFrameRendering).DisposeWith(d); }); @@ -35,12 +37,40 @@ public class DevicePropertiesViewModel : DialogViewModelBase ClearSelectedLeds = ReactiveCommand.Create(ExecuteClearSelectedLeds); } - public ArtemisDevice Device { get; } + private void RgbServiceOnDeviceAdded(object? sender, DeviceEventArgs e) + { + if (e.Device.Identifier != Device.Identifier || Device == e.Device) + return; + + Device = e.Device; + AddTabs(); + } + + private void RgbServiceOnDeviceRemoved(object? sender, DeviceEventArgs e) + { + Tabs.Clear(); + SelectedLeds.Clear(); + } + + public ArtemisDevice Device + { + get => _device; + set => RaiseAndSetIfChanged(ref _device, value); + } + public ObservableCollection SelectedLeds { get; } public ObservableCollection Tabs { get; } - public ReactiveCommand ClearSelectedLeds { get; } + private void AddTabs() + { + Tabs.Add(_deviceVmFactory.DevicePropertiesTabViewModel(Device)); + Tabs.Add(_deviceVmFactory.DeviceInfoTabViewModel(Device)); + if (Device.DeviceType == RGBDeviceType.Keyboard) + Tabs.Add(_deviceVmFactory.InputMappingsTabViewModel(Device, SelectedLeds)); + Tabs.Add(_deviceVmFactory.DeviceLedsTabViewModel(Device, SelectedLeds)); + } + private void ExecuteClearSelectedLeds() { SelectedLeds.Clear(); diff --git a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs index 23be61398..c642578a5 100644 --- a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs +++ b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs @@ -21,6 +21,7 @@ public class SurfaceEditorViewModel : MainScreenViewModel private readonly IDeviceService _deviceService; private readonly IDeviceVmFactory _deviceVmFactory; private readonly IRgbService _rgbService; + private readonly ISurfaceVmFactory _surfaceVmFactory; private readonly ISettingsService _settingsService; private readonly IWindowService _windowService; private bool _colorDevices; @@ -39,6 +40,7 @@ public class SurfaceEditorViewModel : MainScreenViewModel IDeviceService deviceService) : base(hostScreen, "surface-editor") { _rgbService = rgbService; + _surfaceVmFactory = surfaceVmFactory; _settingsService = settingsService; _deviceVmFactory = deviceVmFactory; _windowService = windowService; @@ -59,10 +61,38 @@ public class SurfaceEditorViewModel : MainScreenViewModel this.WhenActivated(d => { coreService.FrameRendering += CoreServiceOnFrameRendering; - Disposable.Create(() => coreService.FrameRendering -= CoreServiceOnFrameRendering).DisposeWith(d); + _rgbService.DeviceAdded += RgbServiceOnDeviceAdded; + _rgbService.DeviceRemoved += RgbServiceOnDeviceRemoved; + Disposable.Create(() => + { + coreService.FrameRendering -= CoreServiceOnFrameRendering; + _rgbService.DeviceAdded -= RgbServiceOnDeviceAdded; + _rgbService.DeviceRemoved -= RgbServiceOnDeviceRemoved; + }).DisposeWith(d); }); } + private void RgbServiceOnDeviceAdded(object? sender, DeviceEventArgs e) + { + if (!e.Device.IsEnabled) + return; + + SurfaceDeviceViewModels.Add(_surfaceVmFactory.SurfaceDeviceViewModel(e.Device, this)); + ListDeviceViewModels.Add(_surfaceVmFactory.ListDeviceViewModel(e.Device, this)); + SurfaceDeviceViewModels.Sort(l => l.Device.ZIndex * -1); + ListDeviceViewModels.Sort(l => l.Device.ZIndex * -1); + } + + private void RgbServiceOnDeviceRemoved(object? sender, DeviceEventArgs e) + { + SurfaceDeviceViewModel? surfaceVm = SurfaceDeviceViewModels.FirstOrDefault(vm => vm.Device == e.Device); + ListDeviceViewModel? listVm = ListDeviceViewModels.FirstOrDefault(vm => vm.Device == e.Device); + if (surfaceVm != null) + SurfaceDeviceViewModels.Remove(surfaceVm); + if (listVm != null) + ListDeviceViewModels.Remove(listVm); + } + public bool ColorDevices { get => _colorDevices;