Browse Source

Improvements the mouse and keys of the MenuBar.

BDisp 5 years ago
parent
commit
f4fba42823
1 changed files with 34 additions and 37 deletions
  1. 34 37
      Terminal.Gui/Views/Menu.cs

+ 34 - 37
Terminal.Gui/Views/Menu.cs

@@ -573,25 +573,15 @@ namespace Terminal.Gui {
 
 		///<inheritdoc cref="OnKeyDown"/>
 		public override bool OnKeyDown (KeyEvent keyEvent)
-		{
-			if (keyEvent.IsAlt) {
-				openedByAltKey = true;
-				SetNeedsDisplay ();
-				openedByHotKey = false;
-			}
-			return false;
-		}
-
-		///<inheritdoc cref="OnKeyUp"/>
-		public override bool OnKeyUp (KeyEvent keyEvent)
 		{
 			if (keyEvent.IsAlt) {
 				// User pressed Alt - this may be a precursor to a menu accelerator (e.g. Alt-F)
-				if (!keyEvent.IsCtrl && openedByAltKey && !IsMenuOpen && openMenu == null && ((uint)keyEvent.Key & (uint)Key.CharMask) == 0) {
+				if (!keyEvent.IsCtrl && !openedByAltKey && !IsMenuOpen && openMenu == null && ((uint)keyEvent.Key & (uint)Key.CharMask) == 0) {
 					// There's no open menu, the first menu item should be highlight.
 					// The right way to do this is to SetFocus(MenuBar), but for some reason
 					// that faults.
 
+					openedByAltKey = true;
 					//Activate (0);
 					//StartMenu ();
 					IsMenuOpen = true;
@@ -601,7 +591,7 @@ namespace Terminal.Gui {
 					SuperView.SetFocus (this);
 					SetNeedsDisplay ();
 					Application.GrabMouse (this);
-				} else if (!openedByHotKey) {
+				} else if (IsMenuOpen && !openedByAltKey) {
 					// There's an open menu. If this Alt key-up is a pre-cursor to an accelerator
 					// we don't want to close the menu because it'll flash.
 					// How to deal with that?
@@ -623,6 +613,16 @@ namespace Terminal.Gui {
 			return false;
 		}
 
+		///<inheritdoc cref="OnKeyUp"/>
+		public override bool OnKeyUp (KeyEvent keyEvent)
+		{
+			if (keyEvent.IsAlt) {
+				openedByAltKey = false;
+				SetNeedsDisplay ();
+			}
+			return false;
+		}
+
 		///<inheritdoc cref="Redraw"/>
 		public override void Redraw (Rect region)
 		{
@@ -788,6 +788,7 @@ namespace Terminal.Gui {
 		{
 			CloseMenu (false, false);
 		}
+
 		internal void CloseMenu (bool reopen = false, bool isSubMenu = false)
 		{
 			isMenuClosing = true;
@@ -815,6 +816,7 @@ namespace Terminal.Gui {
 					IsMenuOpen = false;
 					PositionCursor ();
 				}
+				IsMenuOpen = false;
 				break;
 
 			case true:
@@ -823,10 +825,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 +1089,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 +1137,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 +1146,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 +1173,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;
 			//}