Files
Terminal.Gui/StandaloneExample/Program.cs
BDisp b185722ab6 Standalone update fix (#1596)
* Updating nuget package and fixing nonworking code.

* Adding some more improvements and launch for UseSystemConsole.

* Fixes layout issue.

* Also added a launch for UseSystemConsole for the Example project.

* Fixing unit tests.

* Trying fixing timeouts duplicate keys.
2022-02-18 07:23:46 -08:00

265 lines
7.4 KiB
C#

namespace StandaloneExample {
using System.Linq;
using Terminal.Gui;
using System;
using NStack;
using System.Text;
using Rune = System.Rune;
static class Demo {
class Box10x : View {
public Box10x (int x, int y) : base (new Rect (x, y, 10, 10))
{
}
public override void Redraw (Rect region)
{
Driver.SetAttribute (ColorScheme.Focus);
for (int y = 0; y < 10; y++) {
Move (0, y);
for (int x = 0; x < 10; x++) {
Driver.AddRune ((Rune)('0' + ((x + y) % 10)));
}
}
}
}
class Filler : View {
public Filler (Rect rect) : base (rect)
{
}
public override void Redraw (Rect region)
{
Driver.SetAttribute (ColorScheme.Focus);
var f = Frame;
for (int y = 0; y < f.Width; y++) {
Move (0, y);
for (int x = 0; x < f.Height; x++) {
var r = (x % 3) switch {
0 => '.',
1 => 'o',
_ => 'O',
};
Driver.AddRune (r);
}
}
}
}
static void ShowTextAlignments ()
{
var container = new Window ("Show Text Alignments - Press Esc to return") {
X = 0,
Y = 0,
Width = Dim.Fill (),
Height = Dim.Fill ()
};
container.KeyUp += (e) => {
if (e.KeyEvent.Key == Key.Esc)
container.Running = false;
};
const int i = 0;
const string txt = "Hello world, how are you doing today?";
container.Add (
new Label ($"{i + 1}-{txt}") { TextAlignment = TextAlignment.Left, Y = 3, Width = Dim.Fill () },
new Label ($"{i + 2}-{txt}") { TextAlignment = TextAlignment.Right, Y = 5, Width = Dim.Fill () },
new Label ($"{i + 3}-{txt}") { TextAlignment = TextAlignment.Centered, Y = 7, Width = Dim.Fill () },
new Label ($"{i + 4}-{txt}") { TextAlignment = TextAlignment.Justified, Y = 9, Width = Dim.Fill () }
);
Application.Run (container);
}
static void ShowEntries (View container)
{
scrollView = new ScrollView (new Rect (50, 10, 20, 8)) {
ContentSize = new Size (100, 100),
ContentOffset = new Point (-1, -1),
ShowVerticalScrollIndicator = true,
ShowHorizontalScrollIndicator = true
};
AddScrollViewChild ();
// This is just to debug the visuals of the scrollview when small
var scrollView2 = new ScrollView (new Rect (72, 10, 3, 3)) {
ContentSize = new Size (100, 100),
ShowVerticalScrollIndicator = true,
ShowHorizontalScrollIndicator = true
};
scrollView2.Add (new Box10x (0, 0));
var progress = new ProgressBar (new Rect (68, 1, 10, 1));
bool timer (MainLoop _)
{
progress.Pulse ();
return true;
}
Application.MainLoop.AddTimeout (TimeSpan.FromMilliseconds (300), timer);
// A little convoluted, this is because I am using this to test the
// layout based on referencing elements of another view:
var login = new Label ("Login: ") { X = 3, Y = 6 };
var password = new Label ("Password: ") {
X = Pos.Left (login),
Y = Pos.Bottom (login) + 1
};
var loginText = new TextField ("") {
X = Pos.Right (password),
Y = Pos.Top (login),
Width = 40
};
var passText = new TextField ("") {
Secret = true,
X = Pos.Left (loginText),
Y = Pos.Top (password),
Width = Dim.Width (loginText)
};
// Add some content
container.Add (
login,
loginText,
password,
passText,
new FrameView (new Rect (3, 10, 25, 6), "Options", new View [] {
new CheckBox (1, 0, "Remember me"),
new RadioGroup (1, 2, new ustring [] { "_Personal", "_Company" }) }
),
new ListView (new Rect (60, 6, 16, 4), new string [] {
"First row",
"<>",
"This is a very long row that should overflow what is shown",
"4th",
"There is an empty slot on the second row",
"Whoa",
"This is so cool"
}),
scrollView,
scrollView2,
new Button ("Ok") { X = 3, Y = 19 },
new Button ("Cancel") { X = 10, Y = 19 },
progress,
new Label ("Press F9 (on Unix ESC+9 is an alias) to activate the menubar") { X = 3, Y = 22 }
);
}
private static void AddScrollViewChild ()
{
if (isBox10x) {
scrollView.Add (new Box10x (0, 0));
} else {
scrollView.Add (new Filler (new Rect (0, 0, 40, 40)));
}
scrollView.ContentOffset = Point.Empty;
}
static void NewFile ()
{
var okButton = new Button ("Ok", is_default: true);
okButton.Clicked += () => Application.RequestStop ();
var cancelButton = new Button ("Cancel");
cancelButton.Clicked += () => Application.RequestStop ();
var d = new Dialog (
"New File", 50, 20,
okButton,
cancelButton);
var ml2 = new Label (1, 1, "Mouse Debug Line");
d.Add (ml2);
Application.Run (d);
}
static bool Quit ()
{
var n = MessageBox.Query (50, 7, "Quit Demo", "Are you sure you want to quit this demo?", "Yes", "No");
return n == 0;
}
static void Close ()
{
MessageBox.ErrorQuery (50, 7, "Error", "There is nothing to close", "Ok");
}
private static void ScrollViewCheck ()
{
isBox10x = miScrollViewCheck.Children [0].Checked = !miScrollViewCheck.Children [0].Checked;
miScrollViewCheck.Children [1].Checked = !miScrollViewCheck.Children [1].Checked;
scrollView.RemoveAll ();
AddScrollViewChild ();
}
public static Label ml;
private static MenuBarItem miScrollViewCheck;
private static bool isBox10x = true;
private static Window win;
private static ScrollView scrollView;
static void Main (string [] args)
{
if (args.Length > 0 && args.Contains ("-usc")) {
Application.UseSystemConsole = true;
}
Console.OutputEncoding = Encoding.Default;
Application.Init ();
var top = Application.Top;
win = new Window ("Hello") {
X = 0,
Y = 1,
Width = Dim.Fill (),
Height = Dim.Fill () - 1
};
var menu = new MenuBar (new MenuBarItem [] {
new MenuBarItem ("_File", new MenuItem [] {
new MenuItem ("_New", "Creates new file", NewFile),
new MenuItem ("_Open", "", null),
new MenuItem ("_Close", "", () => Close ()),
new MenuItem ("_Quit", "", () => { if (Quit ()) top.Running = false; })
}),
new MenuBarItem ("_Edit", new MenuItem [] {
new MenuItem ("_Copy", "", null),
new MenuItem ("C_ut", "", null),
new MenuItem ("_Paste", "", null)
}),
new MenuBarItem ("A_ssorted", new MenuItem [] {
new MenuItem ("_Show text alignments", "", () => ShowTextAlignments (), null, null, Key.AltMask | Key.CtrlMask | Key.G)
}),
miScrollViewCheck = new MenuBarItem ("ScrollView", new MenuItem [] {
new MenuItem ("Box10x", "", () => ScrollViewCheck()) {CheckType = MenuItemCheckStyle.Radio, Checked = true },
new MenuItem ("Filler", "", () => ScrollViewCheck()) {CheckType = MenuItemCheckStyle.Radio }
})
});
ShowEntries (win);
int count = 0;
ml = new Label (new Rect (3, 17, 47, 1), "Mouse: ");
Application.RootMouseEvent += (me) => ml.Text = $"Mouse: ({me.X},{me.Y}) - {me.Flags} {count++}";
win.Add (ml);
var statusBar = new StatusBar (new StatusItem [] {
new StatusItem(Key.F1, "~F1~ Help", () => MessageBox.Query (50, 7, "Help", "Helping", "Ok")),
new StatusItem(Key.F2, "~F2~ Load", () => MessageBox.Query (50, 7, "Load", "Loading", "Ok")),
new StatusItem(Key.F3, "~F3~ Save", () => MessageBox.Query (50, 7, "Save", "Saving", "Ok")),
new StatusItem(Key.CtrlMask | Key.Q, "~^Q~ Quit", () => { if (Quit ()) top.Running = false; }),
new StatusItem(Key.Null, Application.Driver.GetType().Name, null)
});
top.Add (win, menu, statusBar);
Application.Run ();
Application.Shutdown ();
}
}
}