From 553cd6f66f1417318edac6a51ea34027e227548c Mon Sep 17 00:00:00 2001 From: tznind Date: Fri, 20 Jan 2023 19:30:36 +0000 Subject: [PATCH] Adds TabView.TabClicked event --- Terminal.Gui/Views/TabView.cs | 63 +++++++++++++++++++++++++++++++++- UICatalog/Scenarios/Notepad.cs | 29 ++++++++++++++-- 2 files changed, 88 insertions(+), 4 deletions(-) diff --git a/Terminal.Gui/Views/TabView.cs b/Terminal.Gui/Views/TabView.cs index 1baf85993..1bac1da3c 100644 --- a/Terminal.Gui/Views/TabView.cs +++ b/Terminal.Gui/Views/TabView.cs @@ -53,6 +53,14 @@ namespace Terminal.Gui { /// public event EventHandler SelectedTabChanged; + + /// + /// Event fired when a is clicked. Can be used to cancel navigation, + /// show context menu (e.g. on right click) etc. + /// + public event EventHandler TabClicked; + + /// /// The currently selected member of chosen by the user /// @@ -665,6 +673,22 @@ namespace Terminal.Gui { public override bool MouseEvent (MouseEvent me) { + var hit = ScreenToTab (me.X, me.Y); + + bool isClick = me.Flags.HasFlag (MouseFlags.Button1Clicked) || + me.Flags.HasFlag (MouseFlags.Button2Clicked) || + me.Flags.HasFlag (MouseFlags.Button3Clicked); + + if (hit != null && isClick) { + host.OnTabClicked (new TabMouseEventArgs (hit, me)); + + // user canceled click + if (me.Handled) { + return true; + } + } + + if (!me.Flags.HasFlag (MouseFlags.Button1Clicked) && !me.Flags.HasFlag (MouseFlags.Button1DoubleClicked) && !me.Flags.HasFlag (MouseFlags.Button1TripleClicked)) @@ -689,7 +713,7 @@ namespace Terminal.Gui { return true; } - var hit = ScreenToTab (me.X, me.Y); + if (hit != null) { host.SelectedTab = hit; SetNeedsDisplay (); @@ -738,6 +762,43 @@ namespace Terminal.Gui { } } + /// + /// Raises the event. + /// + /// + protected virtual private void OnTabClicked (TabMouseEventArgs tabMouseEventArgs) + { + TabClicked?.Invoke (this, tabMouseEventArgs); + } + + /// + /// Describes a mouse event over a specific in a . + /// + public class TabMouseEventArgs : EventArgs { + + /// + /// Gets the that the mouse was over when the + /// occurred. + /// + public Tab Tab { get; } + + /// + /// Gets the actual mouse event. Use to cancel this event + /// and perform custom behavior (e.g. show a context menu). + /// + public MouseEvent MouseEvent { get; } + + /// + /// Creates a new instance of the class. + /// + /// that the mouse was over when the event occurred. + /// The mouse activity being reported + public TabMouseEventArgs (Tab tab, MouseEvent mouseEvent) + { + Tab = tab; + MouseEvent = mouseEvent; + } + } /// /// A single tab in a diff --git a/UICatalog/Scenarios/Notepad.cs b/UICatalog/Scenarios/Notepad.cs index a4fe1992e..5e2fde4d8 100644 --- a/UICatalog/Scenarios/Notepad.cs +++ b/UICatalog/Scenarios/Notepad.cs @@ -38,6 +38,8 @@ namespace UICatalog.Scenarios { Height = Dim.Fill (1), }; + tabView.TabClicked += TabView_TabClicked; + tabView.Style.ShowBorder = true; tabView.ApplyStyleChanges (); @@ -63,6 +65,19 @@ namespace UICatalog.Scenarios { New (); } + 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 [] { + new MenuItem ($"Save", "", () => Save(e.Tab)), + new MenuItem ($"Close", "", () => Close(e.Tab)), + }) + ); + + contextMenu.Show (); + e.MouseEvent.Handled = true; + } + private void New () { Open ("", null, $"new {numbeOfNewTabs++}"); @@ -70,7 +85,11 @@ namespace UICatalog.Scenarios { private void Close () { - var tab = tabView.SelectedTab as OpenedFile; + Close (tabView.SelectedTab); + } + private void Close (TabView.Tab tabToClose) + { + var tab = tabToClose as OpenedFile; if (tab == null) { return; @@ -156,9 +175,13 @@ namespace UICatalog.Scenarios { }; } - public void Save () + public void Save() { - var tab = tabView.SelectedTab as OpenedFile; + Save (tabView.SelectedTab); + } + public void Save (TabView.Tab tabToSave ) + { + var tab = tabToSave as OpenedFile; if (tab == null) { return;