Browse Source

Rotate viewport tool

Equbuxu 3 years ago
parent
commit
3a4e0e73ab

+ 1 - 0
src/PixiEditor/Helpers/Converters/ActiveToolToZoomModeConverter.cs

@@ -11,6 +11,7 @@ internal class ActiveToolToZoomModeConverter : SingleInstanceConverter<ActiveToo
         {
             MoveViewportToolViewModel => ZoomboxMode.Move,
             ZoomToolViewModel => ZoomboxMode.Zoom,
+            RotateViewportToolViewModel => ZoomboxMode.Rotate,
             _ => ZoomboxMode.Normal,
         };
     }

+ 1 - 0
src/PixiEditor/Helpers/Extensions/ServiceCollectionHelpers.cs

@@ -45,6 +45,7 @@ internal static class ServiceCollectionHelpers
         .AddSingleton<DocumentManagerViewModel>()
         // Tools
         .AddSingleton<ToolViewModel, MoveViewportToolViewModel>()
+        .AddSingleton<ToolViewModel, RotateViewportToolViewModel>()
         .AddSingleton<ToolViewModel, MoveToolViewModel>()
         .AddSingleton<ToolViewModel, PenToolViewModel>()
         .AddSingleton<ToolViewModel, SelectToolViewModel>()

BIN
src/PixiEditor/Images/Tools/RotateViewportImage.png


+ 57 - 0
src/PixiEditor/Images/Tools/RotateViewportImage.svg

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="24"
+   height="24"
+   viewBox="0 0 6.3499998 6.3499998"
+   version="1.1"
+   id="svg5"
+   inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
+   sodipodi:docname="RotateViewportImage.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview7"
+     pagecolor="#000000"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     inkscape:pagecheckerboard="false"
+     inkscape:document-units="px"
+     showgrid="true"
+     units="px"
+     inkscape:zoom="18.415713"
+     inkscape:cx="8.6339314"
+     inkscape:cy="12.815143"
+     inkscape:window-width="1920"
+     inkscape:window-height="1009"
+     inkscape:window-x="1272"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid824"
+       empspacing="4"
+       empcolor="#ffbb3f"
+       empopacity="0.25098039"
+       color="#ff3f54"
+       opacity="0.1254902" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2" />
+  <g
+     inkscape:label="Слой 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       id="path853"
+       style="fill:none;stroke:#ffffff;stroke-width:0.529167;stroke-linejoin:bevel"
+       d="m 0.5291667,3.175 c 0,-1.4612534 1.1845799,-2.6458333 2.6458333,-2.6458333 1.4612533,6e-8 2.6458332,1.18458 2.6458332,2.6458333 m 0,0 C 5.8208331,4.6362533 4.6362533,5.8208331 3.175,5.8208332 1.7137467,5.8208332 0.52916676,4.6362533 0.5291667,3.175"
+       sodipodi:nodetypes="csccsc" />
+  </g>
+</svg>

+ 2 - 0
src/PixiEditor/PixiEditor.csproj

@@ -189,6 +189,7 @@
 		<None Remove="Images\Tools\MoveViewportImage.png" />
 		<None Remove="Images\Tools\PenImage.png" />
 		<None Remove="Images\Tools\RectangleImage.png" />
+		<None Remove="Images\Tools\RotateViewportImage.png" />
 		<None Remove="Images\Tools\SelectImage.png" />
 		<None Remove="Images\Tools\ZoomImage.png" />
 		<None Remove="Images\Trash.png" />
@@ -276,6 +277,7 @@
 		<Resource Include="Images\Tools\MoveViewportImage.png" />
 		<Resource Include="Images\Tools\PenImage.png" />
 		<Resource Include="Images\Tools\RectangleImage.png" />
+		<Resource Include="Images\Tools\RotateViewportImage.png" />
 		<Resource Include="Images\Tools\SelectImage.png" />
 		<Resource Include="Images\Tools\ZoomImage.png" />
 		<Resource Include="Images\Trash.png" />

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/MoveViewportToolViewModel.cs

@@ -15,5 +15,5 @@ internal class MoveViewportToolViewModel : ToolViewModel
 
     public override BrushShape BrushShape => BrushShape.Hidden;
     public override bool HideHighlight => true;
-    public override string Tooltip => $"Move viewport. ({Shortcut})";
+    public override string Tooltip => $"Moves viewport. ({Shortcut})";
 }

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/PenToolViewModel.cs

@@ -17,7 +17,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools
             Toolbar = new PenToolbar();
         }
 
