Merge branch 'master' of tig:migueldeicaza/gui.cs

This commit is contained in:
Charlie Kindel
2020-07-13 17:58:07 -07:00
4 changed files with 113 additions and 36 deletions

View File

@@ -121,6 +121,42 @@ namespace Terminal.Gui {
/// </summary>
public StatusBar StatusBar { get; set; }
///<inheritdoc/>
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;
}
///<inheritdoc/>
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;
}
///<inheritdoc/>
public override bool ProcessKey (KeyEvent keyEvent)
{

View File

@@ -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;
}

View File

@@ -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 ();

View File

@@ -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;
///<inheritdoc/>
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;
}
///<inheritdoc/>
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;
}
///<inheritdoc/>
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 {