diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs
index a947d0836..3a4d5099e 100644
--- a/Terminal.Gui/Views/Menu.cs
+++ b/Terminal.Gui/Views/Menu.cs
@@ -166,7 +166,7 @@ namespace Terminal.Gui {
///
/// Gets if this is from a sub-menu.
///
- internal bool IsFromSubMenu { get {return Parent != null; } }
+ internal bool IsFromSubMenu { get { return Parent != null; } }
///
/// Merely a debugging aid to see the interaction with main
@@ -274,7 +274,7 @@ namespace Terminal.Gui {
///
/// Initializes a new .
///
- public MenuBarItem () : this (children: new MenuItem [] { }) { }
+ public MenuBarItem () : this (children: new MenuItem [] { }) { }
//static int GetMaxTitleLength (MenuItem [] children)
//{
@@ -447,7 +447,7 @@ namespace Terminal.Gui {
for (int p = 0; p < Frame.Width - 2; p++)
if (item == null)
Driver.AddRune (Driver.HLine);
- else if (p == Frame.Width - 3 && barItems.SubMenu(barItems.Children [i]) != null)
+ else if (p == Frame.Width - 3 && barItems.SubMenu (barItems.Children [i]) != null)
Driver.AddRune (Driver.RightArrow);
else
Driver.AddRune (' ');
@@ -916,7 +916,7 @@ namespace Terminal.Gui {
var menu = Menus [i];
Move (pos, 0);
Attribute hotColor, normalColor;
- if (i == selected) {
+ if (i == selected && IsMenuOpen) {
hotColor = i == selected ? ColorScheme.HotFocus : ColorScheme.HotNormal;
normalColor = i == selected ? ColorScheme.Focus : ColorScheme.Normal;
} else if (openedByAltKey) {
@@ -966,7 +966,7 @@ namespace Terminal.Gui {
///
/// Raised as a menu is opening.
///
- public event Action MenuOpening;
+ public event Action MenuOpening;
///
/// Raised when a menu is closing.
@@ -986,11 +986,15 @@ namespace Terminal.Gui {
public bool IsMenuOpen { get; protected set; }
///
- /// Virtual method that will invoke the
+ /// Virtual method that will invoke the event if it's defined.
///
- public virtual void OnMenuOpening ()
+ /// The current menu to be replaced.
+ /// /// Returns the
+ public virtual MenuOpeningEventArgs OnMenuOpening (MenuBarItem currentMenu)
{
- MenuOpening?.Invoke ();
+ var ev = new MenuOpeningEventArgs (currentMenu);
+ MenuOpening?.Invoke (ev);
+ return ev;
}
///
@@ -1011,11 +1015,17 @@ namespace Terminal.Gui {
internal void OpenMenu (int index, int sIndex = -1, MenuBarItem subMenu = null)
{
isMenuOpening = true;
- OnMenuOpening ();
+ var newMenu = OnMenuOpening (Menus [index]);
+ if (newMenu.Cancel) {
+ return;
+ }
+ if (newMenu.NewMenuBarItem != null && Menus [index].Title == newMenu.NewMenuBarItem.Title) {
+ Menus [index] = newMenu.NewMenuBarItem;
+ }
int pos = 0;
switch (subMenu) {
case null:
- lastFocused = lastFocused ?? SuperView.MostFocused;
+ lastFocused = lastFocused ?? SuperView?.MostFocused;
if (openSubMenu != null)
CloseMenu (false, true);
if (openMenu != null) {
@@ -1460,7 +1470,7 @@ namespace Terminal.Gui {
case Key.CursorDown:
case Key.Enter:
if (selected > -1) {
- ProcessMenu (selected, Menus [selected]);
+ ProcessMenu (selected, Menus [selected]);
}
break;
@@ -1638,4 +1648,32 @@ namespace Terminal.Gui {
return base.OnEnter (view);
}
}
+
+ ///
+ /// An which allows passing a cancelable menu opening event or replacing with a new .
+ ///
+ public class MenuOpeningEventArgs : EventArgs {
+ ///
+ /// The current parent.
+ ///
+ public MenuBarItem CurrentMenu { get; }
+
+ ///
+ /// The new to be replaced.
+ ///
+ public MenuBarItem NewMenuBarItem { get; set; }
+ ///
+ /// Flag that allows you to cancel the opening of the menu.
+ ///
+ public bool Cancel { get; set; }
+
+ ///
+ /// Initializes a new instance of
+ ///
+ /// The current parent.
+ public MenuOpeningEventArgs (MenuBarItem currentMenu)
+ {
+ CurrentMenu = currentMenu;
+ }
+ }
}