Browse Source

Fix CenterCanvas using old width/height values

Equbuxu 4 years ago
parent
commit
28e1618651

+ 1 - 1
PixiEditor/Models/DataHolders/Document/Document.cs

@@ -94,7 +94,7 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
-        public ExecutionTrigger<EventArgs> CenterViewportTrigger { get; } = new();
+        public ExecutionTrigger<Size> CenterViewportTrigger { get; } = new();
         public ExecutionTrigger<double> ZoomViewportTrigger { get; } = new();
 
         public UndoManager UndoManager { get; set; }

+ 1 - 1
PixiEditor/ViewModels/ViewModelMain.cs

@@ -333,7 +333,7 @@ namespace PixiEditor.ViewModels
         {
             BitmapManager.ActiveDocument.ActiveSelection = new Selection(Array.Empty<Coordinates>());
             BitmapManager.ActiveDocument.ChangesSaved = false;
-            BitmapManager.ActiveDocument.CenterViewportTrigger.Execute(this, EventArgs.Empty);
+            BitmapManager.ActiveDocument.CenterViewportTrigger.Execute(this, new Size(BitmapManager.ActiveDocument.Width, BitmapManager.ActiveDocument.Height));
         }
 
         private void MouseController_StoppedRecordingChanges(object sender, EventArgs e)

+ 8 - 8
PixiEditor/Views/UserControls/DrawingViewPort.xaml.cs

@@ -37,8 +37,8 @@ namespace PixiEditor.Views.UserControls
             DependencyProperty.Register(nameof(IsUsingMoveViewportTool), typeof(bool), typeof(DrawingViewPort), new PropertyMetadata(false, ToolChanged));
 
         public static readonly DependencyProperty CenterViewportTriggerProperty =
-            DependencyProperty.Register(nameof(CenterViewportTrigger), typeof(ExecutionTrigger<EventArgs>), typeof(DrawingViewPort),
-                new PropertyMetadata(default(ExecutionTrigger<EventArgs>), CenterViewportTriggerChanged));
+            DependencyProperty.Register(nameof(CenterViewportTrigger), typeof(ExecutionTrigger<Size>), typeof(DrawingViewPort),
+                new PropertyMetadata(default(ExecutionTrigger<Size>), CenterViewportTriggerChanged));
 
         public static readonly DependencyProperty ZoomViewportTriggerProperty =
             DependencyProperty.Register(nameof(ZoomViewportTrigger), typeof(ExecutionTrigger<double>), typeof(DrawingViewPort),
@@ -92,9 +92,9 @@ namespace PixiEditor.Views.UserControls
             set => SetValue(IsUsingMoveViewportToolProperty, value);
         }
 
-        public ExecutionTrigger<EventArgs> CenterViewportTrigger
+        public ExecutionTrigger<Size> CenterViewportTrigger
         {
-            get => (ExecutionTrigger<EventArgs>)GetValue(CenterViewportTriggerProperty);
+            get => (ExecutionTrigger<Size>)GetValue(CenterViewportTriggerProperty);
             set => SetValue(CenterViewportTriggerProperty, value);
         }
 
@@ -120,8 +120,8 @@ namespace PixiEditor.Views.UserControls
         {
             var viewport = (DrawingViewPort)sender;
             if (args.OldValue != null)
-                ((ExecutionTrigger<EventArgs>)args.OldValue).Triggered -= viewport.CenterZoomboxContent;
-            ((ExecutionTrigger<EventArgs>)args.NewValue).Triggered += viewport.CenterZoomboxContent;
+                ((ExecutionTrigger<Size>)args.OldValue).Triggered -= viewport.CenterZoomboxContent;
+            ((ExecutionTrigger<Size>)args.NewValue).Triggered += viewport.CenterZoomboxContent;
         }
 
         private static void ZoomViewportTriggerChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
@@ -140,9 +140,9 @@ namespace PixiEditor.Views.UserControls
             InitializeComponent();
         }
 
