diff --git a/src/.idea/.idea.Artemis/.idea/avalonia.xml b/src/.idea/.idea.Artemis/.idea/avalonia.xml
index a1aaa2a1a..5d5fcf5ff 100644
--- a/src/.idea/.idea.Artemis/.idea/avalonia.xml
+++ b/src/.idea/.idea.Artemis/.idea/avalonia.xml
@@ -19,12 +19,21 @@
+
+
+
+
+
+
+
+
+
@@ -38,6 +47,7 @@
+
diff --git a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs
index 206cfd5f2..aab383528 100644
--- a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs
+++ b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs
@@ -142,7 +142,10 @@ namespace Artemis.UI.Shared
Point scaledPosition = new(x * Device.Rectangle.Width, y * Device.Rectangle.Height);
DeviceVisualizerLed? deviceVisualizerLed = _deviceVisualizerLeds.FirstOrDefault(l => l.HitTest(scaledPosition));
if (deviceVisualizerLed != null)
- OnLedClicked(new LedClickedEventArgs(deviceVisualizerLed.Led.Device, deviceVisualizerLed.Led));
+ {
+ OnLedClicked(new LedClickedEventArgs(deviceVisualizerLed.Led.Device, deviceVisualizerLed.Led, e));
+ e.Handled = true;
+ }
}
private void DevicePropertyChanged(object? sender, PropertyChangedEventArgs e)
diff --git a/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs b/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs
index cfaa9a160..53ed595f8 100644
--- a/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs
+++ b/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs
@@ -1,27 +1,33 @@
using System;
using Artemis.Core;
+using Avalonia.Input;
-namespace Artemis.UI.Shared.Events
+namespace Artemis.UI.Shared.Events;
+
+///
+/// Provides data on LED click events raised by the device visualizer
+///
+public class LedClickedEventArgs : EventArgs
{
- ///
- /// Provides data on LED click events raised by the device visualizer
- ///
- public class LedClickedEventArgs : EventArgs
+ internal LedClickedEventArgs(ArtemisDevice device, ArtemisLed led, PointerReleasedEventArgs pointerReleasedEventArgs)
{
- internal LedClickedEventArgs(ArtemisDevice device, ArtemisLed led)
- {
- Device = device;
- Led = led;
- }
-
- ///
- /// The device that was clicked
- ///
- public ArtemisDevice Device { get; set; }
-
- ///
- /// The LED that was clicked
- ///
- public ArtemisLed Led { get; set; }
+ Device = device;
+ Led = led;
+ PointerReleasedEventArgs = pointerReleasedEventArgs;
}
+
+ ///
+ /// Gets the device that was clicked.
+ ///
+ public ArtemisDevice Device { get; set; }
+
+ ///
+ /// Gets the LED that was clicked.
+ ///
+ public ArtemisLed Led { get; set; }
+
+ ///
+ /// Gets the original pointer released event arguments.
+ ///
+ public PointerReleasedEventArgs PointerReleasedEventArgs { get; }
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml b/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml
index 31070f5e3..fed6b9938 100644
--- a/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml
+++ b/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml
@@ -1,16 +1,20 @@
-
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:controls1="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
+ xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared"
+ xmlns:device="clr-namespace:Artemis.UI.Screens.Device"
+ mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="800"
+ x:Class="Artemis.UI.Screens.Device.DevicePropertiesView"
+ x:DataType="device:DevicePropertiesViewModel"
+ Icon="/Assets/Images/Logo/application.ico"
+ Title="Artemis | Device Properties"
+ Width="1250"
+ Height="900">
+
+
+
@@ -24,45 +28,46 @@
-
+
-
+
+ IsVisible="{CompiledBinding Device.Layout.RgbLayout.Author, Converter={x:Static StringConverters.IsNotNullOrEmpty}}">
-
+
-
-
+
+
-
+
-
+
-
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml.cs b/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml.cs
index b5fd26391..f4a0fab43 100644
--- a/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml.cs
+++ b/src/Artemis.UI/Screens/Device/DevicePropertiesView.axaml.cs
@@ -1,22 +1,40 @@
+using System;
+using Artemis.UI.Shared;
+using Artemis.UI.Shared.Events;
using Avalonia;
+using Avalonia.Input;
using Avalonia.Markup.Xaml;
-using Avalonia.ReactiveUI;
-namespace Artemis.UI.Screens.Device
+namespace Artemis.UI.Screens.Device;
+
+public class DevicePropertiesView : ReactiveCoreWindow
{
- public partial class DevicePropertiesView : ReactiveCoreWindow
+ public DevicePropertiesView()
{
- public DevicePropertiesView()
- {
- InitializeComponent();
+ InitializeComponent();
#if DEBUG
- this.AttachDevTools();
+ this.AttachDevTools();
#endif
- }
-
- private void InitializeComponent()
- {
- AvaloniaXamlLoader.Load(this);
- }
}
-}
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ private void DeviceVisualizer_OnLedClicked(object? sender, LedClickedEventArgs e)
+ {
+ if (ViewModel == null)
+ return;
+
+ if (!e.PointerReleasedEventArgs.KeyModifiers.HasFlag(KeyModifiers.Shift))
+ ViewModel.SelectedLeds.Clear();
+ ViewModel.SelectedLeds.Add(e.Led);
+ }
+
+ private void DeviceDisplayGrid_OnPointerReleased(object? sender, PointerReleasedEventArgs e)
+ {
+ if (!e.KeyModifiers.HasFlag(KeyModifiers.Shift))
+ ViewModel?.ClearSelectedLeds.Execute().Subscribe();
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs b/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs
index 039d776f3..1bf75fae2 100644
--- a/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs
+++ b/src/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs
@@ -1,15 +1,22 @@
-using System.Collections.ObjectModel;
+using System;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Reactive;
+using System.Reactive.Disposables;
using Artemis.Core;
+using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Shared;
+using ReactiveUI;
using RGB.NET.Core;
+using SkiaSharp;
using ArtemisLed = Artemis.Core.ArtemisLed;
namespace Artemis.UI.Screens.Device
{
public class DevicePropertiesViewModel : DialogViewModelBase