mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
* Fixes #1739. Setting menu UseKeysUpDownAsKeysLeftRight property as false by default. * Fixed some more bugs and added support for UseKeysUpDownAsKeysLeftRight on the demo file.
This commit is contained in:
@@ -624,6 +624,8 @@ static class Demo {
|
||||
|
||||
MenuItem miUseSubMenusSingleFrame = null;
|
||||
var useSubMenusSingleFrame = false;
|
||||
MenuItem miUseKeysUpDownAsKeysLeftRight = null;
|
||||
var useKeysUpDownAsKeysLeftRight = false;
|
||||
|
||||
MenuItem miHeightAsBuffer = null;
|
||||
|
||||
@@ -635,6 +637,9 @@ static class Demo {
|
||||
new MenuItem ("_Hex", "", () => { running = ShowHex; Application.RequestStop (); }, null, null, Key.AltMask | Key.CtrlMask | Key.H),
|
||||
new MenuItem ("_Close", "", Close, null, null, Key.AltMask | Key.Q),
|
||||
new MenuItem ("_Disabled", "", () => { }, () => false),
|
||||
new MenuBarItem ("_SubMenu Disabled", new MenuItem [] {
|
||||
new MenuItem ("_Disabled", "", () => { }, () => false)
|
||||
}),
|
||||
null,
|
||||
new MenuItem ("_Quit", "", () => { if (Quit ()) { running = null; top.Running = false; } }, null, null, Key.CtrlMask | Key.Q)
|
||||
}),
|
||||
@@ -645,6 +650,10 @@ static class Demo {
|
||||
new MenuBarItem ("_Find and Replace",
|
||||
new MenuItem [] { menuItems [0], menuItems [1] }),
|
||||
menuItems[3],
|
||||
miUseKeysUpDownAsKeysLeftRight = new MenuItem ("Use_KeysUpDownAsKeysLeftRight", "",
|
||||
() => menu.UseKeysUpDownAsKeysLeftRight = miUseKeysUpDownAsKeysLeftRight.Checked = useKeysUpDownAsKeysLeftRight = !useKeysUpDownAsKeysLeftRight) {
|
||||
CheckType = MenuItemCheckStyle.Checked, Checked = useKeysUpDownAsKeysLeftRight
|
||||
},
|
||||
miUseSubMenusSingleFrame = new MenuItem ("Use_SubMenusSingleFrame", "",
|
||||
() => menu.UseSubMenusSingleFrame = miUseSubMenusSingleFrame.Checked = useSubMenusSingleFrame = !useSubMenusSingleFrame) {
|
||||
CheckType = MenuItemCheckStyle.Checked, Checked = useSubMenusSingleFrame
|
||||
|
||||
@@ -421,7 +421,7 @@ namespace Terminal.Gui {
|
||||
AddCommand (Command.LineDown, () => MoveDown ());
|
||||
AddCommand (Command.Left, () => { this.host.PreviousMenu (true); return true; });
|
||||
AddCommand (Command.Right, () => {
|
||||
this.host.NextMenu (this.barItems.IsTopLevel || (this.barItems.Children != null
|
||||
this.host.NextMenu (!this.barItems.IsTopLevel || (this.barItems.Children != null
|
||||
&& current > -1 && current < this.barItems.Children.Length && this.barItems.Children [current].IsFromSubMenu),
|
||||
current > -1 && host.UseSubMenusSingleFrame && this.barItems.SubMenu (this.barItems.Children [current]) != null);
|
||||
return true;
|
||||
@@ -846,7 +846,7 @@ namespace Terminal.Gui {
|
||||
/// <summary>
|
||||
/// Used for change the navigation key style.
|
||||
/// </summary>
|
||||
public bool UseKeysUpDownAsKeysLeftRight { get; set; } = true;
|
||||
public bool UseKeysUpDownAsKeysLeftRight { get; set; } = false;
|
||||
|
||||
static ustring shortcutDelimiter = "+";
|
||||
/// <summary>
|
||||
@@ -1122,8 +1122,12 @@ namespace Terminal.Gui {
|
||||
public virtual void OnMenuOpened ()
|
||||
{
|
||||
MenuItem mi = null;
|
||||
if (openCurrentMenu.barItems.Children != null) {
|
||||
if (openCurrentMenu.barItems.Children != null && openCurrentMenu?.current > -1) {
|
||||
mi = openCurrentMenu.barItems.Children [openCurrentMenu.current];
|
||||
} else if (openCurrentMenu.barItems.IsTopLevel) {
|
||||
mi = openCurrentMenu.barItems;
|
||||
} else {
|
||||
mi = openMenu.barItems.Children [openMenu.current];
|
||||
}
|
||||
MenuOpened?.Invoke (mi);
|
||||
}
|
||||
@@ -1395,7 +1399,9 @@ namespace Terminal.Gui {
|
||||
|
||||
void RemoveSubMenu (int index, bool ignoreUseSubMenusSingleFrame = false)
|
||||
{
|
||||
if (openSubMenu == null || (UseSubMenusSingleFrame && !ignoreUseSubMenusSingleFrame && openSubMenu.Count > 0))
|
||||
if (openSubMenu == null || (UseSubMenusSingleFrame
|
||||
&& !ignoreUseSubMenusSingleFrame && openSubMenu.Count == 0))
|
||||
|
||||
return;
|
||||
for (int i = openSubMenu.Count - 1; i > index; i--) {
|
||||
isMenuClosing = true;
|
||||
@@ -1542,18 +1548,27 @@ namespace Terminal.Gui {
|
||||
NextMenu (false, ignoreUseSubMenusSingleFrame);
|
||||
}
|
||||
} else {
|
||||
var subMenu = openCurrentMenu.barItems.SubMenu (openCurrentMenu.barItems.Children [openCurrentMenu.current]);
|
||||
var subMenu = openCurrentMenu.current > -1
|
||||
? openCurrentMenu.barItems.SubMenu (openCurrentMenu.barItems.Children [openCurrentMenu.current])
|
||||
: null;
|
||||
if ((selectedSub == -1 || openSubMenu == null || openSubMenu?.Count == selectedSub) && subMenu == null) {
|
||||
if (openSubMenu != null && !CloseMenu (false, true))
|
||||
return;
|
||||
NextMenu (false, ignoreUseSubMenusSingleFrame);
|
||||
} else if (subMenu != null ||
|
||||
!openCurrentMenu.barItems.Children [openCurrentMenu.current].IsFromSubMenu)
|
||||
} else if (subMenu != null || (openCurrentMenu.current > -1
|
||||
&& !openCurrentMenu.barItems.Children [openCurrentMenu.current].IsFromSubMenu)) {
|
||||
selectedSub++;
|
||||
else
|
||||
openCurrentMenu.CheckSubMenu ();
|
||||
} else {
|
||||
if (CloseMenu (false, true, ignoreUseSubMenusSingleFrame)) {
|
||||
NextMenu (false, ignoreUseSubMenusSingleFrame);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
SetNeedsDisplay ();
|
||||
openCurrentMenu.CheckSubMenu ();
|
||||
if (UseKeysUpDownAsKeysLeftRight)
|
||||
openCurrentMenu.CheckSubMenu ();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -177,6 +177,88 @@ Edit
|
||||
void Copy () => miAction = "Copy";
|
||||
}
|
||||
|
||||
[Fact, AutoInitShutdown]
|
||||
public void MenuOpened_On_Disabled_MenuItem ()
|
||||
{
|
||||
MenuItem miCurrent = null;
|
||||
Menu mCurrent = null;
|
||||
|
||||
var menu = new MenuBar (new MenuBarItem [] {
|
||||
new MenuBarItem ("_File", new MenuItem [] {
|
||||
new MenuBarItem ("_New", new MenuItem [] {
|
||||
new MenuItem ("_New doc", "Creates new doc.", null, () => false)
|
||||
}),
|
||||
new MenuItem ("_Save", "Saves the file.", null, null)
|
||||
})
|
||||
});
|
||||
menu.MenuOpened += (e) => {
|
||||
miCurrent = e;
|
||||
mCurrent = menu.openMenu;
|
||||
};
|
||||
menu.UseKeysUpDownAsKeysLeftRight = true;
|
||||
Application.Top.Add (menu);
|
||||
|
||||
// open the menu
|
||||
Assert.True (menu.MouseEvent (new MouseEvent () {
|
||||
X = 1,
|
||||
Y = 0,
|
||||
Flags = MouseFlags.Button1Pressed,
|
||||
View = menu
|
||||
}));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_File", miCurrent.Parent.Title);
|
||||
Assert.Equal ("_New", miCurrent.Title);
|
||||
|
||||
Assert.True (mCurrent.MouseEvent (new MouseEvent () {
|
||||
X = 1,
|
||||
Y = 1,
|
||||
Flags = MouseFlags.ReportMousePosition,
|
||||
View = mCurrent
|
||||
}));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_File", miCurrent.Parent.Title);
|
||||
Assert.Equal ("_New", miCurrent.Title);
|
||||
|
||||
Assert.True (mCurrent.MouseEvent (new MouseEvent () {
|
||||
X = 1,
|
||||
Y = 2,
|
||||
Flags = MouseFlags.ReportMousePosition,
|
||||
View = mCurrent
|
||||
}));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_File", miCurrent.Parent.Title);
|
||||
Assert.Equal ("_Save", miCurrent.Title);
|
||||
|
||||
// close the menu
|
||||
Assert.True (menu.MouseEvent (new MouseEvent () {
|
||||
X = 1,
|
||||
Y = 0,
|
||||
Flags = MouseFlags.Button1Pressed,
|
||||
View = menu
|
||||
}));
|
||||
Assert.False (menu.IsMenuOpen);
|
||||
|
||||
// open the menu
|
||||
Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_New", miCurrent.Parent.Title);
|
||||
Assert.Equal ("_New doc", miCurrent.Title);
|
||||
|
||||
Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_File", miCurrent.Parent.Title);
|
||||
Assert.Equal ("_Save", miCurrent.Title);
|
||||
|
||||
Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_File", miCurrent.Parent.Title);
|
||||
Assert.Equal ("_New", miCurrent.Title);
|
||||
|
||||
// close the menu
|
||||
Assert.True (menu.ProcessHotKey (new KeyEvent (Key.F9, new KeyModifiers ())));
|
||||
Assert.False (menu.IsMenuOpen);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[AutoInitShutdown]
|
||||
public void MouseEvent_Test ()
|
||||
@@ -293,6 +375,7 @@ Edit
|
||||
miCurrent = null;
|
||||
mCurrent = null;
|
||||
};
|
||||
menu.UseKeysUpDownAsKeysLeftRight = true;
|
||||
Application.Top.Add (menu);
|
||||
Application.Begin (Application.Top);
|
||||
|
||||
@@ -304,7 +387,7 @@ Edit
|
||||
Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
|
||||
Assert.Equal ("None", GetCurrentMenuTitle ());
|
||||
Assert.Equal ("_About", GetCurrentMenuTitle ());
|
||||
|
||||
Assert.True (menu.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
@@ -363,7 +446,7 @@ Edit
|
||||
Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
|
||||
Assert.Equal ("None", GetCurrentMenuTitle ());
|
||||
Assert.Equal ("_About", GetCurrentMenuTitle ());
|
||||
|
||||
Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
@@ -393,7 +476,7 @@ Edit
|
||||
Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
|
||||
Assert.True (menu.IsMenuOpen);
|
||||
Assert.Equal ("_About", GetCurrentMenuBarItemTitle ());
|
||||
Assert.Equal ("None", GetCurrentMenuTitle ());
|
||||
Assert.Equal ("_About", GetCurrentMenuTitle ());
|
||||
Assert.True (mCurrent.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
|
||||
Assert.False (menu.IsMenuOpen);
|
||||
Assert.Equal ("Closed", GetCurrentMenuBarItemTitle ());
|
||||
@@ -603,7 +686,7 @@ Edit
|
||||
new MenuItem ("Three", "", null),
|
||||
})
|
||||
});
|
||||
|
||||
menu.UseKeysUpDownAsKeysLeftRight = true;
|
||||
Application.Top.Add (menu);
|
||||
|
||||
Assert.Equal (Point.Empty, new Point (menu.Frame.X, menu.Frame.Y));
|
||||
|
||||
Reference in New Issue
Block a user