Browse Source

Merge branch 'master' into bounds_comments

Charlie Kindel 5 năm trước cách đây
mục cha
commit
d980d70d60

+ 5 - 4
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -695,8 +695,9 @@ namespace Terminal.Gui {
 						keyUpHandler (new KeyEvent (map, keyModifiers));
 					}
 				}
-				if (!inputEvent.KeyEvent.bKeyDown)
+				if (!inputEvent.KeyEvent.bKeyDown) {
 					keyModifiers = null;
+				}
 				break;
 
 			case WindowsConsole.EventType.Mouse:
@@ -879,7 +880,7 @@ namespace Terminal.Gui {
 			};
 		}
 
-		private async Task ProcessButtonDoubleClickedAsync ()
+		async Task ProcessButtonDoubleClickedAsync ()
 		{
 			await Task.Delay (200);
 			IsButtonDoubleClicked = false;
@@ -896,11 +897,11 @@ namespace Terminal.Gui {
 				};
 
 				var view = Application.wantContinuousButtonPressedView;
-				if (view == null)
+				if (view == null) {
 					break;
+				}
 				if (IsButtonPressed && (mouseFlag & MouseFlags.ReportMousePosition) == 0) {
 					mouseHandler (me);
-					//mainLoop.Driver.Wakeup ();
 				}
 			}
 		}

+ 2 - 1
Terminal.Gui/Core/Application.cs

@@ -366,8 +366,9 @@ namespace Terminal.Gui {
 					OfY = me.Y - newxy.Y,
 					View = view
 				};
