From b2a8a7cb6d3ba4e167fee8352016a76f64eb15d5 Mon Sep 17 00:00:00 2001 From: BDisp Date: Sun, 11 Jul 2021 00:14:28 +0100 Subject: [PATCH] Improves the MenuOpening event. --- Terminal.Gui/Views/Menu.cs | 60 +++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 11 deletions(-) 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; + } + } }