Ver código fonte

Merge pull request #3320 from BDisp/v1_mouseclick-fix_3318

Fixes #3318. v1-MouseClick should be invoked only once on a mouse click.
Tig 1 ano atrás
pai
commit
26c06d708c
2 arquivos alterados com 24 adições e 3 exclusões
  1. 8 3
      Terminal.Gui/Core/View.cs
  2. 16 0
      UnitTests/Views/ViewTests.cs

+ 8 - 3
Terminal.Gui/Core/View.cs

@@ -2894,9 +2894,14 @@ namespace Terminal.Gui {
 				return false;
 			}
 
-			var args = new MouseEventArgs (mouseEvent);
-			if (OnMouseClick (args))
-				return true;
+			if ((mouseEvent.Flags & MouseFlags.Button1Clicked) != 0 || (mouseEvent.Flags & MouseFlags.Button2Clicked) != 0
+				|| (mouseEvent.Flags & MouseFlags.Button3Clicked) != 0 || (mouseEvent.Flags & MouseFlags.Button4Clicked) != 0) {
+
+				var args = new MouseEventArgs (mouseEvent);
+				if (OnMouseClick (args)) {
+					return true;
+				}
+			}
 			if (MouseEvent (mouseEvent))
 				return true;
 

+ 16 - 0
UnitTests/Views/ViewTests.cs

@@ -4581,5 +4581,21 @@ Test", output);
 011110
 000000", new Attribute [] { Colors.TopLevel.Normal, Colors.TopLevel.Focus });
 		}
+
+		[Theory]
+		[InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released, MouseFlags.Button1Clicked)]
+		[InlineData (MouseFlags.Button1Pressed | MouseFlags.ButtonCtrl, MouseFlags.Button1Released | MouseFlags.ButtonCtrl, MouseFlags.Button1Clicked | MouseFlags.ButtonCtrl)]
+		public void OnMouseClick_Is_Only_Raised_Once (MouseFlags pressed, MouseFlags released, MouseFlags clicked)
+		{
+			var mouseClicks = 0;
+			var view = new View ();
+			view.MouseClick += (_) => mouseClicks++;
+
+			view.OnMouseEvent (new MouseEvent () { Flags = pressed });
+			view.OnMouseEvent (new MouseEvent () { Flags = released });
+			view.OnMouseEvent (new MouseEvent () { Flags = clicked });
+
+			Assert.Equal (1, mouseClicks);
+		}
 	}
 }