using System.Linq; using RGB.NET.Core; using SkiaSharp; namespace Artemis.Core; /// /// Represents an RGB LED contained in an /// public class ArtemisLed : CorePropertyChanged { private SKRect _absoluteRectangle; private SKRect _rectangle; internal ArtemisLed(Led led, ArtemisDevice device) { RgbLed = led; Device = device; Layout = device.Layout?.Leds.FirstOrDefault(l => l.RgbLayout.Id == led.Id.ToString()); Layout?.ApplyCustomLedData(Device); CalculateRectangles(); } /// /// Gets the RGB.NET LED backing this Artemis LED /// public Led RgbLed { get; } /// /// Gets the device that contains this LED /// public ArtemisDevice Device { get; } /// /// Gets the rectangle covering the LED positioned relative to the /// public SKRect Rectangle { get => _rectangle; private set => SetAndNotify(ref _rectangle, value); } /// /// Gets the rectangle covering the LED /// public SKRect AbsoluteRectangle { get => _absoluteRectangle; private set => SetAndNotify(ref _absoluteRectangle, value); } /// /// Gets the layout applied to this LED /// public ArtemisLedLayout? Layout { get; internal set; } /// public override string ToString() { return RgbLed.ToString(); } internal void CalculateRectangles() { Rectangle = RenderScale.CreateScaleCompatibleRect( RgbLed.Boundary.Location.X, RgbLed.Boundary.Location.Y, RgbLed.Boundary.Size.Width, RgbLed.Boundary.Size.Height ); AbsoluteRectangle = RenderScale.CreateScaleCompatibleRect( RgbLed.AbsoluteBoundary.Location.X, RgbLed.AbsoluteBoundary.Location.Y, RgbLed.AbsoluteBoundary.Size.Width, RgbLed.AbsoluteBoundary.Size.Height ); } }