Browse Source

Viewmodel things

Equbuxu 3 years ago
parent
commit
ca61f08b36

+ 13 - 20
src/PixiEditorPrototype/CustomControls/TransformOverlay/TransformOverlay.cs

@@ -17,10 +17,6 @@ internal class TransformOverlay : Control
         DependencyProperty.Register(nameof(Corners), typeof(ShapeCorners), typeof(TransformOverlay),
             new FrameworkPropertyMetadata(default(ShapeCorners), FrameworkPropertyMetadataOptions.AffectsRender));
 
-    public static DependencyProperty OriginProperty =
-        DependencyProperty.Register(nameof(Origin), typeof(Vector2d), typeof(TransformOverlay),
-            new FrameworkPropertyMetadata(default(Vector2d), FrameworkPropertyMetadataOptions.AffectsRender));
-
     public static DependencyProperty ZoomboxScaleProperty =
         DependencyProperty.Register(nameof(ZoomboxScale), typeof(double), typeof(TransformOverlay),
             new FrameworkPropertyMetadata(1.0, FrameworkPropertyMetadataOptions.AffectsRender));
@@ -70,11 +66,8 @@ internal class TransformOverlay : Control
         get => (double)GetValue(ZoomboxScaleProperty);
         set => SetValue(ZoomboxScaleProperty, value);
     }
-    public Vector2d Origin
-    {
-        get => (Vector2d)GetValue(OriginProperty);
-        set => SetValue(OriginProperty, value);
-    }
+
+    private Vector2d origin;
 
     private bool isMoving = false;
     private Vector2d mousePosOnStartMove = new();
@@ -98,7 +91,7 @@ internal class TransformOverlay : Control
     protected override void OnRender(DrawingContext drawingContext)
     {
         base.OnRender(drawingContext);
-        TransformHelper.DrawOverlay(drawingContext, new(ActualWidth, ActualHeight), Corners, Origin, ZoomboxScale);
+        TransformHelper.DrawOverlay(drawingContext, new(ActualWidth, ActualHeight), Corners, origin, ZoomboxScale);
     }
 
     protected override void OnMouseDown(MouseButtonEventArgs e)
@@ -107,19 +100,19 @@ internal class TransformOverlay : Control
 
         e.Handled = true;
         var pos = TransformHelper.ToVector2d(e.GetPosition(this));
-        var anchor = TransformHelper.GetAnchorInPosition(pos, Corners, Origin, ZoomboxScale);
+        var anchor = TransformHelper.GetAnchorInPosition(pos, Corners, origin, ZoomboxScale);
         if (anchor is not null)
         {
             capturedAnchor = anchor;
             cornersOnStartAnchorDrag = Corners;
-            originOnStartAnchorDrag = Origin;
+            originOnStartAnchorDrag = origin;
             mousePosOnStartAnchorDrag = pos;
         }
         else if (Corners.IsPointInside(pos) || TransformHelper.IsWithinTransformHandle(TransformHelper.GetDragHandlePos(Corners, ZoomboxScale), pos, ZoomboxScale))
         {
             isMoving = true;
             mousePosOnStartMove = TransformHelper.ToVector2d(e.GetPosition(this));
-            originOnStartMove = Origin;
+            originOnStartMove = origin;
             cornersOnStartMove = Corners;
         }
         else
@@ -156,17 +149,17 @@ internal class TransformOverlay : Control
                 TopRight = cornersOnStartMove.TopRight + delta,
             };
 
-            Origin = originOnStartMove + delta;
+            origin = originOnStartMove + delta;
         }
         else if (isRotating)
         {
             var pos = TransformHelper.ToVector2d(e.GetPosition(this));
-            var angle = (mousePosOnStartRotate - Origin).CCWAngleTo(pos - Origin);
+            var angle = (mousePosOnStartRotate - origin).CCWAngleTo(pos - origin);
             if (SnapToAngles)
                 angle = TransformHelper.FindSnappingAngle(cornersOnStartRotate, angle);
             proportionalAngle1 = propAngle1OnStartRotate + angle;
             proportionalAngle2 = propAngle2OnStartRotate + angle;
-            Corners = TransformUpdateHelper.UpdateShapeFromRotation(cornersOnStartRotate, Origin, angle);
+            Corners = TransformUpdateHelper.UpdateShapeFromRotation(cornersOnStartRotate, origin, angle);
         }
     }
 
@@ -191,7 +184,7 @@ internal class TransformOverlay : Control
                 Corners = shouldSnap ? TransformHelper.SnapToPixels((ShapeCorners)newCorners) : (ShapeCorners)newCorners;
             }
             if (!originWasManuallyDragged)
