2
0
Эх сурвалжийг харах

Mouse events menu (#401)

* Fixes an issue in the sln file that despite not having been changed, git reports as changed.

* Adding some settings for crlf and user specific.

* Prevent button clicked event if the point of the pressed and released don't match. Also decreases the delay for the triple click.

* Changes the menu button clicked event to button pressed to improve mouse clicks.

* Removed the action that was running all the time after the first running.
BDisp 5 жил өмнө
parent
commit
8a6c2a9fc1

+ 1 - 0
.editorconfig

@@ -6,6 +6,7 @@ csharp_new_line_before_open_brace = methods,local_functions
 csharp_new_line_before_else = false
 csharp_new_line_before_catch = false
 csharp_new_line_before_finally = false
+end_of_line = crlf
 
 csharp_indent_case_contents = true
 csharp_indent_switch_labels = false

+ 3 - 2
.gitignore

@@ -1,8 +1,9 @@
 bin
 obj
-*~
+~$*
 *.userprefs
 *~
 packages
 .vs
-*.csproj.user
+# User-specific files
+*.user

+ 27 - 13
Terminal.Gui/Drivers/WindowsDriver.cs

@@ -610,6 +610,7 @@ namespace Terminal.Gui {
 		WindowsConsole.ButtonState? LastMouseButtonPressed = null;
 		bool IsButtonReleased = false;
 		bool IsButtonDoubleClicked = false;
+		Point point;
 
 		MouseEvent ToDriverMouse (WindowsConsole.MouseEventRecord mouseEvent)
 		{
@@ -617,8 +618,8 @@ namespace Terminal.Gui {
 
 			if (IsButtonDoubleClicked) {
 				Task.Run (async () => {
-					await Task.Delay (300);
-					_ = new Action (() => IsButtonDoubleClicked = false);
+					await Task.Delay (100);
+					IsButtonDoubleClicked = false;
 				});
 			}
 
@@ -649,8 +650,15 @@ namespace Terminal.Gui {
 					break;
 				}
 
-				if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved)
+				if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) {
 					mouseFlag |= MouseFlags.ReportMousePosition;
+					point = new Point ();
+				} else {
+					point = new Point () {
+						X = mouseEvent.MousePosition.X,
+						Y = mouseEvent.MousePosition.Y
+					};
+				}
 				LastMouseButtonPressed = mouseEvent.ButtonState;
 			} else if (mouseEvent.EventFlags == 0 && LastMouseButtonPressed != null && !IsButtonReleased &&
 				!IsButtonDoubleClicked) {
@@ -670,18 +678,24 @@ namespace Terminal.Gui {
 				IsButtonReleased = true;
 			} else if ((mouseEvent.EventFlags == 0 || mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) &&
 				IsButtonReleased) {
-				switch (LastMouseButtonPressed) {
-				case WindowsConsole.ButtonState.Button1Pressed:
-					mouseFlag = MouseFlags.Button1Clicked;
-					break;
+				var p = new Point () {
+					X = mouseEvent.MousePosition.X,
+					Y = mouseEvent.MousePosition.Y
+				};
+				if (p == point) {
+					switch (LastMouseButtonPressed) {
+					case WindowsConsole.ButtonState.Button1Pressed:
+						mouseFlag = MouseFlags.Button1Clicked;
+						break;
 
-				case WindowsConsole.ButtonState.Button2Pressed:
-					mouseFlag = MouseFlags.Button2Clicked;
-					break;
+					case WindowsConsole.ButtonState.Button2Pressed:
+						mouseFlag = MouseFlags.Button2Clicked;
+						break;
 
-				case WindowsConsole.ButtonState.RightmostButtonPressed:
-					mouseFlag = MouseFlags.Button4Clicked;
-					break;
+					case WindowsConsole.ButtonState.RightmostButtonPressed:
+						mouseFlag = MouseFlags.Button4Clicked;
+						break;
+					}
 				}
 				LastMouseButtonPressed = null;
 				IsButtonReleased = false;

+ 13 - 13
Terminal.Gui/Views/Menu.cs

@@ -432,7 +432,7 @@ namespace Terminal.Gui {
 			}
 			host.handled = false;
 			bool disabled;
-			if (me.Flags == MouseFlags.Button1Clicked || me.Flags == MouseFlags.Button1Released) {
+			if (me.Flags == MouseFlags.Button1Pressed) {
 				disabled = false;
 				if (me.Y < 1)
 					return true;
@@ -525,7 +525,7 @@ namespace Terminal.Gui {
 			Width = Dim.Fill ();
 			Height = 1;
 			Menus = menus;
-			CanFocus = true;
+			//CanFocus = true;
 			selected = -1;
 			selectedSub = -1;
 			ColorScheme = Colors.Menu;
@@ -984,13 +984,13 @@ namespace Terminal.Gui {
 			}
 			handled = false;
 
-			if (me.Flags == MouseFlags.Button1Clicked ||
+			if (me.Flags == MouseFlags.Button1Pressed ||
 				(me.Flags == MouseFlags.ReportMousePosition && selected > -1)) {
 				int pos = 1;
 				int cx = me.X;
 				for (int i = 0; i < Menus.Length; i++) {
 					if (cx > pos && me.X < pos + 1 + Menus [i].TitleLength) {
-						if (selected == i && me.Flags == MouseFlags.Button1Clicked && !isMenuClosed) {
+						if (selected == i && me.Flags == MouseFlags.Button1Pressed && !isMenuClosed) {
 							Application.UngrabMouse ();
 							if (Menus [i].IsTopLevel) {
 								var menu = new Menu (this, i, 0, Menus [i]);
@@ -998,7 +998,7 @@ namespace Terminal.Gui {
 							} else {
 								CloseMenu ();
 							}
-						} else if (me.Flags == MouseFlags.Button1Clicked && isMenuClosed) {
+						} else if (me.Flags == MouseFlags.Button1Pressed && isMenuClosed) {
 							if (Menus [i].IsTopLevel) {
 								var menu = new Menu (this, i, 0, Menus [i]);
 								menu.Run (Menus [i].Action);
@@ -1033,7 +1033,7 @@ namespace Terminal.Gui {
 						Application.GrabMouse (me.View);
 						me.View.MouseEvent (me);
 					}
-				} else if (!(me.View is MenuBar || me.View is Menu) && me.Flags.HasFlag (MouseFlags.Button1Clicked)) {
+				} else if (!(me.View is MenuBar || me.View is Menu) && me.Flags.HasFlag (MouseFlags.Button1Pressed)) {
 					Application.UngrabMouse ();
 					CloseAllMenus ();
 					handled = false;
@@ -1042,22 +1042,22 @@ namespace Terminal.Gui {
 					handled = false;
 					return false;
 				}
-			} else if (isMenuClosed && me.Flags.HasFlag (MouseFlags.Button1Clicked)) {
+			} else if (isMenuClosed && me.Flags.HasFlag (MouseFlags.Button1Pressed)) {
 				Application.GrabMouse (current);
 			} else {
 				handled = false;
 				return false;
 			}
-			//if (me.View != this && me.Flags != MouseFlags.Button1Clicked)
+			//if (me.View != this && me.Flags != MouseFlags.Button1Pressed)
 			//	return true;
-			//else if (me.View != this && me.Flags == MouseFlags.Button1Clicked) {
+			//else if (me.View != this && me.Flags == MouseFlags.Button1Pressed) {
 			//	Application.UngrabMouse ();
 			//	host.CloseAllMenus ();
 			//	return true;
 			//}
 
 
-			//if (!(me.View is MenuBar) && !(me.View is Menu) && me.Flags != MouseFlags.Button1Clicked)
+			//if (!(me.View is MenuBar) && !(me.View is Menu) && me.Flags != MouseFlags.Button1Pressed)
 			//	return false;
 
 			//if (Application.mouseGrabView != null) {
@@ -1066,11 +1066,11 @@ namespace Terminal.Gui {
 			//		me.Y -= me.OfY;
 			//		me.View.MouseEvent (me);
 			//		return true;
-			//	} else if (!(me.View is MenuBar || me.View is Menu) && me.Flags == MouseFlags.Button1Clicked) {
+			//	} else if (!(me.View is MenuBar || me.View is Menu) && me.Flags == MouseFlags.Button1Pressed) {
 			//		Application.UngrabMouse ();
 			//		CloseAllMenus ();
 			//	}
-			//} else if (!isMenuClosed && selected == -1 && me.Flags == MouseFlags.Button1Clicked) {
+			//} else if (!isMenuClosed && selected == -1 && me.Flags == MouseFlags.Button1Pressed) {
 			//	Application.GrabMouse (this);
 			//	return true;
 			//}
@@ -1082,7 +1082,7 @@ namespace Terminal.Gui {
 			//	} else if (me.View != current && me.View is MenuBar && me.View is Menu) {
 			//		Application.UngrabMouse ();
 			//		Application.GrabMouse (me.View);
-			//	} else if (me.Flags == MouseFlags.Button1Clicked) {
+			//	} else if (me.Flags == MouseFlags.Button1Pressed) {
 			//		Application.UngrabMouse ();
 			//		CloseMenu ();
 			//	}