From 28ff51c08242f3956e1b0dbba8377598517fd3e2 Mon Sep 17 00:00:00 2001 From: Eric Tetz Date: Sun, 20 Feb 2022 14:59:29 -0700 Subject: [PATCH] Fix panning regression, where panning at limit accumulates invisible changes. --- .../Forms/RegionCaptureForm.cs | 66 ++++++------------- .../RegionHelpers/ImageEditorScrollbar.cs | 14 ++-- .../Shapes/ShapeManager.cs | 1 - 3 files changed, 23 insertions(+), 58 deletions(-) diff --git a/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs b/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs index bce450274..aaf7bbf73 100644 --- a/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs +++ b/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs @@ -64,7 +64,6 @@ public sealed class RegionCaptureForm : Form public Point CurrentPosition { get; private set; } public SimpleWindowInfo SelectedWindow { get; private set; } - internal PointF PanningStrech = new PointF(); internal Vector2 CanvasCenterOffset { get; set; } = new Vector2(0f, 0f); internal float ZoomFactor @@ -419,19 +418,8 @@ private void OnMoved() } } - private void Pan(float deltaX, float deltaY, bool usePanningStretch = true) + private bool Pan(float deltaX, float deltaY) { - if (deltaX == 0 && deltaY == 0) - { - return; - } - - if (usePanningStretch) - { - PanningStrech.X -= deltaX; - PanningStrech.Y -= deltaY; - } - SizeF panLimitSize = new SizeF(Math.Min(ClientArea.Width * 0.25f, CanvasRectangle.Width), Math.Min(ClientArea.Height * 0.25f, CanvasRectangle.Height)); @@ -448,15 +436,9 @@ private void Pan(float deltaX, float deltaY, bool usePanningStretch = true) deltaY = Math.Max(deltaY, limitRectangle.Top - CanvasRectangle.Bottom); deltaY = Math.Min(deltaY, limitRectangle.Bottom - CanvasRectangle.Top); - if (usePanningStretch) + if (deltaX == 0 && deltaY == 0) { - deltaX -= Math.Min(Math.Max(deltaX, 0), Math.Max(0, PanningStrech.X)); - deltaX -= Math.Max(Math.Min(deltaX, 0), Math.Min(0, PanningStrech.X)); - deltaY -= Math.Min(Math.Max(deltaY, 0), Math.Max(0, PanningStrech.Y)); - deltaY -= Math.Max(Math.Min(deltaY, 0), Math.Min(0, PanningStrech.Y)); - - PanningStrech.X += deltaX; - PanningStrech.Y += deltaY; + return false; } CanvasRectangle = CanvasRectangle.LocationOffset(deltaX, deltaY); @@ -470,14 +452,11 @@ private void Pan(float deltaX, float deltaY, bool usePanningStretch = true) { ShapeManager.MoveAll(deltaX, deltaY); } + + return true; } - private void Pan(Point delta) - { - Pan(delta.X, delta.Y); - } - - private void AutomaticPan(Vector2 centerOffset) + public void PanToOffset(Vector2 centerOffset) { if (IsEditorMode) { @@ -488,25 +467,16 @@ private void AutomaticPan(Vector2 centerOffset) float newY = y - (canvas.Height / 2); float deltaX = (newX - canvas.X) / ZoomFactor; float deltaY = (newY - canvas.Y) / ZoomFactor; - Pan(deltaX, deltaY, false); + if (Pan(deltaX, deltaY)) + { + CanvasCenterOffset = centerOffset; + } } } - public void AutomaticPan() - { - AutomaticPan(CanvasCenterOffset); - } - - private void UpdateCenterOffset() - { - CanvasCenterOffset = new Vector2(CanvasRectangle.X + (CanvasRectangle.Width / 2f) - (ClientArea.Width / 2f), - CanvasRectangle.Y + (CanvasRectangle.Height / 2f) - (ClientArea.Height / 2f)); - } - public void CenterCanvas() { - CanvasCenterOffset = new Vector2(0f, ToolbarHeight / 2f); - AutomaticPan(CanvasCenterOffset / ZoomFactor); + PanToOffset(new Vector2(0f, ToolbarHeight / 2f)); } public void ZoomTransform(Graphics g, bool invertZoom = false) @@ -576,7 +546,7 @@ private void RegionCaptureForm_Shown(object sender, EventArgs e) private void RegionCaptureForm_Resize(object sender, EventArgs e) { OnMoved(); - AutomaticPan(); + PanToOffset(CanvasCenterOffset); } private void RegionCaptureForm_LocationChanged(object sender, EventArgs e) @@ -752,9 +722,11 @@ private void Zoom(bool zoomIn, bool atMouse = true) } PointF scaledCenterAfter = atMouse ? ScaledClientMousePosition : clientCenter.Scale(1 / zoomFactor); - Pan(scaledCenterAfter.X - scaledCenterBefore.X, scaledCenterAfter.Y - scaledCenterBefore.Y); - CanvasCenterOffset = new Vector2((CanvasRectangle.X + CanvasRectangle.Width / 2f) * ZoomFactor - clientCenter.X, - (CanvasRectangle.Y + CanvasRectangle.Height / 2f) * ZoomFactor - clientCenter.Y); + if (Pan(scaledCenterAfter.X - scaledCenterBefore.X, scaledCenterAfter.Y - scaledCenterBefore.Y)) + { + CanvasCenterOffset = new Vector2((CanvasRectangle.X + CanvasRectangle.Width / 2f) * ZoomFactor - clientCenter.X, + (CanvasRectangle.Y + CanvasRectangle.Height / 2f) * ZoomFactor - clientCenter.Y); + } UpdateTitle(); } @@ -850,8 +822,8 @@ private void UpdateCoordinates() if (ShapeManager.IsPanning) { - CanvasCenterOffset = new Vector2(CanvasCenterOffset.X + InputManager.MouseVelocity.X, CanvasCenterOffset.Y + InputManager.MouseVelocity.Y); - AutomaticPan(); + Vector2 offset = new Vector2(CanvasCenterOffset.X + InputManager.MouseVelocity.X, CanvasCenterOffset.Y + InputManager.MouseVelocity.Y); + PanToOffset(offset); } if (Options.EnableAnimations) diff --git a/ShareX.ScreenCaptureLib/RegionHelpers/ImageEditorScrollbar.cs b/ShareX.ScreenCaptureLib/RegionHelpers/ImageEditorScrollbar.cs index 7e40a5c91..3ceccc98d 100644 --- a/ShareX.ScreenCaptureLib/RegionHelpers/ImageEditorScrollbar.cs +++ b/ShareX.ScreenCaptureLib/RegionHelpers/ImageEditorScrollbar.cs @@ -198,16 +198,10 @@ private void Scroll(Point position) float centerOffsetNew = ((trackLengthInternal / 2.0f) - mousePositionLocal) / trackLengthInternal * inImageSize; - if (Orientation == Orientation.Horizontal) - { - form.CanvasCenterOffset = new Vector2(centerOffsetNew, form.CanvasCenterOffset.Y); - } - else - { - form.CanvasCenterOffset = new Vector2(form.CanvasCenterOffset.X, centerOffsetNew); - } - - form.AutomaticPan(); + Vector2 canvasCenterOffset = Orientation == Orientation.Horizontal + ? new Vector2(centerOffsetNew, form.CanvasCenterOffset.Y) + : new Vector2(form.CanvasCenterOffset.X, centerOffsetNew); + form.PanToOffset(canvasCenterOffset); } } } \ No newline at end of file diff --git a/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs b/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs index 58ffd7a37..cfe9888d8 100644 --- a/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs +++ b/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs @@ -1029,7 +1029,6 @@ public void EndRegionSelection() private void StartPanning() { IsPanning = true; - Form.PanningStrech = new Point(0, 0); Options.ShowEditorPanTip = false; }