-        private void CenterZoomboxContent(object sender, EventArgs args)
+        private void CenterZoomboxContent(object sender, Size args)
         {
-            zoombox.CenterContent();
+            zoombox.CenterContent(args);
         }
         private void ZoomZoomboxContent(object sender, double args)
         {

+ 31 - 13
PixiEditor/Views/UserControls/Zoombox.xaml.cs

@@ -43,7 +43,7 @@ namespace PixiEditor.Views.UserControls
             {
                 var curMousePos = e.GetPosition(parent.mainCanvas);
                 parent.SpaceOriginPos += curMousePos - prevMousePos;
-                prevMousePos = e.GetPosition(parent.mainCanvas);
+                prevMousePos = curMousePos;
             }
 
             public void Terminate()
@@ -70,7 +70,7 @@ namespace PixiEditor.Views.UserControls
             {
                 screenZoomOrigin = e.GetPosition(parent.mainCanvas);
                 zoomOrigin = parent.ToZoomboxSpace(screenZoomOrigin);
-                initZoomPower = parent.ZoomPower;
+                initZoomPower = parent.ZoomPowerClamped;
                 initSpaceOriginPos = parent.SpaceOriginPos;
                 parent.mainCanvas.CaptureMouse();
             }
@@ -80,7 +80,7 @@ namespace PixiEditor.Views.UserControls
                 var curScreenPos = e.GetPosition(parent.mainCanvas);
                 double deltaX = screenZoomOrigin.X - curScreenPos.X;
                 double deltaPower = deltaX / 10.0;
-                parent.ZoomPower = initZoomPower - deltaPower;
+                parent.ZoomPowerClamped = initZoomPower - deltaPower;
 
                 parent.SpaceOriginPos = initSpaceOriginPos;
                 var shiftedOriginPos = parent.ToScreenSpace(zoomOrigin);
@@ -131,7 +131,7 @@ namespace PixiEditor.Views.UserControls
         }
 
         private double zoomPower;
-        private double ZoomPower
+        private double ZoomPowerClamped
         {
             get => zoomPower;
             set
@@ -146,6 +146,22 @@ namespace PixiEditor.Views.UserControls
                 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Zoom)));
             }
         }
+        private double ZoomPowerTopCapped
+        {
+            get => zoomPower;
+            set
+            {
+                if (value > maxZoom)
+                    value = maxZoom;
+                if (value == zoomPower)
+                    return;
+                zoomPower = value;
+                var mult = Zoom;
+                scaleTransform.ScaleX = mult;
+                scaleTransform.ScaleY = mult;
+                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Zoom)));
+            }
+        }
 
         private IDragOperation activeDragOperation = null;
         private MouseButtonEventArgs activeMouseDownEventArgs = null;
@@ -166,16 +182,18 @@ namespace PixiEditor.Views.UserControls
             InitializeComponent();
         }
 
-        public void CenterContent()
+        public void CenterContent() => CenterContent(new Size(mainGrid.ActualHeight, mainGrid.ActualHeight));
+
+        public void CenterContent(Size newSize)
         {
             const double marginFactor = 1.1;
             double scaleFactor = Math.Max(
-                mainGrid.ActualWidth * marginFactor / mainCanvas.ActualWidth,
-                mainGrid.ActualHeight * marginFactor / mainCanvas.ActualHeight);
-            ZoomPower = -Math.Log(scaleFactor, zoomFactor);
+                newSize.Width * marginFactor / mainCanvas.ActualWidth,
+                newSize.Height * marginFactor / mainCanvas.ActualHeight);
+            ZoomPowerTopCapped = -Math.Log(scaleFactor, zoomFactor);
             SpaceOriginPos = new Point(
-                mainCanvas.ActualWidth / 2 - mainGrid.ActualWidth * Zoom / 2,
-                mainCanvas.ActualHeight / 2 - mainGrid.ActualHeight * Zoom / 2);
+                mainCanvas.ActualWidth / 2 - newSize.Width * Zoom / 2,
+                mainCanvas.ActualHeight / 2 - newSize.Height * Zoom / 2);
         }
 
         public void ZoomIntoCenter(double delta)
@@ -187,9 +205,9 @@ namespace PixiEditor.Views.UserControls
         {
             var oldZoomboxMousePos = ToZoomboxSpace(mousePos);
 
-            ZoomPower += delta;
+            ZoomPowerClamped += delta;
 
-            if (Math.Abs(ZoomPower) < 1) ZoomPower = 0;
+            if (Math.Abs(ZoomPowerClamped) < 1) ZoomPowerClamped = 0;
 
             var shiftedMousePos = ToScreenSpace(oldZoomboxMousePos);
             var deltaMousePos = mousePos - shiftedMousePos;
@@ -252,7 +270,7 @@ namespace PixiEditor.Views.UserControls
                 return;
             if (activeDragOperation != null)
             {
-                activeDragOperation?.Terminate();
+                activeDragOperation.Terminate();
                 activeDragOperation = null;
             }
             else