diff --git a/Terminal.Gui/Core/Toplevel.cs b/Terminal.Gui/Core/Toplevel.cs
index 3419c5b1a..4769feb31 100644
--- a/Terminal.Gui/Core/Toplevel.cs
+++ b/Terminal.Gui/Core/Toplevel.cs
@@ -121,6 +121,42 @@ namespace Terminal.Gui {
///
public StatusBar StatusBar { get; set; }
+ ///
+ public override bool OnKeyDown (KeyEvent keyEvent)
+ {
+ if (base.OnKeyDown (keyEvent)) {
+ return true;
+ }
+
+ switch (keyEvent.Key) {
+ case Key.AltMask:
+ if (MenuBar != null && MenuBar.OnKeyDown (keyEvent)) {
+ return true;
+ }
+ break;
+ }
+
+ return false;
+ }
+
+ ///
+ public override bool OnKeyUp (KeyEvent keyEvent)
+ {
+ if (base.OnKeyUp (keyEvent)) {
+ return true;
+ }
+
+ switch (keyEvent.Key) {
+ case Key.AltMask:
+ if (MenuBar != null && MenuBar.OnKeyUp (keyEvent)) {
+ return true;
+ }
+ break;
+ }
+
+ return false;
+ }
+
///
public override bool ProcessKey (KeyEvent keyEvent)
{
diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs
index d6a14e6b7..92284c012 100644
--- a/Terminal.Gui/Core/View.cs
+++ b/Terminal.Gui/Core/View.cs
@@ -1360,13 +1360,12 @@ namespace Terminal.Gui {
{
KeyEventEventArgs args = new KeyEventEventArgs (keyEvent);
KeyDown?.Invoke (args);
- if (args.Handled)
+ if (args.Handled) {
return true;
- if (subviews == null || subviews.Count == 0)
- return false;
- foreach (var view in subviews)
- if (view.HasFocus && view.OnKeyDown (keyEvent))
- return true;
+ }
+ if (Focused?.OnKeyDown (keyEvent) == true) {
+ return true;
+ }
return false;
}
@@ -1381,13 +1380,12 @@ namespace Terminal.Gui {
{
KeyEventEventArgs args = new KeyEventEventArgs (keyEvent);
KeyUp?.Invoke (args);
- if (args.Handled)
+ if (args.Handled) {
return true;
- if (subviews == null || subviews.Count == 0)
- return false;
- foreach (var view in subviews)
- if (view.HasFocus && view.OnKeyUp (keyEvent))
- return true;
+ }
+ if (Focused?.OnKeyUp (keyEvent) == true) {
+ return true;
+ }
return false;
}
diff --git a/Terminal.Gui/Views/Button.cs b/Terminal.Gui/Views/Button.cs
index 3aeb0554a..3430ed239 100644
--- a/Terminal.Gui/Views/Button.cs
+++ b/Terminal.Gui/Views/Button.cs
@@ -218,7 +218,8 @@ namespace Terminal.Gui {
return true;
- if (mouseEvent.Flags == MouseFlags.Button1Clicked) {
+ if (mouseEvent.Flags == MouseFlags.Button1Clicked || mouseEvent.Flags == MouseFlags.Button1DoubleClicked ||
+ mouseEvent.Flags == MouseFlags.Button1TripleClicked) {
if (!HasFocus && SuperView != null) {
SuperView.SetFocus (this);
SetNeedsDisplay ();
diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs
index a197d5ccc..549ab0e71 100644
--- a/Terminal.Gui/Views/Menu.cs
+++ b/Terminal.Gui/Views/Menu.cs
@@ -400,6 +400,11 @@ namespace Terminal.Gui {
});
}
+ public override bool OnLeave (View view)
+ {
+ return host.OnLeave (view);
+ }
+
public override bool OnKeyDown (KeyEvent keyEvent)
{
if (keyEvent.IsAlt) {
@@ -426,9 +431,12 @@ namespace Terminal.Gui {
{
bool disabled;
switch (kb.Key) {
+ case Key.Tab:
+ host.CleanUp ();
+ return true;
case Key.CursorUp:
if (barItems.IsTopLevel || current == -1)
- break;
+ return true;
do {
disabled = false;
current--;
@@ -436,6 +444,9 @@ namespace Terminal.Gui {
if (current == -1 && barItems.Children [current + 1].IsFromSubMenu && host.selectedSub > -1) {
current++;
host.PreviousMenu (true);
+ if (host.openMenu.current > 0) {
+ host.openMenu.current--;
+ }
break;
}
}
@@ -443,12 +454,17 @@ namespace Terminal.Gui {
current = barItems.Children.Length - 1;
var item = barItems.Children [current];
if (item == null || !item.IsEnabled ()) disabled = true;
+ if (host.UseKeysUpDownAsKeysLeftRight && barItems.Children [current]?.SubMenu != null &&
+ !disabled && host.IsMenuOpen) {
+ CheckSubMenu ();
+ break;
+ }
} while (barItems.Children [current] == null || disabled);
SetNeedsDisplay ();
- break;
+ return true;
case Key.CursorDown:
if (barItems.IsTopLevel) {
- break;
+ return true;
}
do {
@@ -467,17 +483,17 @@ namespace Terminal.Gui {
host.OpenMenu (host.selected);
} while (barItems.Children [current] == null || disabled);
SetNeedsDisplay ();
- break;
+ return true;
case Key.CursorLeft:
host.PreviousMenu (true);
- break;
+ return true;
case Key.CursorRight:
host.NextMenu (barItems.IsTopLevel || barItems.Children [current].IsFromSubMenu ? true : false);
- break;
+ return true;
case Key.Esc:
Application.UngrabMouse ();
host.CloseAllMenus ();
- break;
+ return true;
case Key.Enter:
if (barItems.IsTopLevel) {
Run (barItems.Action);
@@ -485,7 +501,7 @@ namespace Terminal.Gui {
CheckSubMenu ();
Run (barItems.Children [current].Action);
}
- break;
+ return true;
default:
// TODO: rune-ify
if (barItems.Children != null && Char.IsLetterOrDigit ((char)kb.KeyValue)) {
@@ -501,7 +517,7 @@ namespace Terminal.Gui {
}
break;
}
- return true;
+ return false;
}
public override bool MouseEvent (MouseEvent me)
@@ -629,6 +645,18 @@ namespace Terminal.Gui {
bool openedByAltKey;
+ bool isCleaning;
+
+ ///
+ public override bool OnLeave (View view)
+ {
+ if ((!(view is MenuBar) && !(view is Menu) || !(view is MenuBar) && !(view is Menu) && openMenu != null) && !isCleaning && !reopen) {
+ CleanUp ();
+ return true;
+ }
+ return false;
+ }
+
///
public override bool OnKeyDown (KeyEvent keyEvent)
{
@@ -664,16 +692,7 @@ namespace Terminal.Gui {
// we don't want to close the menu because it'll flash.
// How to deal with that?
- if (openMenu != null)
- CloseAllMenus ();
- openedByAltKey = false;
- IsMenuOpen = false;
- selected = -1;
- CanFocus = false;
- if (lastFocused != null)
- SuperView?.SetFocus (lastFocused);
- SetNeedsDisplay ();
- Application.UngrabMouse ();
+ CleanUp ();
}
return true;
@@ -681,6 +700,24 @@ namespace Terminal.Gui {
return false;
}
+ internal void CleanUp ()
+ {
+ isCleaning = true;
+ if (openMenu != null) {
+ CloseAllMenus ();
+ }
+ openedByAltKey = false;
+ IsMenuOpen = false;
+ selected = -1;
+ CanFocus = false;
+ if (lastFocused != null) {
+ lastFocused.SuperView?.SetFocus (lastFocused);
+ }
+ SetNeedsDisplay ();
+ Application.UngrabMouse ();
+ isCleaning = false;
+ }
+
///
public override void Redraw (Rect bounds)
{
@@ -865,9 +902,12 @@ namespace Terminal.Gui {
CloseMenu (false, false);
}
+ bool reopen;
+
internal void CloseMenu (bool reopen = false, bool isSubMenu = false)
{
isMenuClosing = true;
+ this.reopen = reopen;
OnMenuClosing ();
switch (isSubMenu) {
case false:
@@ -875,18 +915,19 @@ namespace Terminal.Gui {
SuperView.Remove (openMenu);
}
SetNeedsDisplay ();
- if (previousFocused != null && openMenu != null && previousFocused.ToString () != openCurrentMenu.ToString ())
+ if (previousFocused != null && previousFocused is Menu && openMenu != null && previousFocused.ToString () != openCurrentMenu.ToString ())
previousFocused?.SuperView?.SetFocus (previousFocused);
openMenu?.Dispose ();
openMenu = null;
- if (lastFocused is Menu) {
+ if (lastFocused is Menu || lastFocused is MenuBar) {
lastFocused = null;
}
LastFocused = lastFocused;
lastFocused = null;
if (LastFocused != null) {
- if (!reopen)
+ if (!reopen) {
selected = -1;
+ }
LastFocused.SuperView?.SetFocus (LastFocused);
} else {
SuperView.SetFocus (this);
@@ -904,6 +945,7 @@ namespace Terminal.Gui {
IsMenuOpen = true;
break;
}
+ this.reopen = false;
isMenuClosing = false;
}
@@ -1191,7 +1233,7 @@ namespace Terminal.Gui {
} else if (selected != i && selected > -1 && (me.Flags == MouseFlags.ReportMousePosition ||
me.Flags == MouseFlags.Button1Pressed && me.Flags == MouseFlags.ReportMousePosition)) {
if (IsMenuOpen) {
- CloseMenu ();
+ CloseMenu (true, false);
Activate (i);
}
} else {