Added undo/redo to profile editor

Added shape anchor point display and movement
This commit is contained in:
Robert committed 2020-01-14 17:19:53 +01:00
1 parent e9677f2070
commit c97b479779
25 files changed
+386 -68

No files matched your search

@@ -1,10 +1,12 @@
using System;
using System.Diagnostics.Eventing.Reader;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using Artemis.Core.Models.Profile;
using Artemis.UI.Services.Interfaces;
using SkiaSharp;
using SkiaSharp.Views.WPF;
namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
{
@@ -13,6 +15,9 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
private bool _isDragging;
private double _dragOffsetY;
private double _dragOffsetX;
private Point _dragStart;
private bool _draggingHorizontally;
private bool _draggingVertically;
public EditToolViewModel(ProfileViewModel profileViewModel, IProfileEditorService profileEditorService) : base(profileViewModel, profileEditorService)
{
@@ -24,16 +29,21 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
profileEditorService.ProfilePreviewUpdated += (sender, args) => Update();
}
public SKRect ShapeSkRect { get; set; }
public SKPoint AnchorSkPoint { get; set; }
private void Update()
{
if (ProfileEditorService.SelectedProfileElement is Layer layer)
{
ShapeSkRect = layer.LayerShape.GetUnscaledRectangle();
if (layer.LayerShape != null)
{
ShapeSkRect = layer.LayerShape.GetUnscaledRectangle();
AnchorSkPoint = layer.LayerShape.GetUnscaledAnchor();
}
}
}
public SKRect ShapeSkRect { get; set; }
public void ShapeEditMouseDown(object sender, MouseButtonEventArgs e)
{
if (_isDragging)
@@ -46,9 +56,13 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
var skRect = layer.LayerShape.GetUnscaledRectangle();
_dragOffsetX = skRect.Left - dragStartPosition.X;
_dragOffsetY = skRect.Top - dragStartPosition.Y;
_dragStart = dragStartPosition;
}
_isDragging = true;
_draggingHorizontally = false;
_draggingVertically = false;
e.Handled = true;
}
@@ -58,9 +72,22 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
ProfileEditorService.UpdateSelectedProfileElement();
_isDragging = false;
_draggingHorizontally = false;
_draggingVertically = false;
e.Handled = true;
}
public void AnchorMove(object sender, MouseEventArgs e)
{
if (!_isDragging || !(ProfileEditorService.SelectedProfileElement is Layer layer))
return;
var position = GetRelativePosition(sender, e);
layer.LayerShape.SetFromUnscaledAnchor(new SKPoint((float) position.X, (float) position.Y), ProfileEditorService.CurrentTime);
ProfileEditorService.UpdateProfilePreview();
}
public void Move(object sender, MouseEventArgs e)
{
if (!_isDragging || !(ProfileEditorService.SelectedProfileElement is Layer layer))
@@ -68,10 +95,24 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
var position = GetRelativePosition(sender, e);
var skRect = layer.LayerShape.GetUnscaledRectangle();
layer.LayerShape.SetFromUnscaledRectangle(
SKRect.Create((float) (position.X + _dragOffsetX), (float) (position.Y + _dragOffsetY), skRect.Width, skRect.Height),
ProfileEditorService.CurrentTime
);
var x = (float) (position.X + _dragOffsetX);
var y = (float) (position.Y + _dragOffsetY);
if (!Keyboard.IsKeyDown(Key.LeftShift) && !Keyboard.IsKeyDown(Key.RightShift))
layer.LayerShape.SetFromUnscaledRectangle(SKRect.Create(x, y, skRect.Width, skRect.Height), ProfileEditorService.CurrentTime);
else
{
if (_draggingVertically)
layer.LayerShape.SetFromUnscaledRectangle(SKRect.Create(skRect.Left, y, skRect.Width, skRect.Height), ProfileEditorService.CurrentTime);
else if (_draggingHorizontally)
layer.LayerShape.SetFromUnscaledRectangle(SKRect.Create(x, skRect.Top, skRect.Width, skRect.Height), ProfileEditorService.CurrentTime);
else
{
_draggingHorizontally = Math.Abs(position.X - _dragStart.X) > Math.Abs(position.Y - _dragStart.Y);
_draggingVertically = Math.Abs(position.X - _dragStart.X) < Math.Abs(position.Y - _dragStart.Y);
}
}
ProfileEditorService.UpdateProfilePreview();
}
@@ -81,6 +122,24 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
public void TopLeftResize(object sender, MouseEventArgs e)
{
if (!_isDragging || !(ProfileEditorService.SelectedProfileElement is Layer layer))
return;
var position = GetRelativePosition(sender, e);
var skRect = layer.LayerShape.GetUnscaledRectangle();
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{
// Take the greatest difference
// Base the smallest difference on the greatest difference, maintaining aspect ratio
}
else
{
skRect.Top = (float) Math.Min(position.Y, skRect.Bottom);
skRect.Left = (float) Math.Min(position.X, skRect.Bottom);
}
layer.LayerShape.SetFromUnscaledRectangle(skRect, ProfileEditorService.CurrentTime);
ProfileEditorService.UpdateProfilePreview();
}
public void TopCenterResize(object sender, MouseEventArgs e)
@@ -102,6 +161,24 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
public void TopRightResize(object sender, MouseEventArgs e)
{
if (!_isDragging || !(ProfileEditorService.SelectedProfileElement is Layer layer))
return;
var position = GetRelativePosition(sender, e);
var skRect = layer.LayerShape.GetUnscaledRectangle();
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{
// Take the greatest difference
// Base the smallest difference on the greatest difference, maintaining aspect ratio
}
else
{
skRect.Top = (float) Math.Min(position.Y, skRect.Bottom);
skRect.Right = (float) Math.Max(position.X, skRect.Left);
}
layer.LayerShape.SetFromUnscaledRectangle(skRect, ProfileEditorService.CurrentTime);
ProfileEditorService.UpdateProfilePreview();
}
public void CenterRightResize(object sender, MouseEventArgs e)
@@ -129,6 +206,24 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
public void BottomRightResize(object sender, MouseEventArgs e)
{
if (!_isDragging || !(ProfileEditorService.SelectedProfileElement is Layer layer))
return;
var position = GetRelativePosition(sender, e);
var skRect = layer.LayerShape.GetUnscaledRectangle();
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{
// Take the greatest difference
// Base the smallest difference on the greatest difference, maintaining aspect ratio
}
else
{
skRect.Bottom = (float) Math.Max(position.Y, skRect.Top);
skRect.Right = (float) Math.Max(position.X, skRect.Left);
}
layer.LayerShape.SetFromUnscaledRectangle(skRect, ProfileEditorService.CurrentTime);
ProfileEditorService.UpdateProfilePreview();
}
public void BottomCenterResize(object sender, MouseEventArgs e)
@@ -150,6 +245,24 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools
public void BottomLeftResize(object sender, MouseEventArgs e)
{
if (!_isDragging || !(ProfileEditorService.SelectedProfileElement is Layer layer))
return;
var position = GetRelativePosition(sender, e);
var skRect = layer.LayerShape.GetUnscaledRectangle();
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{
// Take the greatest difference
// Base the smallest difference on the greatest difference, maintaining aspect ratio
}
else
{
skRect.Bottom = (float) Math.Max(position.Y, skRect.Top);
skRect.Left = (float) Math.Min(position.X, skRect.Right);
}
layer.LayerShape.SetFromUnscaledRectangle(skRect, ProfileEditorService.CurrentTime);
ProfileEditorService.UpdateProfilePreview();
}
public void CenterLeftResize(object sender, MouseEventArgs e)