-                Origin = TransformHelper.OriginFromCorners(Corners);
+                origin = TransformHelper.OriginFromCorners(Corners);
         }
         else if (TransformHelper.IsSide((Anchor)capturedAnchor))
         {
@@ -203,12 +196,12 @@ internal class TransformOverlay : Control
                 Corners = shouldSnap ? TransformHelper.SnapToPixels((ShapeCorners)newCorners) : (ShapeCorners)newCorners;
             }
             if (!originWasManuallyDragged)
-                Origin = TransformHelper.OriginFromCorners(Corners);
+                origin = TransformHelper.OriginFromCorners(Corners);
         }
         else if (capturedAnchor == Anchor.Origin)
         {
             originWasManuallyDragged = true;
-            Origin = originOnStartAnchorDrag + pos - mousePosOnStartAnchorDrag;
+            origin = originOnStartAnchorDrag + pos - mousePosOnStartAnchorDrag;
         }
     }
 
@@ -238,7 +231,7 @@ internal class TransformOverlay : Control
         overlay.Corners = (ShapeCorners)args.NewValue;
         overlay.proportionalAngle1 = (overlay.Corners.BottomRight - overlay.Corners.TopLeft).Angle;
         overlay.proportionalAngle2 = (overlay.Corners.TopRight - overlay.Corners.BottomLeft).Angle;
-        overlay.Origin = TransformHelper.OriginFromCorners(overlay.Corners);
+        overlay.origin = TransformHelper.OriginFromCorners(overlay.Corners);
     }
 
     private bool ReleaseAnchor()

+ 0 - 27
src/PixiEditorPrototype/CustomControls/TransformOverlay/TransformUpdateHelper.cs

@@ -66,33 +66,6 @@ internal static class TransformUpdateHelper
 
         if (freedom is TransformSideFreedom.ScaleProportionally)
         {
-            /*
-            var targetPos = TransformHelper.GetAnchorPosition(corners, targetSide);
-            var opposite = TransformHelper.GetOpposite(targetSide);
-            var oppositePos = TransformHelper.GetAnchorPosition(corners, opposite);
-
-            Vector2d thing = targetPos - oppositePos;
-            thing = Vector2d.FromAngleAndLength(thing.Angle, 1 / thing.Length);
-            double scalingFactor = (desiredPos - oppositePos) * thing;
-            Vector2d scalingVector = new(1, scalingFactor / 2);
-            corners.TopLeft = ((corners.TopLeft - oppositePos).Rotate(-propAngle1).Multiply(scalingVector)).Rotate(propAngle1) + oppositePos;
-            corners.TopRight = ((corners.TopRight - oppositePos).Rotate(-propAngle1).Multiply(scalingVector)).Rotate(propAngle1) + oppositePos;
-            corners.BottomLeft = ((corners.BottomLeft - oppositePos).Rotate(-propAngle1).Multiply(scalingVector)).Rotate(propAngle1) + oppositePos;
-            corners.BottomRight = ((corners.BottomRight - oppositePos).Rotate(-propAngle1).Multiply(scalingVector)).Rotate(propAngle1) + oppositePos;
-
-            corners.TopLeft = ((corners.TopLeft - oppositePos).Rotate(-propAngle2).Multiply(scalingVector)).Rotate(propAngle2) + oppositePos;
-            corners.TopRight = ((corners.TopRight - oppositePos).Rotate(-propAngle2).Multiply(scalingVector)).Rotate(propAngle2) + oppositePos;
-            corners.BottomLeft = ((corners.BottomLeft - oppositePos).Rotate(-propAngle2).Multiply(scalingVector)).Rotate(propAngle2) + oppositePos;
-            corners.BottomRight = ((corners.BottomRight - oppositePos).Rotate(-propAngle2).Multiply(scalingVector)).Rotate(propAngle2) + oppositePos;
-
-            return corners;
-            */
-
-            //var (corner1, corner2) = TransformHelper.GetCornersOnSide(targetSide);
-            //UpdateShapeFromCorner(corner1, TransformCornerFreedom.ScaleProportionally, propAngle1, propAngle2, corners,)
-
-
-
             var targetPos = TransformHelper.GetAnchorPosition(corners, targetSide);
             var opposite = TransformHelper.GetOpposite(targetSide);
             var oppositePos = TransformHelper.GetAnchorPosition(corners, opposite);

+ 87 - 0
src/PixiEditorPrototype/ViewModels/DocumentTransformViewModel.cs

@@ -0,0 +1,87 @@
+using System;
+using System.ComponentModel;
+using ChunkyImageLib.DataHolders;
+using PixiEditorPrototype.CustomControls.TransformOverlay;
+
+namespace PixiEditorPrototype.ViewModels;
+internal class DocumentTransformViewModel : INotifyPropertyChanged
+{
+    private TransformCornerFreedom cornerFreedom;
+    public TransformCornerFreedom CornerFreedom
+    {
+        get => cornerFreedom;
+        set
+        {
+            cornerFreedom = value;
+            PropertyChanged?.Invoke(this, new(nameof(CornerFreedom)));
+        }
+    }
+
+    private TransformSideFreedom sideFreedom;
+    public TransformSideFreedom SideFreedom
+    {
+        get => sideFreedom;
+        set
+        {
+            sideFreedom = value;
+            PropertyChanged?.Invoke(this, new(nameof(SideFreedom)));
+        }
+    }
+
+    private bool transformActive;
+    public bool TransformActive
+    {
+        get => transformActive;
+        set
+        {
+            transformActive = value;
+            PropertyChanged?.Invoke(this, new(nameof(TransformActive)));
+        }
+    }
+
+    private ShapeCorners requestedCorners;
+    public ShapeCorners RequestedCorners
+    {
+        get => requestedCorners;
+        set
+        {
+            requestedCorners = value;
+            PropertyChanged?.Invoke(this, new(nameof(RequestedCorners)));
+        }
+    }
+
+    private ShapeCorners corners;
+    public ShapeCorners Corners
+    {
+        get => corners;
+        set
+        {
+            corners = value;
+            PropertyChanged?.Invoke(this, new(nameof(Corners)));
+            TransformMoved?.Invoke(this, value);
+        }
+    }
+    public event PropertyChangedEventHandler? PropertyChanged;
+    public event EventHandler<ShapeCorners>? TransformMoved;
+
+    public void HideTransform()
+    {
+        TransformActive = false;
+    }
+
+    public void ShowShapeTransform(ShapeCorners initPos)
+    {
+        CornerFreedom = TransformCornerFreedom.Scale;
+        SideFreedom = TransformSideFreedom.ScaleProportionally;
+        RequestedCorners = initPos;
+        TransformActive = true;
+    }
+
+    public void ShowFreeTransform(ShapeCorners initPos)
+    {
+        CornerFreedom = TransformCornerFreedom.Scale;
+        SideFreedom = TransformSideFreedom.ScaleProportionally;
+        RequestedCorners = initPos;
+        TransformActive = true;
+    }
+}

+ 10 - 79
src/PixiEditorPrototype/ViewModels/DocumentViewModel.cs

@@ -14,7 +14,6 @@ using PixiEditor.ChangeableDocument.Actions.Root;
 using PixiEditor.ChangeableDocument.Actions.Structure;
 using PixiEditor.ChangeableDocument.Actions.Undo;
 using PixiEditor.ChangeableDocument.Enums;
-using PixiEditorPrototype.CustomControls.TransformOverlay;
 using PixiEditorPrototype.Models;
 using SkiaSharp;
 
@@ -33,74 +32,6 @@ internal class DocumentViewModel : INotifyPropertyChanged
         }
     }
 
