From 5271a82b3f82018f9f198471fb6b8cc6ec7d8ce3 Mon Sep 17 00:00:00 2001 From: Jaex Date: Mon, 23 May 2016 01:42:52 +0300 Subject: [PATCH] EndRegionSelection improvements to fix hover issues --- .../Forms/RectangleRegionForm.cs | 2 +- .../Shapes/ShapeManager.cs | 114 ++++++++---------- 2 files changed, 48 insertions(+), 68 deletions(-) diff --git a/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs b/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs index 8aa8653a8..211d6d5b0 100644 --- a/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs +++ b/ShareX.ScreenCaptureLib/Forms/RectangleRegionForm.cs @@ -581,7 +581,7 @@ private void DrawCrosshair(Graphics g) private void DrawMagnifier(Graphics g) { Point mousePos = InputManager.MousePosition0Based; - Rectangle currentScreenRect0Based = CaptureHelpers.ScreenToClient(Screen.FromPoint(InputManager.MousePosition).Bounds); + Rectangle currentScreenRect0Based = CaptureHelpers.GetActiveScreenBounds0Based(); int offsetX = 10, offsetY = 10, infoTextOffset = 0, infoTextPadding = 3; Rectangle infoTextRect = Rectangle.Empty; string infoText = string.Empty; diff --git a/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs b/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs index d25ea4d99..6a0e3dab1 100644 --- a/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs +++ b/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs @@ -115,7 +115,7 @@ public BaseShape[] ValidRegions { get { - return Regions.Where(x => IsAreaValid(x.Rectangle)).ToArray(); + return Regions.Where(x => IsShapeAreaValid(x.Rectangle)).ToArray(); } } @@ -123,7 +123,7 @@ public bool IsCurrentRegionValid { get { - return IsAreaValid(CurrentRectangle); + return IsShapeAreaValid(CurrentRectangle); } } @@ -236,7 +236,7 @@ private void CreateContextMenu() tsmiDeleteSelected = new ToolStripMenuItem("Delete selected object"); tsmiDeleteSelected.Image = Resources.layer__minus; - tsmiDeleteSelected.Click += (sender, e) => DeleteSelectedShape(); + tsmiDeleteSelected.Click += (sender, e) => DeleteCurrentShape(); cmsContextMenu.Items.Add(tsmiDeleteSelected); tsmiDeleteAll = new ToolStripMenuItem("Delete all objects"); @@ -730,7 +730,7 @@ private void form_MouseUp(object sender, MouseEventArgs e) { if (IsCreating) { - DeleteSelectedShape(); + DeleteCurrentShape(); EndRegionSelection(); } else if (form.Mode == RectangleRegionMode.Annotation && cmsContextMenu != null) @@ -738,7 +738,7 @@ private void form_MouseUp(object sender, MouseEventArgs e) cmsContextMenu.Show(form, e.Location.Add(-10, -10)); Config.ShowMenuTip = false; } - else if (IsAreaIntersect()) + else if (IsShapeIntersect()) { DeleteIntersectShape(); } @@ -812,7 +812,7 @@ private void form_KeyDown(object sender, KeyEventArgs e) DeselectShape(); } - if (CurrentShape == null || CurrentShape != AreaIntersect()) + if (CurrentShape == null || CurrentShape != GetShapeIntersect()) { RegionSelection(InputManager.MousePosition0Based); } @@ -868,7 +868,7 @@ private void form_KeyUp(object sender, KeyEventArgs e) IsSnapResizing = false; break; case Keys.Delete: - DeleteSelectedShape(); + DeleteCurrentShape(); if (IsCreating) { @@ -920,17 +920,17 @@ private void RegionSelection(Point location) return; } - BaseShape shape = AreaIntersect(location); - PositionOnClick = location; - if (shape != null && shape.ShapeType == CurrentShapeType) // Select area + BaseShape shape = GetShapeIntersect(location); + + if (shape != null && shape.ShapeType == CurrentShapeType) // Select shape { IsMoving = true; CurrentShape = shape; SelectShape(); } - else if (!IsCreating) // Create new area + else if (!IsCreating) // Create new shape { DeselectShape(); @@ -967,44 +967,36 @@ private void EndRegionSelection() { if (!IsCurrentRegionValid) { - DeleteSelectedShape(); + shape.Rectangle = Rectangle.Empty; + CheckHover(); - } - else if (Config.QuickCrop && IsCurrentShapeTypeRegion) - { - form.UpdateRegionPath(); - form.Close(RegionResult.Region); - } - else - { - if (wasCreating) + + if (IsCurrentHoverAreaValid) { - shape.OnShapeCreated(); + shape.Rectangle = CurrentHoverRectangle; } - - SelectShape(); - - return; - } - } - - if (!CurrentHoverRectangle.IsEmpty) - { - AddShape(CurrentHoverRectangle); - - if (Config.QuickCrop && IsCurrentShapeTypeRegion) - { - form.UpdateRegionPath(); - form.Close(RegionResult.Region); - } - else - { - if (wasCreating) + else { - shape.OnShapeCreated(); + DeleteCurrentShape(); } + } - SelectShape(); + if (shape != null) + { + if (Config.QuickCrop && IsCurrentShapeTypeRegion) + { + form.UpdateRegionPath(); + form.Close(RegionResult.Region); + } + else + { + if (wasCreating) + { + shape.OnShapeCreated(); + } + + SelectShape(); + } } } } @@ -1127,11 +1119,11 @@ private void CheckHover() if (!ResizeManager.IsCursorOnNode() && !IsCreating && !IsMoving && !IsResizing) { - Rectangle hoverArea = GetAreaIntersectWithMouse(); + BaseShape shape = GetShapeIntersect(); - if (!hoverArea.IsEmpty) + if (shape != null && !shape.Rectangle.IsEmpty) { - CurrentHoverRectangle = hoverArea; + CurrentHoverRectangle = shape.Rectangle; } else { @@ -1139,7 +1131,7 @@ private void CheckHover() if (window != null && !window.Rectangle.IsEmpty) { - hoverArea = CaptureHelpers.ScreenToClient(window.Rectangle); + Rectangle hoverArea = CaptureHelpers.ScreenToClient(window.Rectangle); CurrentHoverRectangle = Rectangle.Intersect(form.ScreenRectangle0Based, hoverArea); } } @@ -1216,7 +1208,7 @@ private void DeselectShape() ResizeManager.Hide(); } - private void DeleteSelectedShape() + private void DeleteCurrentShape() { BaseShape shape = CurrentShape; @@ -1229,7 +1221,7 @@ private void DeleteSelectedShape() private void DeleteIntersectShape() { - BaseShape shape = AreaIntersect(); + BaseShape shape = GetShapeIntersect(); if (shape != null) { @@ -1244,12 +1236,12 @@ private void ClearAll() DeselectShape(); } - private bool IsAreaValid(Rectangle rect) + private bool IsShapeAreaValid(Rectangle rect) { return !rect.IsEmpty && rect.Width >= MinimumSize && rect.Height >= MinimumSize; } - public BaseShape AreaIntersect(Point mousePosition) + public BaseShape GetShapeIntersect(Point mousePosition) { for (int i = Shapes.Count - 1; i >= 0; i--) { @@ -1264,26 +1256,14 @@ public BaseShape AreaIntersect(Point mousePosition) return null; } - public BaseShape AreaIntersect() + public BaseShape GetShapeIntersect() { - return AreaIntersect(InputManager.MousePosition0Based); + return GetShapeIntersect(InputManager.MousePosition0Based); } - public Rectangle GetAreaIntersectWithMouse() + public bool IsShapeIntersect() { - BaseShape shape = AreaIntersect(); - - if (shape != null) - { - return shape.Rectangle; - } - - return Rectangle.Empty; - } - - public bool IsAreaIntersect() - { - return AreaIntersect() != null; + return GetShapeIntersect() != null; } public Rectangle CombineAreas()