Equbuxu пре 3 година
родитељ
комит
ba9718f457

+ 8 - 5
src/PixiEditor.Zoombox/Operations/ZoomDragOperation.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Windows;
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
 
@@ -10,6 +11,7 @@ internal class ZoomDragOperation : IDragOperation
 
     private VecD scaleOrigin;
     private VecD screenScaleOrigin;
+    private double originalScale;
 
     public ZoomDragOperation(Zoombox zoomBox)
     {
@@ -18,20 +20,21 @@ internal class ZoomDragOperation : IDragOperation
 
     public void Start(MouseButtonEventArgs e)
     {
-        screenScaleOrigin = parent.ToZoomboxSpace(Zoombox.ToVecD(e.GetPosition(parent.mainCanvas)));
+        screenScaleOrigin = Zoombox.ToVecD(e.GetPosition(parent.mainCanvas));
         scaleOrigin = parent.ToZoomboxSpace(screenScaleOrigin);
+        originalScale = parent.Scale;
         parent.mainCanvas.CaptureMouse();
     }
 
     public void Update(MouseEventArgs e)
     {
-        var curScreenPos = e.GetPosition(parent.mainCanvas);
-        double deltaX = screenScaleOrigin.X - curScreenPos.X;
+        Point curScreenPos = e.GetPosition(parent.mainCanvas);
+        double deltaX = curScreenPos.X - screenScaleOrigin.X;
         double deltaPower = deltaX / 10.0;
 
-        parent.Scale *= Math.Pow(Zoombox.ScaleFactor, deltaPower);
+        parent.Scale = originalScale * Math.Pow(Zoombox.ScaleFactor, deltaPower);
 
-        var shiftedOrigin = parent.ToZoomboxSpace(screenScaleOrigin);
+        VecD shiftedOrigin = parent.ToZoomboxSpace(screenScaleOrigin);
         parent.Center += scaleOrigin - shiftedOrigin;
     }
 

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

@@ -0,0 +1,17 @@
+using System.Globalization;
+using PixiEditor.ViewModels.SubViewModels.Tools.Tools;
+using PixiEditor.Zoombox;
+
+namespace PixiEditor.Helpers.Converters;
+internal class ActiveToolToZoomModeConverter : SingleInstanceConverter<ActiveToolToZoomModeConverter>
+{
+    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+    {
+        return value switch
+        {
+            MoveViewportToolViewModel => ZoomboxMode.Move,
+            ZoomToolViewModel => ZoomboxMode.Zoom,
+            _ => ZoomboxMode.Normal,
+        };
+    }
+}

+ 2 - 0
src/PixiEditor/ViewModels/SubViewModels/Main/ToolsViewModel.cs

@@ -13,6 +13,8 @@ namespace PixiEditor.ViewModels.SubViewModels.Main;
 [Command.Group("PixiEditor.Tools", "Tools")]
 internal class ToolsViewModel : SubViewModel<ViewModelMain>
 {
+    public ZoomToolViewModel ZoomTool => (ZoomToolViewModel)GetTool<ZoomToolViewModel>();
+
     public ToolViewModel LastActionTool { get; private set; }
 
     public bool ActiveToolIsTransient { get; set; }

+ 9 - 0
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/ZoomToolViewModel.cs

@@ -6,6 +6,13 @@ namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
 [Command.Tool(Key = Key.Z)]
 internal class ZoomToolViewModel : ToolViewModel
 {
+    private bool zoomOutOnClick = false;
+    public bool ZoomOutOnClick
+    {
+        get => zoomOutOnClick;
+        set => SetProperty(ref zoomOutOnClick, value);
+    }
+
     private string defaultActionDisplay = "Click and move to zoom. Click to zoom in, hold ctrl and click to zoom out.";
 
     public ZoomToolViewModel()
@@ -22,10 +29,12 @@ internal class ZoomToolViewModel : ToolViewModel
         if (ctrlIsDown)
         {
             ActionDisplay = "Click and move to zoom. Click to zoom out, release ctrl and click to zoom in.";
+            ZoomOutOnClick = true;
         }
         else
         {
             ActionDisplay = defaultActionDisplay;
+            ZoomOutOnClick = false;
         }
     }
 }

+ 2 - 0
src/PixiEditor/Views/MainWindow.xaml

@@ -508,6 +508,8 @@
                                             MouseUpCommand="{Binding ElementName=mainWindow, Path=DataContext.IoSubViewModel.MouseUpCommand}"
                                             Cursor="{Binding ElementName=mainWindow, Path=DataContext.ToolsSubViewModel.ToolCursor}"
                                             GridLinesVisible="{Binding ElementName=mainWindow, Path=DataContext.ViewportSubViewModel.GridLinesEnabled}"
+                                            ZoomMode="{Binding ElementName=mainWindow, Path=DataContext.ToolsSubViewModel.ActiveTool, Converter={converters:ActiveToolToZoomModeConverter}}"
+                                            ZoomOutOnClick="{Binding ElementName=mainWindow, Path=DataContext.ToolsSubViewModel.ZoomTool.ZoomOutOnClick}"
                                             Document="{Binding}"/>
                                         <!--<usercontrols:DrawingViewPort
                                         CenterViewportTrigger="{Binding CenterViewportTrigger}"

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

@@ -27,6 +27,7 @@
             RealDimensions="{Binding RealDimensions, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:Viewport}, Mode=OneWayToSource}"
             Dimensions="{Binding Dimensions, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:Viewport}, Mode=OneWayToSource}"
             ZoomMode="{Binding ZoomMode, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:Viewport}, Mode=TwoWay}"
+            ZoomOutOnClick="{Binding ZoomOutOnClick, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:Viewport}, Mode=TwoWay}"
             FlipX="{Binding FlipX, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:Viewport}}"
             FlipY="{Binding FlipY, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:Viewport}}">
             <Border

+ 9 - 0
src/PixiEditor/Views/UserControls/Viewport.xaml.cs

@@ -47,6 +47,15 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
     public static readonly DependencyProperty GridLinesVisibleProperty =
         DependencyProperty.Register(nameof(GridLinesVisible), typeof(bool), typeof(Viewport), new(false));
 
+    public static readonly DependencyProperty ZoomOutOnClickProperty =
+        DependencyProperty.Register(nameof(ZoomOutOnClick), typeof(bool), typeof(Viewport), new(false));
+
+    public bool ZoomOutOnClick
+    {
+        get => (bool)GetValue(ZoomOutOnClickProperty);
+        set => SetValue(ZoomOutOnClickProperty, value);
+    }
+
     public bool GridLinesVisible
     {
         get => (bool)GetValue(GridLinesVisibleProperty);