diff --git a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangement.cs b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangement.cs index 3f7d726ac..f7e25c093 100644 --- a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangement.cs +++ b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangement.cs @@ -9,82 +9,80 @@ namespace Artemis.Core.Services.Models public SurfaceArrangement() { Types = new List(); + ArrangedDevices = new List(); } public List Types { get; } + public List ArrangedDevices { get; } internal static SurfaceArrangement GetDefaultArrangement() { SurfaceArrangement arrangement = new SurfaceArrangement(); - SurfaceArrangementType keypad = new SurfaceArrangementType(RGBDeviceType.Keypad); - keypad.Configurations.Add(new SurfaceArrangementConfiguration(null, HorizontalArrangementPosition.Equal, VerticalArrangementPosition.Equal, 20)); - arrangement.Types.Add(keypad); + SurfaceArrangementType keypad = arrangement.AddType(RGBDeviceType.Keypad, 1); + keypad.AddConfiguration(new SurfaceArrangementConfiguration(null, HorizontalArrangementPosition.Equal, VerticalArrangementPosition.Equal, 20)); - SurfaceArrangementType keyboard = new SurfaceArrangementType(RGBDeviceType.Keyboard); - keyboard.Configurations.Add(new SurfaceArrangementConfiguration(keypad, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 20)); - arrangement.Types.Add(keyboard); + SurfaceArrangementType keyboard = arrangement.AddType(RGBDeviceType.Keyboard, 1); + keyboard.AddConfiguration(new SurfaceArrangementConfiguration(keypad, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 20)); - SurfaceArrangementType mousepad = new SurfaceArrangementType(RGBDeviceType.Mousepad); - mousepad.Configurations.Add(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 10)); - arrangement.Types.Add(mousepad); + SurfaceArrangementType mousepad = arrangement.AddType(RGBDeviceType.Mousepad, 1); + mousepad.AddConfiguration(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 10)); - SurfaceArrangementType mouse = new SurfaceArrangementType(RGBDeviceType.Mouse); - mouse.Configurations.Add(new SurfaceArrangementConfiguration(mousepad, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Center, 0)); - mouse.Configurations.Add(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Center, 100)); - arrangement.Types.Add(mouse); + SurfaceArrangementType mouse = arrangement.AddType(RGBDeviceType.Mouse, 2); + mouse.AddConfiguration(new SurfaceArrangementConfiguration(mousepad, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Center, 0)); + mouse.AddConfiguration(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Center, 100)); - SurfaceArrangementType headset = new SurfaceArrangementType(RGBDeviceType.Headset); - headset.Configurations.Add(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Bottom, 100)); - arrangement.Types.Add(headset); + SurfaceArrangementType headset = arrangement.AddType(RGBDeviceType.Headset, 1); + headset.AddConfiguration(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Bottom, 100)); - SurfaceArrangementType headsetStand = new SurfaceArrangementType(RGBDeviceType.HeadsetStand); - headsetStand.Configurations.Add(new SurfaceArrangementConfiguration(mousepad, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Top, 100)); - headsetStand.Configurations.Add(new SurfaceArrangementConfiguration(mouse, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Top, 100)); - headsetStand.Configurations.Add(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Top, 100)); - arrangement.Types.Add(headsetStand); + SurfaceArrangementType headsetStand = arrangement.AddType(RGBDeviceType.HeadsetStand, 1); + headsetStand.AddConfiguration(new SurfaceArrangementConfiguration(mousepad, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Top, 100)); + headsetStand.AddConfiguration(new SurfaceArrangementConfiguration(mouse, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Top, 100)); + headsetStand.AddConfiguration(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Top, 100)); - SurfaceArrangementType mainboard = new SurfaceArrangementType(RGBDeviceType.Mainboard); - mainboard.Configurations.Add(new SurfaceArrangementConfiguration(mousepad, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 500)); - mainboard.Configurations.Add(new SurfaceArrangementConfiguration(mouse, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 500)); - mainboard.Configurations.Add(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 500)); - arrangement.Types.Add(mainboard); + SurfaceArrangementType mainboard = arrangement.AddType(RGBDeviceType.Mainboard, 1); + mainboard.AddConfiguration(new SurfaceArrangementConfiguration(mousepad, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 500)); + mainboard.AddConfiguration(new SurfaceArrangementConfiguration(mouse, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 500)); + mainboard.AddConfiguration(new SurfaceArrangementConfiguration(keyboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 500)); - SurfaceArrangementType cooler = new SurfaceArrangementType(RGBDeviceType.Cooler); - cooler.Configurations.Add(new SurfaceArrangementConfiguration(mainboard, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Center, 0)); - arrangement.Types.Add(cooler); + SurfaceArrangementType cooler = arrangement.AddType(RGBDeviceType.Cooler, 2); + cooler.AddConfiguration(new SurfaceArrangementConfiguration(mainboard, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Center, 0)); - SurfaceArrangementType dram = new SurfaceArrangementType(RGBDeviceType.DRAM); - dram.Configurations.Add(new SurfaceArrangementConfiguration(cooler, HorizontalArrangementPosition.Left, VerticalArrangementPosition.Equal, 10)); - dram.Configurations.Add(new SurfaceArrangementConfiguration(mainboard, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Center, 0)); - arrangement.Types.Add(dram); + SurfaceArrangementType dram = arrangement.AddType(RGBDeviceType.DRAM, 2); + dram.AddConfiguration(new SurfaceArrangementConfiguration(cooler, HorizontalArrangementPosition.Left, VerticalArrangementPosition.Equal, 10)); + dram.AddConfiguration(new SurfaceArrangementConfiguration(mainboard, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Center, 0)); - SurfaceArrangementType graphicsCard = new SurfaceArrangementType(RGBDeviceType.GraphicsCard); - graphicsCard.Configurations.Add(new SurfaceArrangementConfiguration(cooler, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 10)); - graphicsCard.Configurations.Add(new SurfaceArrangementConfiguration(dram, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 10)); - graphicsCard.Configurations.Add(new SurfaceArrangementConfiguration(mainboard, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Center, 0)); - arrangement.Types.Add(graphicsCard); + SurfaceArrangementType graphicsCard = arrangement.AddType(RGBDeviceType.GraphicsCard, 2); + graphicsCard.AddConfiguration(new SurfaceArrangementConfiguration(cooler, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 10)); + graphicsCard.AddConfiguration(new SurfaceArrangementConfiguration(dram, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Bottom, 10)); + graphicsCard.AddConfiguration(new SurfaceArrangementConfiguration(mainboard, HorizontalArrangementPosition.Center, VerticalArrangementPosition.Center, 0)); - SurfaceArrangementType fan = new SurfaceArrangementType(RGBDeviceType.Fan); - fan.Configurations.Add(new SurfaceArrangementConfiguration(mainboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 100)); - arrangement.Types.Add(fan); + SurfaceArrangementType fan = arrangement.AddType(RGBDeviceType.Fan, 2); + fan.AddConfiguration(new SurfaceArrangementConfiguration(mainboard, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 100)); - SurfaceArrangementType ledStripe = new SurfaceArrangementType(RGBDeviceType.LedStripe); - ledStripe.Configurations.Add(new SurfaceArrangementConfiguration(fan, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 100)); - arrangement.Types.Add(ledStripe); + SurfaceArrangementType ledStripe = arrangement.AddType(RGBDeviceType.LedStripe, 2); + ledStripe.AddConfiguration(new SurfaceArrangementConfiguration(fan, HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 100)); - SurfaceArrangementType speaker = new SurfaceArrangementType(RGBDeviceType.Speaker); - arrangement.Types.Add(speaker); + arrangement.AddType(RGBDeviceType.Speaker, 1); + arrangement.AddType(RGBDeviceType.None, 1); return arrangement; } + private SurfaceArrangementType AddType(RGBDeviceType type, int zIndex) + { + SurfaceArrangementType surfaceArrangementType = new SurfaceArrangementType(this, type, zIndex); + Types.Add(surfaceArrangementType); + return surfaceArrangementType; + } + public void Arrange(ArtemisSurface surface) { + ArrangedDevices.Clear(); foreach (ArtemisDevice surfaceDevice in surface.Devices) { surfaceDevice.X = 0; - surfaceDevice.X = 0; + surfaceDevice.Y = 0; surfaceDevice.ApplyToRgbDevice(); } @@ -102,6 +100,7 @@ namespace Artemis.Core.Services.Models surfaceDevice.ApplyToRgbDevice(); } } + if (y < 0) { foreach (ArtemisDevice surfaceDevice in surface.Devices) diff --git a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementConfiguration.cs b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementConfiguration.cs index c35a0cce1..2cc897ff1 100644 --- a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementConfiguration.cs +++ b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementConfiguration.cs @@ -19,18 +19,6 @@ namespace Artemis.Core.Services.Models MarginBottom = margin; } - public SurfaceArrangementConfiguration(SurfaceArrangementType? anchor, HorizontalArrangementPosition horizontalPosition, VerticalArrangementPosition verticalPosition, - int marginLeft, int marginTop, int marginRight, int marginBottom) - { - Anchor = anchor; - HorizontalPosition = horizontalPosition; - VerticalPosition = verticalPosition; - - MarginLeft = marginLeft; - MarginTop = marginTop; - MarginRight = marginRight; - MarginBottom = marginBottom; - } public SurfaceArrangementType? Anchor { get; } public HorizontalArrangementPosition HorizontalPosition { get; } @@ -40,6 +28,7 @@ namespace Artemis.Core.Services.Models public int MarginTop { get; } public int MarginRight { get; } public int MarginBottom { get; } + public SurfaceArrangement SurfaceArrangement { get; set; } public bool Apply(List devices, ArtemisSurface surface) { @@ -48,7 +37,7 @@ namespace Artemis.Core.Services.Models // Start at the edge of the anchor, if there is no anchor start at any device Point startPoint = Anchor?.GetEdge(HorizontalPosition, VerticalPosition, surface) ?? - new SurfaceArrangementType(RGBDeviceType.All).GetEdge(HorizontalPosition, VerticalPosition, surface); + new SurfaceArrangementType(SurfaceArrangement, RGBDeviceType.All, 1).GetEdge(HorizontalPosition, VerticalPosition, surface); // Stack multiple devices of the same type vertically if they are wider than they are tall bool stackVertically = devices.Average(d => d.RgbDevice.Size.Width) >= devices.Average(d => d.RgbDevice.Size.Height); @@ -91,6 +80,8 @@ namespace Artemis.Core.Services.Models artemisDevice.ApplyToRgbDevice(); previous = artemisDevice; + + SurfaceArrangement.ArrangedDevices.Add(artemisDevice); } return true; diff --git a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs index 47d92fac9..d93949ca6 100644 --- a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs +++ b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementType.cs @@ -7,13 +7,17 @@ namespace Artemis.Core.Services.Models { internal class SurfaceArrangementType { - public SurfaceArrangementType(RGBDeviceType deviceType) + public SurfaceArrangementType(SurfaceArrangement surfaceArrangement, RGBDeviceType deviceType, int zIndex) { + SurfaceArrangement = surfaceArrangement; DeviceType = deviceType; + ZIndex = zIndex; Configurations = new List(); } + public SurfaceArrangement SurfaceArrangement { get; } public RGBDeviceType DeviceType { get; } + public int ZIndex { get; } public List Configurations { get; } public SurfaceArrangementConfiguration? AppliedConfiguration { get; set; } @@ -35,6 +39,8 @@ namespace Artemis.Core.Services.Models if (applied) { AppliedConfiguration = configuration; + foreach (ArtemisDevice artemisDevice in devices) + artemisDevice.ZIndex = ZIndex; return; } } @@ -45,14 +51,14 @@ namespace Artemis.Core.Services.Models HorizontalArrangementPosition.Right, VerticalArrangementPosition.Equal, 10 - ); + ) {SurfaceArrangement = SurfaceArrangement}; fallback.Apply(devices, surface); AppliedConfiguration = fallback; } public Point GetEdge(HorizontalArrangementPosition horizontalPosition, VerticalArrangementPosition verticalPosition, ArtemisSurface surface) { - List devices = surface.Devices.Where(d => d.RgbDevice.DeviceInfo.DeviceType == DeviceType || DeviceType == RGBDeviceType.All).ToList(); + List devices = SurfaceArrangement.ArrangedDevices.Where(d => d.RgbDevice.DeviceInfo.DeviceType == DeviceType || DeviceType == RGBDeviceType.All).ToList(); if (!devices.Any()) return new Point(); @@ -75,6 +81,12 @@ namespace Artemis.Core.Services.Models return new Point(x, y); } + + public void AddConfiguration(SurfaceArrangementConfiguration surfaceArrangementConfiguration) + { + surfaceArrangementConfiguration.SurfaceArrangement = SurfaceArrangement; + Configurations.Add(surfaceArrangementConfiguration); + } } internal enum HorizontalArrangementPosition