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