Adds TabView.TabClicked event

This commit is contained in:
tznind
2023-01-20 19:30:36 +00:00
parent 2e7c2c8377
commit 553cd6f66f
2 changed files with 88 additions and 4 deletions

View File

@@ -53,6 +53,14 @@ namespace Terminal.Gui {
/// </summary>
public event EventHandler<TabChangedEventArgs> SelectedTabChanged;
/// <summary>
/// Event fired when a <see cref="TabView.Tab"/> is clicked. Can be used to cancel navigation,
/// show context menu (e.g. on right click) etc.
/// </summary>
public event EventHandler<TabMouseEventArgs> TabClicked;
/// <summary>
/// The currently selected member of <see cref="Tabs"/> chosen by the user
/// </summary>
@@ -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 {
}
}
/// <summary>
/// Raises the <see cref="TabClicked"/> event.
/// </summary>
/// <param name="tabMouseEventArgs"></param>
protected virtual private void OnTabClicked (TabMouseEventArgs tabMouseEventArgs)
{
TabClicked?.Invoke (this, tabMouseEventArgs);
}
/// <summary>
/// Describes a mouse event over a specific <see cref="TabView.Tab"/> in a <see cref="TabView"/>.
/// </summary>
public class TabMouseEventArgs : EventArgs {
/// <summary>
/// Gets the <see cref="TabView.Tab"/> that the mouse was over when the <see cref="MouseEvent"/>
/// occurred.
/// </summary>
public Tab Tab { get; }
/// <summary>
/// Gets the actual mouse event. Use <see cref="MouseEvent.Handled"/> to cancel this event
/// and perform custom behavior (e.g. show a context menu).
/// </summary>
public MouseEvent MouseEvent { get; }
/// <summary>
/// Creates a new instance of the <see cref="TabMouseEventArgs"/> class.
/// </summary>
/// <param name="tab"><see cref="TabView.Tab"/> that the mouse was over when the event occurred.</param>
/// <param name="mouseEvent">The mouse activity being reported</param>
public TabMouseEventArgs (Tab tab, MouseEvent mouseEvent)
{
Tab = tab;
MouseEvent = mouseEvent;
}
}
/// <summary>
/// A single tab in a <see cref="TabView"/>

View File

@@ -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;