diff --git a/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs b/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs
index 5c1e11353..f2537a907 100644
--- a/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs
+++ b/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs
@@ -25,10 +25,10 @@ namespace Artemis.Core
public static SKRect ToSKRect(this Rectangle rectangle)
{
return SKRect.Create(
- (float) rectangle.Location.X,
- (float) rectangle.Location.Y,
- (float) rectangle.Size.Width,
- (float) rectangle.Size.Height
+ rectangle.Location.X,
+ rectangle.Location.Y,
+ rectangle.Size.Width,
+ rectangle.Size.Height
);
}
}
diff --git a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs
index cee4d8dfd..d28885e65 100644
--- a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs
+++ b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs
@@ -337,6 +337,7 @@ namespace Artemis.Core
Layout = layout;
Layout.ApplyDevice(this);
+ CalculateRenderProperties();
OnDeviceUpdated();
}
diff --git a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs
index ffb154dac..bc4b3648f 100644
--- a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs
+++ b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs
@@ -6,9 +6,11 @@ using System.Linq;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
+using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Artemis.Core;
+using SkiaSharp;
using Stylet;
namespace Artemis.UI.Shared
@@ -54,6 +56,7 @@ namespace Artemis.UI.Shared
_timer = new Timer(40);
_timer.Elapsed += TimerOnTick;
+ MouseLeftButtonUp += OnMouseLeftButtonUp;
Loaded += OnLoaded;
Unloaded += OnUnloaded;
}
@@ -85,18 +88,6 @@ namespace Artemis.UI.Shared
set => SetValue(HighlightedLedsProperty, value);
}
- ///
- /// Releases the unmanaged resources used by the object and optionally releases the managed resources.
- ///
- ///
- /// to release both managed and unmanaged resources;
- /// to release only unmanaged resources.
- ///
- protected virtual void Dispose(bool disposing)
- {
- if (disposing) _timer.Stop();
- }
-
///
protected override void OnRender(DrawingContext drawingContext)
{
@@ -149,6 +140,7 @@ namespace Artemis.UI.Shared
return ResizeKeepAspect(deviceSize, availableSize.Width, availableSize.Height);
}
+
private static Size ResizeKeepAspect(Size src, double maxWidth, double maxHeight)
{
double scale;
@@ -191,6 +183,21 @@ namespace Artemis.UI.Shared
}
}
+ private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ if (Device == null)
+ return;
+
+ Point position = e.GetPosition(this);
+ double x = (position.X / RenderSize.Width);
+ double y = (position.Y / RenderSize.Height);
+
+ Point scaledPosition = new(x * Device.Rectangle.Width, y * Device.Rectangle.Height);
+ DeviceVisualizerLed? deviceVisualizerLed = _deviceVisualizerLeds.FirstOrDefault(l => l.DisplayGeometry != null && l.LedRect.Contains(scaledPosition));
+ if (deviceVisualizerLed != null)
+ OnLedClicked(new LedClickedEventArgs(deviceVisualizerLed.Led.Device, deviceVisualizerLed.Led));
+ }
+
private void OnLoaded(object? sender, RoutedEventArgs e)
{
_timer.Start();
@@ -310,11 +317,43 @@ namespace Artemis.UI.Shared
drawingContext.Close();
}
+ #region Events
+
+ public event EventHandler? LedClicked;
+
+ ///
+ /// Invokes the event
+ ///
+ ///
+ protected virtual void OnLedClicked(LedClickedEventArgs e)
+ {
+ LedClicked?.Invoke(this, e);
+ }
+
+ #endregion
+
+ #region IDisposable
+
+ ///
+ /// Releases the unmanaged resources used by the object and optionally releases the managed resources.
+ ///
+ ///
+ /// to release both managed and unmanaged resources;
+ /// to release only unmanaged resources.
+ ///
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing) _timer.Stop();
+ }
+
+
///
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
+
+ #endregion
}
}
\ No newline at end of file
diff --git a/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs b/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs
new file mode 100644
index 000000000..3455b9800
--- /dev/null
+++ b/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs
@@ -0,0 +1,27 @@
+using System;
+using Artemis.Core;
+
+namespace Artemis.UI.Shared
+{
+ ///
+ /// Provides data on LED click events raised by the device visualizer
+ ///
+ public class LedClickedEventArgs : EventArgs
+ {
+ 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; }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Settings/Device/DeviceDialogView.xaml b/src/Artemis.UI/Screens/Settings/Device/DeviceDialogView.xaml
index 9e8dc0c23..8973e4109 100644
--- a/src/Artemis.UI/Screens/Settings/Device/DeviceDialogView.xaml
+++ b/src/Artemis.UI/Screens/Settings/Device/DeviceDialogView.xaml
@@ -110,7 +110,7 @@
HorizontalAlignment="Center"
VerticalAlignment="Center"
ShowColors="True"
- Margin="0 0 100 0" />
+ LedClicked="{s:Action OnLedClicked}"/>
diff --git a/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs b/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs
index 760f3fb96..52bae4f15 100644
--- a/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs
+++ b/src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs
@@ -8,6 +8,7 @@ using Artemis.Core;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Shared;
+using Artemis.UI.Shared;
using Artemis.UI.Shared.Services;
using MaterialDesignThemes.Wpf;
using Ookii.Dialogs.Wpf;
@@ -197,6 +198,11 @@ namespace Artemis.UI.Screens.Settings.Device
NotifyOfPropertyChange(nameof(CanExportLayout));
}
+ public void OnLedClicked(object sender, LedClickedEventArgs e)
+ {
+ SelectedLed = e.Led;
+ }
+
#endregion
}
}
\ No newline at end of file