mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2026-01-01 16:59:35 +01:00
Improves the MenuOpening event.
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user