-    private TransformCornerFreedom transformCornerFreedom;
-    public TransformCornerFreedom TransformCornerFreedom
-    {
-        get => transformCornerFreedom;
-        set
-        {
-            transformCornerFreedom = value;
-            PropertyChanged?.Invoke(this, new(nameof(TransformCornerFreedom)));
-        }
-    }
-
-    private TransformSideFreedom transformSideFreedom;
-    public TransformSideFreedom TransformSideFreedom
-    {
-        get => transformSideFreedom;
-        set
-        {
-            transformSideFreedom = value;
-            PropertyChanged?.Invoke(this, new(nameof(TransformSideFreedom)));
-        }
-    }
-
-    private bool transformActive;
-    public bool TransformActive
-    {
-        get => transformActive;
-        set
-        {
-            transformActive = value;
-            PropertyChanged?.Invoke(this, new(nameof(TransformActive)));
-        }
-    }
-
-    private ShapeCorners requestedTransformCorners;
-    public ShapeCorners RequestedTransformCorners
-    {
-        get => requestedTransformCorners;
-        set
-        {
-            requestedTransformCorners = value;
-            RaisePropertyChanged(nameof(RequestedTransformCorners));
-        }
-    }
-
-    private ShapeCorners transformCorners;
-    public ShapeCorners TransformCorners
-    {
-        get => transformCorners;
-        set
-        {
-            transformCorners = value;
-            RaisePropertyChanged(nameof(TransformCorners));
-            OnTransformUpdate();
-        }
-    }
-
-    private Vector2d transformOrigin;
-    public Vector2d TransformOrigin
-    {
-        get => transformOrigin;
-        set
-        {
-            transformOrigin = value;
-            RaisePropertyChanged(nameof(TransformOrigin));
-        }
-    }
-
-
     public event PropertyChangedEventHandler? PropertyChanged;
 
     public void RaisePropertyChanged(string name)