-				if (OutsideFrame (new Point (nme.X, nme.Y), mouseGrabView.Frame))
+				if (OutsideFrame (new Point (nme.X, nme.Y), mouseGrabView.Frame)) {
 					lastMouseOwnerView?.OnMouseLeave (me);
+				}
 				if (mouseGrabView != null) {
 					mouseGrabView.OnMouseEvent (nme);
 					return;

+ 4 - 4
Terminal.Gui/Core/View.cs

@@ -1079,7 +1079,7 @@ namespace Terminal.Gui {
 			if (subviews == null || subviews.Count == 0)
 				return false;
 			foreach (var view in subviews)
-				if (view.ProcessHotKey (keyEvent))
+				if (view.SuperView.IsCurrentTop && view.ProcessHotKey (keyEvent))
 					return true;
 			return false;
 		}
@@ -1094,7 +1094,7 @@ namespace Terminal.Gui {
 			if (subviews == null || subviews.Count == 0)
 				return false;
 			foreach (var view in subviews)
-				if (view.ProcessColdKey (keyEvent))
+				if (view.SuperView.IsCurrentTop && view.ProcessColdKey (keyEvent))
 					return true;
 			return false;
 		}
@@ -1114,7 +1114,7 @@ namespace Terminal.Gui {
 			if (subviews == null || subviews.Count == 0)
 				return false;
 			foreach (var view in subviews)
-				if (view.OnKeyDown (keyEvent))
+				if (view.SuperView.IsCurrentTop && view.OnKeyDown (keyEvent))
 					return true;
 
 			return false;
@@ -1135,7 +1135,7 @@ namespace Terminal.Gui {
 			if (subviews == null || subviews.Count == 0)
 				return false;
 			foreach (var view in subviews)
-				if (view.OnKeyUp (keyEvent))
+				if (view.SuperView.IsCurrentTop && view.OnKeyUp (keyEvent))
 					return true;
 
 			return false;

+ 21 - 26
Terminal.Gui/Views/Menu.cs

@@ -788,6 +788,7 @@ namespace Terminal.Gui {
 		{
 			CloseMenu (false, false);
 		}
+
 		internal void CloseMenu (bool reopen = false, bool isSubMenu = false)
 		{
 			isMenuClosing = true;
@@ -809,12 +810,11 @@ namespace Terminal.Gui {
 					if (!reopen)
 						selected = -1;
 					LastFocused.SuperView?.SetFocus (LastFocused);
-					IsMenuOpen = false;
 				} else {
 					SuperView.SetFocus (this);
-					IsMenuOpen = false;
 					PositionCursor ();
 				}
+				IsMenuOpen = false;
 				break;
 
 			case true:
@@ -823,10 +823,10 @@ namespace Terminal.Gui {
 				RemoveAllOpensSubMenus ();
 				openCurrentMenu.previousSubFocused?.SuperView?.SetFocus (openCurrentMenu.previousSubFocused);
 				openSubMenu = null;
+				IsMenuOpen = true;
 				break;
 			}
 			isMenuClosing = false;
-			IsMenuOpen = false;
 		}
 
 		void RemoveSubMenu (int index)
@@ -1087,31 +1087,26 @@ namespace Terminal.Gui {
 			}
 			handled = false;
 
-			if (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1Clicked || me.Flags == MouseFlags.Button1DoubleClicked ||
+			if (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked || me.Flags == MouseFlags.Button1Clicked ||
 				(me.Flags == MouseFlags.ReportMousePosition && selected > -1) ||
 				(me.Flags.HasFlag (MouseFlags.Button1Pressed | 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.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) &&
-											IsMenuOpen) {
-							Application.UngrabMouse ();
+						if (me.Flags == MouseFlags.Button1Clicked) {
 							if (Menus [i].IsTopLevel) {
 								var menu = new Menu (this, i, 0, Menus [i]);
 								menu.Run (Menus [i].Action);
-							} else {
-								CloseMenu ();
 							}
-						} else if ((me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) &&
-							!IsMenuOpen) {
-							if (Menus [i].IsTopLevel) {
-								var menu = new Menu (this, i, 0, Menus [i]);
-								menu.Run (Menus [i].Action);
+						} else if (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) {
+							if (IsMenuOpen) {
+								CloseAllMenus ();
 							} else {
 								Activate (i);
 							}
-						} else if (selected != i && selected > -1 && me.Flags == MouseFlags.ReportMousePosition) {
+						} else if (selected != i && selected > -1 && (me.Flags == MouseFlags.ReportMousePosition ||
+							me.Flags == MouseFlags.Button1Pressed && me.Flags == MouseFlags.ReportMousePosition)) {
 							if (IsMenuOpen) {
 								CloseMenu ();
 								Activate (i);
@@ -1140,7 +1135,7 @@ namespace Terminal.Gui {
 						me.View.MouseEvent (me);
 					}
 				} else if (!(me.View is MenuBar || me.View is Menu) && (me.Flags.HasFlag (MouseFlags.Button1Clicked) ||
-					me.Flags == MouseFlags.Button1DoubleClicked || me.Flags == MouseFlags.Button1Pressed)) {
+					me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked)) {
 					Application.UngrabMouse ();
 					CloseAllMenus ();
 					handled = false;
@@ -1149,24 +1144,25 @@ namespace Terminal.Gui {
 					handled = false;
 					return false;
 				}
-			} else if (!IsMenuOpen && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked ||
-				me.Flags.HasFlag (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition))) {
+			} else if (!IsMenuOpen && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked || me.Flags.HasFlag (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition))) {
 				Application.GrabMouse (current);
-			} else {
+			} else if (IsMenuOpen && (me.View is MenuBar || me.View is Menu)) {
+				Application.GrabMouse (me.View);
+			}
+			else {
 				handled = false;
 				return false;
 			}
-			//if (me.View != this && (me.Flags != MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked))
+			//if (me.View != this && me.Flags != MouseFlags.Button1Pressed)
 			//	return true;
-			//else if (me.View != this && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked)) {
+			//else if (me.View != this && me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) {
 			//	Application.UngrabMouse ();
 			//	host.CloseAllMenus ();
 			//	return true;
 			//}
 
 
-			//if (!(me.View is MenuBar) && !(me.View is Menu) && (me.Flags != MouseFlags.Button1Pressed ||
-			// me.Flags != MouseFlags.Button1DoubleClicked))
+			//if (!(me.View is MenuBar) && !(me.View is Menu) && me.Flags != MouseFlags.Button1Pressed))
 			//	return false;
 
 			//if (Application.mouseGrabView != null) {
@@ -1175,12 +1171,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.Button1Pressed ||
-			//		me.Flags == MouseFlags.Button1DoubleClicked)) {
+			//	} else if (!(me.View is MenuBar || me.View is Menu) && me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) {
 			//		Application.UngrabMouse ();
 			//		CloseAllMenus ();
 			//	}
-			//} else if (!isMenuClosed && selected == -1 && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked)) {
+			//} else if (!isMenuClosed && selected == -1 && me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) {
 			//	Application.GrabMouse (this);
 			//	return true;
 			//}