-        public override string Tooltip => $"Standard brush. ({Shortcut})";
+        public override string Tooltip => $"Pen. ({Shortcut})";
 
         public override void OnLeftMouseButtonDown(VecD pos)
         {

+ 25 - 0
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/RotateViewportToolViewModel.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+using PixiEditor.Models.Commands.Attributes.Commands;
+using PixiEditor.Views.UserControls.BrushShapeOverlay;
+
+namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
+
+[Command.Tool(Key = Key.R)]
+internal class RotateViewportToolViewModel : ToolViewModel
+{
+    public override BrushShape BrushShape => BrushShape.Hidden;
+
+    public RotateViewportToolViewModel()
+    {
+        ActionDisplay = "Rotate viewport";
+    }
+
+    public override bool HideHighlight => true;
+
+    public override string Tooltip => $"Rotates viewport ({Shortcut})";
+}

+ 1 - 6
src/PixiEditor/Views/MainWindow.xaml

@@ -53,12 +53,6 @@
                 x:Key="NotNullToBoolConverter" />
             <converters:DoubleToIntConverter
                 x:Key="DoubleToIntConverter" />
-            <converters:IsSpecifiedTypeConverter
-                SpecifiedType="{x:Type tools:ZoomToolViewModel}"
-                x:Key="IsZoomToolConverter" />
-            <converters:IsSpecifiedTypeConverter
-                SpecifiedType="{x:Type tools:MoveViewportToolViewModel}"
-                x:Key="IsMoveViewportToolConverter" />
             <converters:SKColorToMediaColorConverter
                 x:Key="SKColorToMediaColorConverter" />
             <ResourceDictionary.MergedDictionaries>
@@ -714,6 +708,7 @@
                                     ToolTip="{Binding Tooltip}">
                                     <Button.Background>
                                         <ImageBrush
+                                            RenderOptions.BitmapScalingMode="Fant"
                                             ImageSource="{Binding ImagePath}"
                                             Stretch="Uniform" />
                                     </Button.Background>

+ 2 - 1
src/PixiEditor/Views/UserControls/TransformOverlay/TransformHelper.cs

@@ -33,7 +33,7 @@ internal static class TransformHelper
         return corners;
     }
 
-    public static Cursor GetResizeCursor(Anchor anchor, ShapeCorners corners)
+    public static Cursor GetResizeCursor(Anchor anchor, ShapeCorners corners, double zoomboxAngle)
     {
         double angle;
         if (IsSide(anchor))
@@ -55,6 +55,7 @@ internal static class TransformHelper
         {
             return Cursors.Arrow;
         }
+        angle += zoomboxAngle;
         angle = Math.Round(angle * 4 / Math.PI);
         angle = (int)((angle % 8 + 8) % 8);
         if (angle is (0 or 4))

+ 10 - 1
src/PixiEditor/Views/UserControls/TransformOverlay/TransformOverlay.cs

@@ -39,6 +39,15 @@ internal class TransformOverlay : Decorator
         DependencyProperty.Register(nameof(InternalState), typeof(TransformState), typeof(TransformOverlay),
             new FrameworkPropertyMetadata(default(TransformState), FrameworkPropertyMetadataOptions.AffectsRender));
 
+    public static readonly DependencyProperty ZoomboxAngleProperty =
+        DependencyProperty.Register(nameof(ZoomboxAngle), typeof(double), typeof(TransformOverlay), new(0.0));
+
+    public double ZoomboxAngle
+    {
+        get => (double)GetValue(ZoomboxAngleProperty);
+        set => SetValue(ZoomboxAngleProperty, value);
+    }
+
     public TransformState InternalState
     {
         get => (TransformState)GetValue(InternalStateProperty);
@@ -305,7 +314,7 @@ internal class TransformOverlay : Decorator
                 (TransformHelper.IsSide((Anchor)anchor) && SideFreedom == TransformSideFreedom.Free))
                 finalCursor = Cursors.Arrow;
             else
-                finalCursor = TransformHelper.GetResizeCursor((Anchor)anchor, Corners);
+                finalCursor = TransformHelper.GetResizeCursor((Anchor)anchor, Corners, ZoomboxAngle);
         }
 
         if (Cursor != finalCursor)

+ 2 - 1
src/PixiEditor/Views/UserControls/Viewport.xaml

@@ -131,7 +131,8 @@
                         LockRotation="{Binding Document.TransformViewModel.LockRotation}"
                         SnapToAngles="{Binding Document.TransformViewModel.SnapToAngles}"
                         InternalState="{Binding Document.TransformViewModel.InternalState, Mode=TwoWay}"
-                        ZoomboxScale="{Binding Zoombox.Scale}"/>
+                        ZoomboxScale="{Binding Zoombox.Scale}"
+                        ZoomboxAngle="{Binding Zoombox.Angle}"/>
                     <Grid IsHitTestVisible="False" SnapsToDevicePixels="True"
                         ShowGridLines="True" Width="{Binding Document.Width}" Height="{Binding Document.Height}" Panel.ZIndex="10" 
                         Visibility="{Binding GridLinesVisible, Converter={converters:BoolToVisibilityConverter}, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:Viewport}}">