Browse Source

Make OnTabClicked fire for clicks in empty space and fix Notepad to only show context menu on right click.

tznind 2 years ago
parent
commit
ab398b93cb
3 changed files with 37 additions and 9 deletions
  1. 5 3
      Terminal.Gui/Views/TabView.cs
  2. 21 6
      UICatalog/Scenarios/Notepad.cs
  3. 11 0
      UnitTests/Views/TabViewTests.cs

+ 5 - 3
Terminal.Gui/Views/TabView.cs

@@ -679,7 +679,7 @@ namespace Terminal.Gui {
 					me.Flags.HasFlag (MouseFlags.Button2Clicked) ||
 					me.Flags.HasFlag (MouseFlags.Button2Clicked) ||
 					me.Flags.HasFlag (MouseFlags.Button3Clicked);
 					me.Flags.HasFlag (MouseFlags.Button3Clicked);
 
 
-				if (hit != null && isClick) {
+				if (isClick) {
 					host.OnTabClicked (new TabMouseEventArgs (hit, me));
 					host.OnTabClicked (new TabMouseEventArgs (hit, me));
 
 
 					// user canceled click
 					// user canceled click
@@ -777,9 +777,11 @@ namespace Terminal.Gui {
 		public class TabMouseEventArgs : EventArgs {
 		public class TabMouseEventArgs : EventArgs {
 
 
 			/// <summary>
 			/// <summary>
-			/// Gets the <see cref="TabView.Tab"/> that the mouse was over when the <see cref="MouseEvent"/>
-			/// occurred.
+			/// Gets the <see cref="TabView.Tab"/> (if any) that the mouse
+			/// was over when the <see cref="MouseEvent"/> occurred.
 			/// </summary>
 			/// </summary>
+			/// <remarks>This will be null if the click is after last tab
+			/// or before first.</remarks>
 			public Tab Tab { get; }
 			public Tab Tab { get; }
 
 
 			/// <summary>
 			/// <summary>

+ 21 - 6
UICatalog/Scenarios/Notepad.cs

@@ -67,12 +67,27 @@ namespace UICatalog.Scenarios {
 
 
 		private void TabView_TabClicked (object sender, TabView.TabMouseEventArgs e)
 		private void TabView_TabClicked (object sender, TabView.TabMouseEventArgs e)
 		{
 		{
-			var contextMenu = new ContextMenu (e.MouseEvent.X + 1, e.MouseEvent.Y + 1,
-				new MenuBarItem (new MenuItem [] {
+			// we are only interested in right clicks
+			if(!e.MouseEvent.Flags.HasFlag(MouseFlags.Button3Clicked)) {
+				return;
+			}
+
+			MenuBarItem items;
+
+			if (e.Tab == null) {
+				items = new MenuBarItem (new MenuItem [] {
+					new MenuItem ($"Open", "", () => Open()),
+				});
+
+			} else {
+				items = new MenuBarItem (new MenuItem [] {
 					new MenuItem ($"Save", "", () => Save(e.Tab)),
 					new MenuItem ($"Save", "", () => Save(e.Tab)),
 					new MenuItem ($"Close", "", () => Close(e.Tab)),
 					new MenuItem ($"Close", "", () => Close(e.Tab)),
-				})
-			);
+				});
+			}
+
+
+			var contextMenu = new ContextMenu (e.MouseEvent.X + 1, e.MouseEvent.Y + 1, items);
 
 
 			contextMenu.Show ();
 			contextMenu.Show ();
 			e.MouseEvent.Handled = true;
 			e.MouseEvent.Handled = true;
@@ -175,11 +190,11 @@ namespace UICatalog.Scenarios {
 			};
 			};
 		}
 		}
 
 
-		public void Save()
+		public void Save ()
 		{
 		{
 			Save (tabView.SelectedTab);
 			Save (tabView.SelectedTab);
 		}
 		}
-		public void Save (TabView.Tab tabToSave )
+		public void Save (TabView.Tab tabToSave)
 		{
 		{
 			var tab = tabToSave as OpenedFile;
 			var tab = tabToSave as OpenedFile;
 
 

+ 11 - 0
UnitTests/Views/TabViewTests.cs

@@ -839,6 +839,17 @@ namespace Terminal.Gui.ViewTests {
 			Assert.Equal(tab1, clicked);
 			Assert.Equal(tab1, clicked);
 			Assert.Equal(tab2, tv.SelectedTab);
 			Assert.Equal(tab2, tv.SelectedTab);
 
 
+
+			tabRow.MouseEvent (new MouseEvent {
+				X = 10,
+				Y = 1,
+				Flags = MouseFlags.Button1Clicked
+			});
+
+			// Clicking beyond last tab should raise event with null Tab
+			Assert.Null (clicked);
+			Assert.Equal (tab2, tv.SelectedTab);
+
 		}
 		}
 
 
 		private void InitFakeDriver ()
 		private void InitFakeDriver ()