diff --git a/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs b/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs index 11871df5c..7f75d77f9 100644 --- a/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs +++ b/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs @@ -1,4 +1,5 @@ -using System.Text; +using System.Linq; +using System.Text; using RGB.NET.Core; using SkiaSharp; @@ -18,6 +19,18 @@ internal static class RgbDeviceExtensions builder.Append(rgbDevice.DeviceInfo.DeviceType); return builder.ToString(); } + + public static void EnsureValidDimensions(this IRGBDevice rgbDevice) + { + if (rgbDevice.Location == Point.Invalid) + rgbDevice.Location = new Point(0, 0); + + if (rgbDevice.Size == Size.Invalid) + { + Rectangle ledRectangle = new(rgbDevice.Select(x => x.Boundary)); + rgbDevice.Size = ledRectangle.Size + new Size(ledRectangle.Location.X, ledRectangle.Location.Y); + } + } } internal static class RgbRectangleExtensions diff --git a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs index f2efc95be..d5ddd019d 100644 --- a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs +++ b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs @@ -22,13 +22,13 @@ public class ArtemisDevice : CorePropertyChanged internal ArtemisDevice(IRGBDevice rgbDevice, DeviceProvider deviceProvider) { - Rectangle ledRectangle = new(rgbDevice.Select(x => x.Boundary)); + rgbDevice.EnsureValidDimensions(); _originalLeds = new List(rgbDevice.Select(l => new OriginalLed(l))); - _originalSize = ledRectangle.Size + new Size(ledRectangle.Location.X, ledRectangle.Location.Y); + _originalSize = rgbDevice.Size; + RgbDevice = rgbDevice; Identifier = rgbDevice.GetDeviceIdentifier(); DeviceEntity = new DeviceEntity(); - RgbDevice = rgbDevice; DeviceProvider = deviceProvider; Rotation = 0; @@ -58,13 +58,13 @@ public class ArtemisDevice : CorePropertyChanged internal ArtemisDevice(IRGBDevice rgbDevice, DeviceProvider deviceProvider, DeviceEntity deviceEntity) { - Rectangle ledRectangle = new(rgbDevice.Select(x => x.Boundary)); + rgbDevice.EnsureValidDimensions(); _originalLeds = new List(rgbDevice.Select(l => new OriginalLed(l))); - _originalSize = ledRectangle.Size + new Size(ledRectangle.Location.X, ledRectangle.Location.Y); + _originalSize = rgbDevice.Size; + RgbDevice = rgbDevice; Identifier = rgbDevice.GetDeviceIdentifier(); DeviceEntity = deviceEntity; - RgbDevice = rgbDevice; DeviceProvider = deviceProvider; LedIds = new ReadOnlyDictionary(new Dictionary()); @@ -609,9 +609,9 @@ public class ArtemisDevice : CorePropertyChanged private void RgbDeviceOnPropertyChanged(object? sender, PropertyChangedEventArgs e) { - if (e.PropertyName != nameof(IRGBDevice.Surface)) + if (e.PropertyName != nameof(IRGBDevice.Surface) || RgbDevice.Surface == null) return; - + RgbDevice.Rotation = DeviceEntity.Rotation; RgbDevice.Scale = DeviceEntity.Scale; ApplyLocation(DeviceEntity.X, DeviceEntity.Y); diff --git a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs index e9ee4f9d9..ee7380343 100644 --- a/src/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs +++ b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Reactive; +using System.Reactive.Disposables; using System.Threading.Tasks; using Artemis.Core; using Artemis.Core.Services; @@ -37,6 +39,12 @@ public class SurfaceDeviceViewModel : ActivatableViewModelBase DetectInput = ReactiveCommand.CreateFromTask(ExecuteDetectInput, this.WhenAnyValue(vm => vm.CanDetectInput)); X = device.X; Y = device.Y; + + this.WhenActivated(d => + { + Device.PropertyChanged += DeviceOnPropertyChanged; + Disposable.Create(() => Device.PropertyChanged -= DeviceOnPropertyChanged).DisposeWith(d); + }); } public ReactiveCommand DetectInput { get; } @@ -143,4 +151,12 @@ public class SurfaceDeviceViewModel : ActivatableViewModelBase Device.X = X; Device.Y = Y; } + + private void DeviceOnPropertyChanged(object? sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(Device.X)) + X = Device.X; + if (e.PropertyName == nameof(Device.Y)) + Y = Device.Y; + } } \ No newline at end of file