mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-27 16:27:55 +01:00
Merge branch 'master' of tig:migueldeicaza/gui.cs
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user