diff --git a/src/Artemis.Core/Artemis.Core.csproj b/src/Artemis.Core/Artemis.Core.csproj index d9240f12b..549f6a304 100644 --- a/src/Artemis.Core/Artemis.Core.csproj +++ b/src/Artemis.Core/Artemis.Core.csproj @@ -158,8 +158,6 @@ - - diff --git a/src/Artemis.Core/Models/Profile/Folder.cs b/src/Artemis.Core/Models/Profile/Folder.cs index 7ca6f82ee..340a415cb 100644 --- a/src/Artemis.Core/Models/Profile/Folder.cs +++ b/src/Artemis.Core/Models/Profile/Folder.cs @@ -72,7 +72,7 @@ namespace Artemis.Core.Models.Profile public Layer AddLayer(string name) { var layer = new Layer(Profile, this, name) {Order = Children.LastOrDefault()?.Order ?? 1}; - layer.LayerShape = new Fill(layer); + layer.LayerShape = new Rectangle(layer); AddChild(layer); return layer; } diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index 71afae138..2384236f6 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -51,22 +51,13 @@ namespace Artemis.Core.Models.Profile CreateDefaultProperties(); - switch (layerEntity.ShapeEntity?.Type) + switch (layerEntity.ShapeType) { case ShapeEntityType.Ellipse: - LayerShape = new Ellipse(this, layerEntity.ShapeEntity); - break; - case ShapeEntityType.Fill: - LayerShape = new Fill(this, layerEntity.ShapeEntity); - break; - case ShapeEntityType.Polygon: - LayerShape = new Polygon(this, layerEntity.ShapeEntity); + LayerShape = new Ellipse(this); break; case ShapeEntityType.Rectangle: - LayerShape = new Rectangle(this, layerEntity.ShapeEntity); - break; - case null: - LayerShape = null; + LayerShape = new Rectangle(this); break; default: throw new ArgumentOutOfRangeException(); @@ -175,18 +166,18 @@ namespace Artemis.Core.Models.Profile var sizeProperty = SizeProperty.CurrentValue; var rotationProperty = RotationProperty.CurrentValue; - var anchorPosition = GetLayerAnchorPosition() + Bounds.Location; + var anchorPosition = GetLayerAnchorPosition(); var anchorProperty = AnchorPointProperty.CurrentValue; - // Translation originates from the unscaled center of the shape and is tied to the anchor - var x = anchorPosition.X - LayerShape.Bounds.MidX - anchorProperty.X * Bounds.Width; - var y = anchorPosition.Y - LayerShape.Bounds.MidY - anchorProperty.Y * Bounds.Height; + // Translation originates from the unscaled center of the layer and is tied to the anchor + var x = anchorPosition.X - Bounds.MidX - anchorProperty.X * Bounds.Width; + var y = anchorPosition.Y - Bounds.MidY - anchorProperty.Y * Bounds.Height; - // Apply these before translation because anchorPosition takes translation into account + // Rotation is always applied on the canvas canvas.RotateDegrees(rotationProperty, anchorPosition.X, anchorPosition.Y); - canvas.Scale(sizeProperty.Width, sizeProperty.Height, anchorPosition.X, anchorPosition.Y); + // canvas.Scale(sizeProperty.Width, sizeProperty.Height, anchorPosition.X, anchorPosition.Y); // Once the other transformations are done it is save to translate - canvas.Translate(x, y); + // canvas.Translate(x, y); // Placeholder if (LayerShape?.Path != null) @@ -200,8 +191,12 @@ namespace Artemis.Core.Models.Profile testColors.Add(SKColor.FromHsv(0, 100, 100)); } - var shader = SKShader.CreateSweepGradient(new SKPoint(LayerShape.Bounds.MidX, LayerShape.Bounds.MidY), testColors.ToArray()); - canvas.DrawPath(LayerShape.Path, new SKPaint {Shader = shader, Color = new SKColor(0, 0, 0, (byte) (OpacityProperty.CurrentValue * 2.55f))}); + var path = new SKPath(LayerShape.Path); + path.Transform(SKMatrix.MakeTranslation(x, y)); + path.Transform(SKMatrix.MakeScale(sizeProperty.Width, sizeProperty.Height, anchorPosition.X, anchorPosition.Y)); + + var shader = SKShader.CreateSweepGradient(new SKPoint(path.Bounds.MidX, path.Bounds.MidY), testColors.ToArray()); + canvas.DrawPath(path, new SKPaint {Shader = shader, Color = new SKColor(0, 0, 0, (byte) (OpacityProperty.CurrentValue * 2.55f))}); } LayerBrush?.Render(canvas); @@ -213,7 +208,7 @@ namespace Artemis.Core.Models.Profile var positionProperty = PositionProperty.CurrentValue; // Start at the center of the shape - var position = new SKPoint(LayerShape.Bounds.MidX, LayerShape.Bounds.MidY); + var position = new SKPoint(Bounds.MidX, Bounds.MidY); // Apply translation position.X += positionProperty.X * Bounds.Width; diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/Ellipse.cs b/src/Artemis.Core/Models/Profile/LayerShapes/Ellipse.cs index a046fa45c..58c6a6d9e 100644 --- a/src/Artemis.Core/Models/Profile/LayerShapes/Ellipse.cs +++ b/src/Artemis.Core/Models/Profile/LayerShapes/Ellipse.cs @@ -9,21 +9,16 @@ namespace Artemis.Core.Models.Profile.LayerShapes { } - internal Ellipse(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity) - { - } - public override void CalculateRenderProperties() { var path = new SKPath(); - path.AddOval(GetUnscaledRectangle()); + path.AddOval(Layer.Bounds); Path = path; } - internal override void ApplyToEntity() + public override void ApplyToEntity() { - base.ApplyToEntity(); - Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Ellipse; + Layer.LayerEntity.ShapeType = ShapeEntityType.Ellipse; } } } \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/Fill.cs b/src/Artemis.Core/Models/Profile/LayerShapes/Fill.cs deleted file mode 100644 index e194c32eb..000000000 --- a/src/Artemis.Core/Models/Profile/LayerShapes/Fill.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Artemis.Storage.Entities.Profile; -using SkiaSharp; - -namespace Artemis.Core.Models.Profile.LayerShapes -{ - public class Fill : LayerShape - { - public Fill(Layer layer) : base(layer) - { - } - - internal Fill(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity) - { - } - - public override void CalculateRenderProperties() - { - // Shape originates from the center so compensate the path for that - Path = new SKPath(Layer.Path); - } - - internal override void ApplyToEntity() - { - base.ApplyToEntity(); - Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Fill; - } - } -} \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs b/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs index 538a1b726..7b462a3d7 100644 --- a/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs +++ b/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs @@ -1,97 +1,26 @@ -using System.Linq; -using Artemis.Storage.Entities.Profile; -using SkiaSharp; +using SkiaSharp; namespace Artemis.Core.Models.Profile.LayerShapes { public abstract class LayerShape { - private SKPath _path; - protected LayerShape(Layer layer) { Layer = layer; } - protected LayerShape(Layer layer, ShapeEntity shapeEntity) - { - Layer = layer; - ScaledRectangle = SKRect.Create(shapeEntity.X, shapeEntity.Y, shapeEntity.Width, shapeEntity.Height); - } - /// /// The layer this shape is attached to /// public Layer Layer { get; set; } - /// - /// A relative and scaled rectangle that defines where the shape is located in relation to the layer's size - /// Note: scaled means a range of 0.0 to 1.0. 1.0 being full width/height, 0.5 being half - /// - public SKRect ScaledRectangle { get; set; } - /// /// A path outlining the shape /// - public SKPath Path - { - get => _path; - protected set - { - _path = value; - Bounds = value?.Bounds ?? SKRect.Empty; - } - } - - /// - /// The bounds of this shape - /// - public SKRect Bounds { get; private set; } + public SKPath Path { get; protected set; } public abstract void CalculateRenderProperties(); - /// - /// Updates Position and Size using the provided unscaled rectangle - /// - /// An unscaled rectangle where 1px = 1mm - public void SetFromUnscaledRectangle(SKRect rect) - { - if (!Layer.Leds.Any()) - { - ScaledRectangle = SKRect.Empty; - return; - } - - ScaledRectangle = SKRect.Create( - 100f / Layer.Bounds.Width * rect.Left / 100f, - 100f / Layer.Bounds.Height * rect.Top / 100f, - 100f / Layer.Bounds.Width * rect.Width / 100f, - 100f / Layer.Bounds.Height * rect.Height / 100f - ); - } - - public SKRect GetUnscaledRectangle() - { - if (!Layer.Leds.Any()) - return SKRect.Empty; - - return SKRect.Create( - Layer.Bounds.Width * ScaledRectangle.Left, - Layer.Bounds.Height * ScaledRectangle.Top, - Layer.Bounds.Width * ScaledRectangle.Width, - Layer.Bounds.Height * ScaledRectangle.Height - ); - } - - internal virtual void ApplyToEntity() - { - Layer.LayerEntity.ShapeEntity = new ShapeEntity - { - X = ScaledRectangle.Left, - Y = ScaledRectangle.Top, - Width = ScaledRectangle.Width, - Height = ScaledRectangle.Height - }; - } + public abstract void ApplyToEntity(); } } \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/Polygon.cs b/src/Artemis.Core/Models/Profile/LayerShapes/Polygon.cs deleted file mode 100644 index e593b20be..000000000 --- a/src/Artemis.Core/Models/Profile/LayerShapes/Polygon.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Artemis.Storage.Entities.Profile; -using SkiaSharp; - -namespace Artemis.Core.Models.Profile.LayerShapes -{ - public class Polygon : LayerShape - { - public Polygon(Layer layer) : base(layer) - { - } - - internal Polygon(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity) - { - } - - /// - /// The points of this polygon - /// - public List Points { get; set; } - - /// - /// The points of this polygon where they need to be rendered inside the layer - /// - public List RenderPoints - { - get { return Points.Select(p => new SKPoint(p.X * Layer.Bounds.Width, p.Y * Layer.Bounds.Height)).ToList(); } - } - - public override void CalculateRenderProperties() - { - var path = new SKPath(); - path.AddPoly(RenderPoints.ToArray()); - Path = path; - } - - internal override void ApplyToEntity() - { - base.ApplyToEntity(); - Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Polygon; - Layer.LayerEntity.ShapeEntity.Points = Points.Select(p => new ShapePointEntity {X = p.X, Y = p.Y}).ToList(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/Rectangle.cs b/src/Artemis.Core/Models/Profile/LayerShapes/Rectangle.cs index bc568a7fb..740b6f5b9 100644 --- a/src/Artemis.Core/Models/Profile/LayerShapes/Rectangle.cs +++ b/src/Artemis.Core/Models/Profile/LayerShapes/Rectangle.cs @@ -9,21 +9,16 @@ namespace Artemis.Core.Models.Profile.LayerShapes { } - internal Rectangle(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity) - { - } - public override void CalculateRenderProperties() { var path = new SKPath(); - path.AddRect(GetUnscaledRectangle()); + path.AddRect(Layer.Bounds); Path = path; } - internal override void ApplyToEntity() + public override void ApplyToEntity() { - base.ApplyToEntity(); - Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Rectangle; + Layer.LayerEntity.ShapeType = ShapeEntityType.Rectangle; } } } \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerBrushes.Color/ColorBrush.cs b/src/Artemis.Plugins.LayerBrushes.Color/ColorBrush.cs index fb8d3283e..c6245906d 100644 --- a/src/Artemis.Plugins.LayerBrushes.Color/ColorBrush.cs +++ b/src/Artemis.Plugins.LayerBrushes.Color/ColorBrush.cs @@ -35,7 +35,7 @@ namespace Artemis.Plugins.LayerBrushes.Color private void CreateShader() { - var center = new SKPoint(Layer.LayerShape.Bounds.MidX, Layer.LayerShape.Bounds.MidY); + var center = new SKPoint(Layer.Bounds.MidX, Layer.Bounds.MidY); SKShader shader; switch (Settings.GradientType) { @@ -43,10 +43,10 @@ namespace Artemis.Plugins.LayerBrushes.Color shader = SKShader.CreateColor(_testColors.First()); break; case GradientType.LinearGradient: - shader = SKShader.CreateLinearGradient(new SKPoint(0, 0), new SKPoint(Layer.LayerShape.Bounds.Width, 0), _testColors.ToArray(), SKShaderTileMode.Repeat); + shader = SKShader.CreateLinearGradient(new SKPoint(0, 0), new SKPoint(Layer.Bounds.Width, 0), _testColors.ToArray(), SKShaderTileMode.Repeat); break; case GradientType.RadialGradient: - shader = SKShader.CreateRadialGradient(center, Math.Min(Layer.LayerShape.Bounds.Width, Layer.LayerShape.Bounds.Height), _testColors.ToArray(), SKShaderTileMode.Repeat); + shader = SKShader.CreateRadialGradient(center, Math.Min(Layer.Bounds.Width, Layer.Bounds.Height), _testColors.ToArray(), SKShaderTileMode.Repeat); break; case GradientType.SweepGradient: shader = SKShader.CreateSweepGradient(center, _testColors.ToArray(), null, SKShaderTileMode.Clamp, 0, 360); diff --git a/src/Artemis.Storage/Entities/Profile/LayerEntity.cs b/src/Artemis.Storage/Entities/Profile/LayerEntity.cs index a67b54b44..bf11bd782 100644 --- a/src/Artemis.Storage/Entities/Profile/LayerEntity.cs +++ b/src/Artemis.Storage/Entities/Profile/LayerEntity.cs @@ -23,7 +23,7 @@ namespace Artemis.Storage.Entities.Profile public List PropertyEntities { get; set; } public List Condition { get; set; } - public ShapeEntity ShapeEntity { get; set; } + public ShapeEntityType ShapeType { get; set; } public BrushEntity BrushEntity { get; set; } [BsonRef("ProfileEntity")] @@ -31,4 +31,10 @@ namespace Artemis.Storage.Entities.Profile public Guid ProfileId { get; set; } } + + public enum ShapeEntityType + { + Ellipse, + Rectangle + } } \ No newline at end of file diff --git a/src/Artemis.Storage/Entities/Profile/ShapeEntity.cs b/src/Artemis.Storage/Entities/Profile/ShapeEntity.cs deleted file mode 100644 index e8d07ca68..000000000 --- a/src/Artemis.Storage/Entities/Profile/ShapeEntity.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; - -namespace Artemis.Storage.Entities.Profile -{ - public class ShapeEntity - { - public float X { get; set; } - public float Y { get; set; } - public float Width { get; set; } - public float Height { get; set; } - public ShapeEntityType Type { get; set; } - public List Points { get; set; } - } - - public class ShapePointEntity - { - public float X { get; set; } - public float Y { get; set; } - } - - public enum ShapeEntityType - { - Ellipse, - Fill, - Polygon, - Rectangle - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index bb8c3118c..426741974 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -189,22 +189,6 @@ - - EllipseToolView.xaml - - - - FillToolView.xaml - - - - PolygonToolView.xaml - - - - RectangleToolView.xaml - - SelectionRemoveToolView.xaml @@ -374,22 +358,6 @@ Designer MSBuild:Compile - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - Designer MSBuild:Compile diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml index 804079a70..589442a93 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerView.xaml @@ -32,35 +32,33 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerViewModel.cs index 112a63c3e..a7d931ed4 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerViewModel.cs @@ -30,11 +30,9 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization _profileEditorService.SelectedProfileElementUpdated += OnSelectedProfileElementUpdated; _profileEditorService.ProfilePreviewUpdated += ProfileEditorServiceOnProfilePreviewUpdated; } - - + public Layer Layer { get; } - public Rect LayerBounds { get; set; } public Geometry LayerGeometry { get; set; } public Geometry OpacityGeometry { get; set; } public Geometry ShapeGeometry { get; set; } @@ -53,7 +51,6 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization { if (!Layer.Leds.Any()) { - LayerBounds = Rect.Empty; LayerGeometry = Geometry.Empty; OpacityGeometry = Geometry.Empty; ViewportRectangle = Rect.Empty; @@ -89,8 +86,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization var layerGeometry = group.GetOutlinedPathGeometry(); var opacityGeometry = Geometry.Combine(Geometry.Empty, layerGeometry, GeometryCombineMode.Exclude, new TranslateTransform()); - - LayerBounds = _layerEditorService.GetLayerBounds(Layer); + LayerGeometry = layerGeometry; OpacityGeometry = opacityGeometry; } @@ -105,25 +101,13 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization Execute.PostToUIThread(() => { - var bounds = _layerEditorService.GetLayerShapeBounds(Layer.LayerShape); + var bounds = _layerEditorService.GetLayerBounds(Layer); var shapeGeometry = Geometry.Empty; switch (Layer.LayerShape) { case Ellipse _: shapeGeometry = new EllipseGeometry(bounds); break; - case Fill _: - // Shape originates from the center so compensate the geometry for that, create a copy - shapeGeometry = LayerGeometry.Clone(); - // Add a transformation - shapeGeometry.Transform = new TranslateTransform(bounds.Left - shapeGeometry.Bounds.Left, bounds.Top - shapeGeometry.Bounds.Top); - // Apply the transformation so that it won't be overridden - shapeGeometry = shapeGeometry.GetOutlinedPathGeometry(); - break; - case Polygon _: - // TODO - shapeGeometry = new RectangleGeometry(bounds); - break; case Rectangle _: shapeGeometry = new RectangleGeometry(bounds); break; @@ -142,8 +126,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization return; } - var rect = _layerEditorService.GetLayerBounds(Layer); - ViewportRectangle = new Rect(0, 0, rect.Width, rect.Height); + ViewportRectangle = _layerEditorService.GetLayerBounds(Layer); } private Geometry CreateRectangleGeometry(ArtemisLed led) diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileView.xaml index ba3502f41..f2fa17dc6 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileView.xaml @@ -8,7 +8,7 @@ xmlns:profileEditor="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.Visualization" xmlns:utilities="clr-namespace:Artemis.UI.Utilities" mc:Ignorable="d" - d:DesignHeight="450" d:DesignWidth="800" + d:DesignHeight="510.9" d:DesignWidth="800" d:DataContext="{d:DesignInstance {x:Type profileEditor:ProfileViewModel}}"> - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolView.xaml.cs deleted file mode 100644 index 596559a60..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolView.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows.Controls; - -namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools -{ - /// - /// Interaction logic for EllipseToolView.xaml - /// - public partial class EllipseToolView : UserControl - { - public EllipseToolView() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs deleted file mode 100644 index 1f41c0167..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.IO; -using System.Windows; -using System.Windows.Input; -using Artemis.Core.Models.Profile; -using Artemis.Core.Models.Profile.LayerShapes; -using Artemis.UI.Properties; -using Artemis.UI.Services.Interfaces; - -namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools -{ - public class EllipseToolViewModel : VisualizationToolViewModel - { - private readonly ILayerEditorService _layerEditorService; - private bool _shiftDown; - - public EllipseToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService, ILayerEditorService layerEditorService) - : base(profileViewModel, profileEditorService) - { - _layerEditorService = layerEditorService; - using (var stream = new MemoryStream(Resources.aero_crosshair)) - { - Cursor = new Cursor(stream); - } - } - - public Rect DragRectangle { get; set; } - - public override void MouseMove(object sender, MouseEventArgs e) - { - base.MouseMove(sender, e); - - if (!IsMouseDown) - return; - - var position = ProfileViewModel.PanZoomViewModel.GetRelativeMousePosition(sender, e); - if (!_shiftDown) - DragRectangle = new Rect(MouseDownStartPosition, position); - else - DragRectangle = GetSquareRectBetweenPoints(MouseDownStartPosition, position); - } - - public override void MouseUp(object sender, MouseButtonEventArgs e) - { - base.MouseUp(sender, e); - - if (ProfileEditorService.SelectedProfileElement is Layer layer) - { - // Ensure the shape is an ellipse, we're all about ellipses up here - if (!(layer.LayerShape is Ellipse)) - layer.LayerShape = new Ellipse(layer); - - // Apply the drag rectangle - _layerEditorService.SetShapeBaseFromRectangle(layer.LayerShape, DragRectangle); - ProfileEditorService.UpdateSelectedProfileElement(); - } - } - - public override void KeyUp(KeyEventArgs e) - { - base.KeyUp(e); - - if (e.Key == Key.LeftShift || e.Key == Key.RightShift) - _shiftDown = false; - } - - public override void KeyDown(KeyEventArgs e) - { - base.KeyDown(e); - - if (e.Key == Key.LeftShift || e.Key == Key.RightShift) - _shiftDown = true; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml deleted file mode 100644 index ee9c8af10..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml +++ /dev/null @@ -1,9 +0,0 @@ - - \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml.cs deleted file mode 100644 index 567573f77..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolView.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows.Controls; - -namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools -{ - /// - /// Interaction logic for FillToolView.xaml - /// - public partial class FillToolView : UserControl - { - public FillToolView() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolViewModel.cs deleted file mode 100644 index 85c4aee81..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/FillToolViewModel.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.IO; -using System.Linq; -using System.Windows; -using System.Windows.Input; -using Artemis.Core.Models.Profile.LayerShapes; -using Artemis.UI.Properties; -using Artemis.UI.Services.Interfaces; - -namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools -{ - public class FillToolViewModel : VisualizationToolViewModel - { - private readonly ILayerEditorService _layerEditorService; - - public FillToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService, ILayerEditorService layerEditorService) : base(profileViewModel, profileEditorService) - { - _layerEditorService = layerEditorService; - using (var stream = new MemoryStream(Resources.aero_fill)) - { - Cursor = new Cursor(stream); - } - } - - public override void MouseUp(object sender, MouseButtonEventArgs e) - { - base.MouseUp(sender, e); - - // Find out if the click is inside a layer and if so, fill it - var position = e.GetPosition((IInputElement) sender); - var panZoomVm = ProfileViewModel.PanZoomViewModel; - var layer = ProfileEditorService.SelectedProfile - .GetAllLayers() - .FirstOrDefault(l => l.Leds.Any( - led => panZoomVm.TransformContainingRect(led.RgbLed.AbsoluteLedRectangle).Contains(position)) - ); - - if (layer == null) - return; - layer.LayerShape = new Fill(layer); - - // Apply the full layer rectangle - _layerEditorService.SetShapeBaseFromRectangle(layer.LayerShape, _layerEditorService.GetLayerBounds(layer)); - ProfileEditorService.UpdateSelectedProfileElement(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml deleted file mode 100644 index 077b11991..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml.cs deleted file mode 100644 index 7caf3cef5..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolView.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows.Controls; - -namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools -{ - /// - /// Interaction logic for PolygonToolView.xaml - /// - public partial class PolygonToolView : UserControl - { - public PolygonToolView() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolViewModel.cs deleted file mode 100644 index 7916d925b..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/PolygonToolViewModel.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.IO; -using System.Windows.Input; -using Artemis.UI.Properties; -using Artemis.UI.Services.Interfaces; - -namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools -{ - public class PolygonToolViewModel : VisualizationToolViewModel - { - public PolygonToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService) : base(profileViewModel, profileEditorService) - { - using (var stream = new MemoryStream(Resources.aero_crosshair)) - { - Cursor = new Cursor(stream); - } - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml deleted file mode 100644 index 08544994c..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml.cs deleted file mode 100644 index d18292114..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolView.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows.Controls; - -namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools -{ - /// - /// Interaction logic for RectangleToolView.xaml - /// - public partial class RectangleToolView : UserControl - { - public RectangleToolView() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolViewModel.cs deleted file mode 100644 index 8721fcba9..000000000 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/RectangleToolViewModel.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.IO; -using System.Windows; -using System.Windows.Input; -using Artemis.Core.Models.Profile; -using Artemis.Core.Models.Profile.LayerShapes; -using Artemis.UI.Properties; -using Artemis.UI.Services.Interfaces; - -namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools -{ - public class RectangleToolViewModel : VisualizationToolViewModel - { - private readonly ILayerEditorService _layerEditorService; - private bool _shiftDown; - - public RectangleToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService, ILayerEditorService layerEditorService) - : base(profileViewModel, profileEditorService) - { - _layerEditorService = layerEditorService; - using (var stream = new MemoryStream(Resources.aero_crosshair)) - { - Cursor = new Cursor(stream); - } - } - - public Rect DragRectangle { get; set; } - - public override void MouseMove(object sender, MouseEventArgs e) - { - base.MouseMove(sender, e); - - if (!IsMouseDown) - return; - - var position = ProfileViewModel.PanZoomViewModel.GetRelativeMousePosition(sender, e); - if (!_shiftDown) - DragRectangle = new Rect(MouseDownStartPosition, position); - else - DragRectangle = GetSquareRectBetweenPoints(MouseDownStartPosition, position); - } - - public override void MouseUp(object sender, MouseButtonEventArgs e) - { - base.MouseUp(sender, e); - - if (ProfileEditorService.SelectedProfileElement is Layer layer) - { - // Ensure the shape is a rectangle - if (!(layer.LayerShape is Rectangle)) - layer.LayerShape = new Rectangle(layer); - - // Apply the drag rectangle - _layerEditorService.SetShapeBaseFromRectangle(layer.LayerShape, DragRectangle); - ProfileEditorService.UpdateSelectedProfileElement(); - } - } - - public override void KeyUp(KeyEventArgs e) - { - base.KeyUp(e); - - if (e.Key == Key.LeftShift || e.Key == Key.RightShift) - _shiftDown = false; - } - - public override void KeyDown(KeyEventArgs e) - { - base.KeyDown(e); - - if (e.Key == Key.LeftShift || e.Key == Key.RightShift) - _shiftDown = true; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs index e9578a292..414f63f87 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs @@ -8,18 +8,13 @@ using Artemis.Core.Models.Surface; using Artemis.UI.Extensions; using Artemis.UI.Properties; using Artemis.UI.Services.Interfaces; -using SkiaSharp; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { public class SelectionRemoveToolViewModel : VisualizationToolViewModel { - private readonly ILayerEditorService _layerEditorService; - - public SelectionRemoveToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService, ILayerEditorService layerEditorService) : base(profileViewModel, - profileEditorService) + public SelectionRemoveToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService) : base(profileViewModel, profileEditorService) { - _layerEditorService = layerEditorService; using (var stream = new MemoryStream(Resources.aero_pen_min)) { Cursor = new Cursor(stream); @@ -51,19 +46,10 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools // Apply the selection to the selected layer layer if (ProfileEditorService.SelectedProfileElement is Layer layer) { - // If the layer has a shape, save it's size - var shapeSize = SKRect.Empty; - if (layer.LayerShape != null) - shapeSize = layer.LayerShape.GetUnscaledRectangle(); - var remainingLeds = layer.Leds.Except(selectedLeds).ToList(); layer.ClearLeds(); layer.AddLeds(remainingLeds); - // Restore the saved size - if (layer.LayerShape != null) - layer.LayerShape.SetFromUnscaledRectangle(shapeSize); - ProfileEditorService.UpdateSelectedProfileElement(); } } diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs index bbdc197a0..3a6661113 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs @@ -8,18 +8,13 @@ using Artemis.Core.Models.Surface; using Artemis.UI.Extensions; using Artemis.UI.Properties; using Artemis.UI.Services.Interfaces; -using SkiaSharp; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { public class SelectionToolViewModel : VisualizationToolViewModel { - private readonly ILayerEditorService _layerEditorService; - - public SelectionToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService, ILayerEditorService layerEditorService) - : base(profileViewModel, profileEditorService) + public SelectionToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService) : base(profileViewModel, profileEditorService) { - _layerEditorService = layerEditorService; using (var stream = new MemoryStream(Resources.aero_crosshair)) { Cursor = new Cursor(stream); @@ -51,11 +46,6 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools // Apply the selection to the selected layer layer if (ProfileEditorService.SelectedProfileElement is Layer layer) { - // If the layer has a shape, save it's size - var shapeSize = SKRect.Empty; - if (layer.LayerShape != null) - shapeSize = layer.LayerShape.GetUnscaledRectangle(); - // If shift is held down, add to the selection instead of replacing it if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) layer.AddLeds(selectedLeds.Except(layer.Leds)); @@ -65,10 +55,6 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools layer.AddLeds(selectedLeds); } - // Restore the saved size - if (layer.LayerShape != null) - layer.LayerShape.SetFromUnscaledRectangle(shapeSize); - ProfileEditorService.UpdateSelectedProfileElement(); } // If no layer selected, apply it to a new layer in the selected folder diff --git a/src/Artemis.UI/Services/Interfaces/ILayerEditorService.cs b/src/Artemis.UI/Services/Interfaces/ILayerEditorService.cs index 107f74638..f400a5793 100644 --- a/src/Artemis.UI/Services/Interfaces/ILayerEditorService.cs +++ b/src/Artemis.UI/Services/Interfaces/ILayerEditorService.cs @@ -1,7 +1,6 @@ using System.Windows; using System.Windows.Media; using Artemis.Core.Models.Profile; -using Artemis.Core.Models.Profile.LayerShapes; using SkiaSharp; namespace Artemis.UI.Services.Interfaces @@ -22,13 +21,6 @@ namespace Artemis.UI.Services.Interfaces /// Point GetLayerAnchorPosition(Layer layer); - /// - /// Returns the layer shape's bounds, corrected for the current render scale. - /// - /// - /// - Rect GetLayerShapeBounds(LayerShape layerShape); - /// /// Creates a WPF transform group that contains all the transformations required to render the provided layer. /// Note: Run on UI thread. @@ -47,14 +39,6 @@ namespace Artemis.UI.Services.Interfaces /// SKPath GetLayerPath(Layer layer, bool includeTranslation, bool includeScale, bool includeRotation); - /// - /// Sets the base properties of the given shape to match the provided unscaled rectangle. The rectangle is corrected - /// for the current render scale, anchor property and size property. - /// - /// - /// - void SetShapeBaseFromRectangle(LayerShape layerShape, Rect rect); - /// /// Returns a new point scaled to the layer. /// diff --git a/src/Artemis.UI/Services/LayerShapeService.cs b/src/Artemis.UI/Services/LayerShapeService.cs index aaa80d7a0..2d835fb55 100644 --- a/src/Artemis.UI/Services/LayerShapeService.cs +++ b/src/Artemis.UI/Services/LayerShapeService.cs @@ -1,9 +1,7 @@ using System; -using System.Linq; using System.Windows; using System.Windows.Media; using Artemis.Core.Models.Profile; -using Artemis.Core.Models.Profile.LayerShapes; using Artemis.Core.Services; using Artemis.UI.Services.Interfaces; using SkiaSharp; @@ -33,28 +31,14 @@ namespace Artemis.UI.Services ); } - /// - public Rect GetLayerShapeBounds(LayerShape layerShape) - { - // Adjust the render rectangle for the difference in render scale - var renderScale = _settingsService.GetSetting("Core.RenderScale", 1.0).Value; - return new Rect( - layerShape.Bounds.Left / renderScale * 1, - layerShape.Bounds.Top / renderScale * 1, - Math.Max(0, layerShape.Bounds.Width / renderScale * 1), - Math.Max(0, layerShape.Bounds.Height / renderScale * 1) - ); - } - /// public Point GetLayerAnchorPosition(Layer layer) { - var layerBounds = GetLayerBounds(layer); - var shapeBounds = GetLayerShapeBounds(layer.LayerShape).ToSKRect(); + var layerBounds = GetLayerBounds(layer).ToSKRect(); var positionProperty = layer.PositionProperty.CurrentValue; // Start at the center of the shape - var position = new Point(shapeBounds.MidX, shapeBounds.MidY); + var position = new Point(layerBounds.MidX, layerBounds.MidY); // Apply translation position.X += positionProperty.X * layerBounds.Width; @@ -67,7 +51,6 @@ namespace Artemis.UI.Services public TransformGroup GetLayerTransformGroup(Layer layer) { var layerBounds = GetLayerBounds(layer).ToSKRect(); - var shapeBounds = GetLayerShapeBounds(layer.LayerShape).ToSKRect(); // Apply transformation like done by the core during layer rendering. // The order in which translations are applied are different because the UI renders the shape inside @@ -77,8 +60,8 @@ namespace Artemis.UI.Services var anchorProperty = layer.AnchorPointProperty.CurrentValue; // Translation originates from the unscaled center of the shape and is tied to the anchor - var x = anchorPosition.X - shapeBounds.MidX - anchorProperty.X * layerBounds.Width; - var y = anchorPosition.Y - shapeBounds.MidY - anchorProperty.Y * layerBounds.Height; + var x = anchorPosition.X - layerBounds.MidX - anchorProperty.X * layerBounds.Width; + var y = anchorPosition.Y - layerBounds.MidY - anchorProperty.Y * layerBounds.Height; var transformGroup = new TransformGroup(); transformGroup.Children.Add(new TranslateTransform(x, y)); @@ -92,18 +75,17 @@ namespace Artemis.UI.Services public SKPath GetLayerPath(Layer layer, bool includeTranslation, bool includeScale, bool includeRotation) { var layerBounds = GetLayerBounds(layer).ToSKRect(); - var shapeBounds = GetLayerShapeBounds(layer.LayerShape).ToSKRect(); // Apply transformation like done by the core during layer rendering (same differences apply as in GetLayerTransformGroup) var anchorPosition = GetLayerAnchorPosition(layer).ToSKPoint(); var anchorProperty = layer.AnchorPointProperty.CurrentValue; // Translation originates from the unscaled center of the shape and is tied to the anchor - var x = anchorPosition.X - shapeBounds.MidX - anchorProperty.X * layerBounds.Width; - var y = anchorPosition.Y - shapeBounds.MidY - anchorProperty.Y * layerBounds.Height; + var x = anchorPosition.X - layerBounds.MidX - anchorProperty.X * layerBounds.Width; + var y = anchorPosition.Y - layerBounds.MidY - anchorProperty.Y * layerBounds.Height; var path = new SKPath(); - path.AddRect(shapeBounds); + path.AddRect(layerBounds); if (includeTranslation) path.Transform(SKMatrix.MakeTranslation(x, y)); if (includeScale) @@ -114,46 +96,6 @@ namespace Artemis.UI.Services return path; } - /// - public void SetShapeBaseFromRectangle(LayerShape layerShape, Rect rect) - { - if (!layerShape.Layer.Leds.Any()) - { - layerShape.ScaledRectangle = SKRect.Empty; - return; - } - - var layerBounds = GetLayerBounds(layerShape.Layer).ToSKRect(); - var shapeBounds = GetLayerShapeBounds(layerShape).ToSKRect(); - - var rectangle = SKRect.Create( - (float) rect.Left - layerBounds.Left, - (float) rect.Top - layerBounds.Top, - (float) rect.Width, - (float) rect.Height - ); - - // Adjust the provided rect for the difference in render scale - var anchorPosition = GetLayerAnchorPosition(layerShape.Layer).ToSKPoint(); - var anchorProperty = layerShape.Layer.AnchorPointProperty.CurrentValue; - var sizeProperty = layerShape.Layer.SizeProperty.CurrentValue; - - // Translation originates from the unscaled center of the shape and is tied to the anchor - var x = anchorPosition.X - shapeBounds.MidX - anchorProperty.X * layerBounds.Width; - var y = anchorPosition.Y - shapeBounds.MidY - anchorProperty.Y * layerBounds.Height; - rectangle.Offset(x * -1, y * -1); - - // TODO: Determine the new position of the anchor and scale the rectangle to the current scale - - layerShape.ScaledRectangle = SKRect.Create( - rectangle.Left / layerBounds.Width, - rectangle.Top / layerBounds.Height, - rectangle.Width / layerBounds.Width, - rectangle.Height / layerBounds.Height - ); - layerShape.CalculateRenderProperties(); - } - /// public SKPoint GetScaledPoint(Layer layer, SKPoint point, bool absolute) {