Files
Terminal.Gui/UICatalog/Scenarios/TabViewExample.cs
2023-11-14 20:31:19 +00:00

202 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Terminal.Gui;
using static UICatalog.Scenario;
namespace UICatalog.Scenarios {
[ScenarioMetadata (Name: "Tab View", Description: "Demos TabView control with limited screen space in Absolute layout.")]
[ScenarioCategory ("Controls"), ScenarioCategory ("TabView")]
public class TabViewExample : Scenario {
TabView tabView;
MenuItem miShowTopLine;
MenuItem miShowBorder;
MenuItem miTabsOnBottom;
public override void Setup ()
{
Win.Title = this.GetName ();
Win.Y = 1; // menu
Win.Height = Dim.Fill (1); // status bar
Application.Top.LayoutSubviews ();
var menu = new MenuBar (new MenuBarItem [] {
new MenuBarItem ("_File", new MenuItem [] {
new MenuItem ("_Add Blank Tab", "", () => AddBlankTab()),
new MenuItem ("_Clear SelectedTab", "", () => tabView.SelectedTab=null),
new MenuItem ("_Quit", "", () => Quit()),
}),
new MenuBarItem ("_View", new MenuItem [] {
miShowTopLine = new MenuItem ("_Show Top Line", "", () => ShowTopLine()){
Checked = true,
CheckType = MenuItemCheckStyle.Checked
},
miShowBorder = new MenuItem ("_Show Border", "", () => ShowBorder()){
Checked = true,
CheckType = MenuItemCheckStyle.Checked
},
miTabsOnBottom = new MenuItem ("_Tabs On Bottom", "", () => SetTabsOnBottom()){
Checked = false,
CheckType = MenuItemCheckStyle.Checked
}
})
});
Application.Top.Add (menu);
tabView = new TabView () {
X = 0,
Y = 0,
Width = 60,
Height = 20,
BorderStyle = LineStyle.Single
};
tabView.AddTab (new Tab ("Tab1", new Label ("hodor!")), false);
tabView.AddTab (new Tab ("Tab2", new Label ("durdur")), false);
tabView.AddTab (new Tab ("Interactive Tab", GetInteractiveTab ()), false);
tabView.AddTab (new Tab ("Big Text", GetBigTextFileTab ()), false);
tabView.AddTab (new Tab (
"Long name Tab, I mean seriously long. Like you would not believe how long this tab's name is its just too much really woooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooowwww thats long",
new Label ("This tab has a very long name which should be truncated. See TabView.MaxTabTextWidth")),
false);
tabView.AddTab (new Tab ("Les Mise" + '\u0301' + "rables", new Label ("This tab name is unicode")), false);
tabView.AddTab (new Tab ("Les Mise" + '\u0328' + '\u0301' + "rables", new Label ("This tab name has two combining marks. Only one will show due to Issue #2616.")), false);
for (int i = 0; i < 100; i++) {
tabView.AddTab (new Tab ($"Tab{i}", new Label ($"Welcome to tab {i}")), false);
}
tabView.SelectedTab = tabView.Tabs.First ();
Win.Add (tabView);
var frameRight = new FrameView ("About") {
X = Pos.Right (tabView),
Y = 0,
Width = Dim.Fill (),
Height = Dim.Fill (),
};
frameRight.Add (new TextView () {
Text = "This demos the tabs control\nSwitch between tabs using cursor keys",
Width = Dim.Fill (),
Height = Dim.Fill ()
});
Win.Add (frameRight);
var frameBelow = new FrameView ("Bottom Frame") {
X = 0,
Y = Pos.Bottom (tabView),
Width = tabView.Width,
Height = Dim.Fill (),
};
frameBelow.Add (new TextView () {
Text = "This frame exists to check you can still tab here\nand that the tab control doesn't overspill it's bounds",
Width = Dim.Fill (),
Height = Dim.Fill ()
});
Win.Add (frameBelow);
var statusBar = new StatusBar (new StatusItem [] {
new StatusItem(Application.QuitKey, $"{Application.QuitKey} to Quit", () => Quit()),
});
Application.Top.Add (statusBar);
}
private void AddBlankTab ()
{
tabView.AddTab (new Tab (), false);
}
private View GetInteractiveTab ()
{
var interactiveTab = new View () {
Width = Dim.Fill (),
Height = Dim.Fill ()
};
var lblName = new Label ("Name:");
interactiveTab.Add (lblName);
var tbName = new TextField () {
X = Pos.Right (lblName),
Width = 10
};
interactiveTab.Add (tbName);
var lblAddr = new Label ("Address:") {
Y = 1
};
interactiveTab.Add (lblAddr);
var tbAddr = new TextField () {
X = Pos.Right (lblAddr),
Y = 1,
Width = 10
};
interactiveTab.Add (tbAddr);
return interactiveTab;
}
private View GetBigTextFileTab ()
{
var text = new TextView () {
Width = Dim.Fill (),
Height = Dim.Fill ()
};
var sb = new System.Text.StringBuilder ();
for (int y = 0; y < 300; y++) {
for (int x = 0; x < 500; x++) {
sb.Append ((x + y) % 2 == 0 ? '1' : '0');
}
sb.AppendLine ();
}
text.Text = sb.ToString ();
return text;
}
private void ShowTopLine ()
{
miShowTopLine.Checked = !miShowTopLine.Checked;
tabView.Style.ShowTopLine = (bool)miShowTopLine.Checked;
tabView.ApplyStyleChanges ();
}
private void ShowBorder ()
{
miShowBorder.Checked = !miShowBorder.Checked;
tabView.Style.ShowBorder = (bool)miShowBorder.Checked;
tabView.ApplyStyleChanges ();
}
private void SetTabsOnBottom ()
{
miTabsOnBottom.Checked = !miTabsOnBottom.Checked;
tabView.Style.TabsOnBottom = (bool)miTabsOnBottom.Checked;
tabView.ApplyStyleChanges ();
}
private void Quit ()
{
Application.RequestStop ();
}
}
}