From 22883acd2d881db7c2530fcd6e5cee123745d278 Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 13 Jul 2020 00:35:20 +0100 Subject: [PATCH 1/2] Fixes #759. Button mouse activates on double and triple click. --- Terminal.Gui/Views/Button.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 (); From c159d47b3bea291e84dc617b1b20c7bb3d52f7cc Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 13 Jul 2020 22:12:04 +0100 Subject: [PATCH 2/2] Fixes #783. Menu is now activated by Alt key if the focused view doesn't need it. --- Terminal.Gui/Core/Toplevel.cs | 36 ++++++++++++++ Terminal.Gui/Core/View.cs | 22 ++++----- Terminal.Gui/Views/Menu.cs | 88 ++++++++++++++++++++++++++--------- 3 files changed, 111 insertions(+), 35 deletions(-) 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/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 {