Improves the MenuOpening event.

This commit is contained in:
BDisp
2021-07-11 00:14:28 +01:00
parent 4cd694ac78
commit b2a8a7cb6d

View File

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