@@ -109,6 +40,7 @@ internal class DocumentViewModel : INotifyPropertyChanged
     }
 
     public FolderViewModel StructureRoot { get; }
+    public DocumentTransformViewModel TransformViewModel { get; }
     public RelayCommand? UndoCommand { get; }
     public RelayCommand? RedoCommand { get; }
     public RelayCommand? ClearSelectionCommand { get; }
@@ -152,11 +84,13 @@ internal class DocumentViewModel : INotifyPropertyChanged
     {
         this.owner = owner;
 
+        TransformViewModel = new();
+        TransformViewModel.TransformMoved += OnTransformUpdate;
+
         StateHandler = new(this);
         Helpers = new DocumentHelpers(this);
         StructureRoot = new FolderViewModel(this, Helpers, Helpers.Tracker.Document.ReadOnlyStructureRoot);
 
-
         UndoCommand = new RelayCommand(Undo);
         RedoCommand = new RelayCommand(Redo);
         ClearSelectionCommand = new RelayCommand(ClearSelection);
@@ -209,10 +143,7 @@ internal class DocumentViewModel : INotifyPropertyChanged
             return;
         drawingRectangle = false;
 
-        RequestedTransformCorners = lastShape;
-        TransformCornerFreedom = TransformCornerFreedom.Free;
-        TransformSideFreedom = TransformSideFreedom.ScaleProportionally;
-        TransformActive = true;
+        TransformViewModel.ShowShapeTransform(lastShape);
         transformingRectangle = true;
     }
 
@@ -222,7 +153,7 @@ internal class DocumentViewModel : INotifyPropertyChanged
             return;
 
         transformingRectangle = false;
-        TransformActive = false;
+        TransformViewModel.HideTransform();
         Helpers.ActionAccumulator.AddFinishedActions(new EndDrawRectangle_Action());
     }
 
@@ -243,14 +174,14 @@ internal class DocumentViewModel : INotifyPropertyChanged
         Helpers.ActionAccumulator.AddFinishedActions(new EndSelectRectangle_Action());
     }
 
-    private void OnTransformUpdate()
+    private void OnTransformUpdate(object? sender, ShapeCorners newCorners)
     {
         if (!transformingRectangle)
             return;
         StartUpdateRectangle(new ShapeData(
-            TransformCorners.RectCenter,
-            TransformCorners.RectSize,
-            TransformCorners.RectRotation,
+            newCorners.RectCenter,
+            newCorners.RectSize,
+            newCorners.RectRotation,
             lastShapeData.StrokeWidth,
             lastShapeData.StrokeColor,
             lastShapeData.FillColor,

+ 1 - 1
src/PixiEditorPrototype/ViewModels/ViewModelMain.cs

@@ -111,7 +111,7 @@ internal class ViewModelMain : INotifyPropertyChanged
 
     private void MouseDown(object? param)
     {
-        if (ActiveDocument is null || ZoomboxMode != ZoomboxMode.Normal || ActiveDocument.TransformActive)
+        if (ActiveDocument is null || ZoomboxMode != ZoomboxMode.Normal || ActiveDocument.TransformViewModel.TransformActive)
             return;
         mouseIsDown = true;
         var args = (MouseButtonEventArgs)(param!);

+ 5 - 6
src/PixiEditorPrototype/Views/MainWindow.xaml

@@ -199,12 +199,11 @@
                             </i:Interaction.Triggers>
                         </Image>
                         <to:TransformOverlay HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
-                                            Visibility="{Binding ActiveDocument.TransformActive, Converter={StaticResource BoolToVisibilityConverter}}"
-                                            Corners="{Binding ActiveDocument.TransformCorners, Mode=TwoWay}"
-                                            RequestedCorners="{Binding ActiveDocument.RequestedTransformCorners}"
-                                            CornerFreedom="{Binding ActiveDocument.TransformCornerFreedom}"
-                                            SideFreedom="{Binding ActiveDocument.TransformSideFreedom}"
-                                            Origin="{Binding ActiveDocument.TransformOrigin}"
+                                            Visibility="{Binding ActiveDocument.TransformViewModel.TransformActive, Converter={StaticResource BoolToVisibilityConverter}}"
+                                            Corners="{Binding ActiveDocument.TransformViewModel.Corners, Mode=TwoWay}"
+                                            RequestedCorners="{Binding ActiveDocument.TransformViewModel.RequestedCorners}"
+                                            CornerFreedom="{Binding ActiveDocument.TransformViewModel.CornerFreedom}"
+                                            SideFreedom="{Binding ActiveDocument.TransformViewModel.SideFreedom}"
                                             ZoomboxScale="{Binding RelativeSource={RelativeSource AncestorType=zoombox:Zoombox}, Path=Scale}"/>
                     </Grid>
                 </Border>