From ab398b93cbf949f248b72a8d94672e0b13e1bf92 Mon Sep 17 00:00:00 2001 From: tznind Date: Sat, 21 Jan 2023 08:31:17 +0000 Subject: [PATCH] Make OnTabClicked fire for clicks in empty space and fix Notepad to only show context menu on right click. --- Terminal.Gui/Views/TabView.cs | 8 +++++--- UICatalog/Scenarios/Notepad.cs | 27 +++++++++++++++++++++------ UnitTests/Views/TabViewTests.cs | 11 +++++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/Terminal.Gui/Views/TabView.cs b/Terminal.Gui/Views/TabView.cs index 1bac1da3c..8d60a3b0d 100644 --- a/Terminal.Gui/Views/TabView.cs +++ b/Terminal.Gui/Views/TabView.cs @@ -679,7 +679,7 @@ namespace Terminal.Gui { me.Flags.HasFlag (MouseFlags.Button2Clicked) || me.Flags.HasFlag (MouseFlags.Button3Clicked); - if (hit != null && isClick) { + if (isClick) { host.OnTabClicked (new TabMouseEventArgs (hit, me)); // user canceled click @@ -777,9 +777,11 @@ namespace Terminal.Gui { public class TabMouseEventArgs : EventArgs { /// - /// Gets the that the mouse was over when the - /// occurred. + /// Gets the (if any) that the mouse + /// was over when the occurred. /// + /// This will be null if the click is after last tab + /// or before first. public Tab Tab { get; } /// diff --git a/UICatalog/Scenarios/Notepad.cs b/UICatalog/Scenarios/Notepad.cs index 5e2fde4d8..0bb238d78 100644 --- a/UICatalog/Scenarios/Notepad.cs +++ b/UICatalog/Scenarios/Notepad.cs @@ -67,12 +67,27 @@ namespace UICatalog.Scenarios { 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 ($"Close", "", () => Close(e.Tab)), - }) - ); + }); + } + + + var contextMenu = new ContextMenu (e.MouseEvent.X + 1, e.MouseEvent.Y + 1, items); contextMenu.Show (); e.MouseEvent.Handled = true; @@ -175,11 +190,11 @@ namespace UICatalog.Scenarios { }; } - public void Save() + public void Save () { Save (tabView.SelectedTab); } - public void Save (TabView.Tab tabToSave ) + public void Save (TabView.Tab tabToSave) { var tab = tabToSave as OpenedFile; diff --git a/UnitTests/Views/TabViewTests.cs b/UnitTests/Views/TabViewTests.cs index a177d251c..5177b638e 100644 --- a/UnitTests/Views/TabViewTests.cs +++ b/UnitTests/Views/TabViewTests.cs @@ -839,6 +839,17 @@ namespace Terminal.Gui.ViewTests { Assert.Equal(tab1, clicked); 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 ()