浏览代码

Leveraging the power of CanExecute feature.

BDisp 2 年之前
父节点
当前提交
754d7d6983
共有 2 个文件被更改,包括 56 次插入12 次删除
  1. 16 12
      Terminal.Gui/Views/Menu.cs
  2. 40 0
      UnitTests/Menus/MenuTests.cs

+ 16 - 12
Terminal.Gui/Views/Menu.cs

@@ -1664,12 +1664,14 @@ namespace Terminal.Gui {
 				int p = mi.Title.IndexOf (MenuBar.HotKeySpecifier);
 				if (p != -1 && p + 1 < mi.Title.RuneCount) {
 					if (Char.ToUpperInvariant ((char)mi.Title [p + 1]) == c) {
-						var action = mi.Action;
-						if (action != null) {
-							Application.MainLoop.AddIdle (() => {
-								action ();
-								return false;
-							});
+						if (mi.IsEnabled ()) {
+							var action = mi.Action;
+							if (action != null) {
+								Application.MainLoop.AddIdle (() => {
+									action ();
+									return false;
+								});
+							}
 						}
 						return true;
 					} else if (mi is MenuBarItem menuBarItem && menuBarItem?.Children.Length > 0) {
@@ -1701,12 +1703,14 @@ namespace Terminal.Gui {
 					continue;
 				}
 				if ((!(mi is MenuBarItem mbiTopLevel) || mbiTopLevel.IsTopLevel) && mi.Shortcut != Key.Null && mi.Shortcut == (Key)key) {
-					var action = mi.Action;
-					if (action != null) {
-						Application.MainLoop.AddIdle (() => {
-							action ();
-							return false;
-						});
+					if (mi.IsEnabled ()) {
+						var action = mi.Action;
+						if (action != null) {
+							Application.MainLoop.AddIdle (() => {
+								action ();
+								return false;
+							});
+						}
 					}
 					return true;
 				}

+ 40 - 0
UnitTests/Menus/MenuTests.cs

@@ -1747,5 +1747,45 @@ Edit
 			var exception = Record.Exception (() => menu.ProcessColdKey (new KeyEvent (Key.Space, new KeyModifiers ())));
 			Assert.Null (exception);
 		}
+
+		[Fact, AutoInitShutdown]
+		public void CanExecute_ProcessHotKey ()
+		{
+			Window win = null;
+			var menu = new MenuBar (new MenuBarItem [] {
+				new MenuBarItem ("File", new MenuItem [] {
+					new MenuItem ("_New", "", New, CanExecuteNew),
+					new MenuItem ("_Close", "", Close, CanExecuteClose)
+				}),
+			});
+			var top = Application.Top;
+			top.Add (menu);
+
+			bool CanExecuteNew () => win == null;
+
+			void New ()
+			{
+				win = new Window ();
+			}
+
+			bool CanExecuteClose () => win != null;
+
+			void Close ()
+			{
+				win = null;
+			}
+
+			Application.Begin (top);
+
+			Assert.Null (win);
+			Assert.True (CanExecuteNew ());
+			Assert.False (CanExecuteClose ());
+
+			Assert.True (top.ProcessHotKey (new KeyEvent (Key.N | Key.AltMask, new KeyModifiers () { Alt = true })));
+			Application.MainLoop.MainIteration ();
+			Assert.NotNull (win);
+			Assert.False (CanExecuteNew ());
+			Assert.True (CanExecuteClose ());
+		}
 	}
 }