From a776341ad60eebdea5549a79fa5495f7d5119480 Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Thu, 15 Feb 2018 23:11:23 -0500 Subject: [PATCH] Add .NET core sample --- README.md | 16 +- StandaloneExample/Program.cs | 187 +++++++++++++++++++++ StandaloneExample/README.md | 12 ++ StandaloneExample/StandaloneExample.csproj | 11 ++ 4 files changed, 219 insertions(+), 7 deletions(-) create mode 100644 StandaloneExample/Program.cs create mode 100644 StandaloneExample/README.md create mode 100644 StandaloneExample/StandaloneExample.csproj diff --git a/README.md b/README.md index ea5c941e1..1d37e4d31 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Gui.cs - Terminal UI toolkit for .NET -This is a simple UI toolkit for .NET. +This is a simple UI toolkit for .NET, .NET Core and Mono and works on +both Windows and Linux/Unix. ![Sample app](https://raw.githubusercontent.com/migueldeicaza/gui.cs/master/docfx/sample.png) @@ -94,6 +95,9 @@ https://www.nuget.org/packages/Terminal.Gui/0.1.0 Open the solution and run the sample program. +You can find a trivial .NET core sample application in the +"StandaloneExample" directory. + # Input Handling The input handling of gui.cs is similar in some ways to Emacs and the @@ -112,12 +116,10 @@ F10, and F1 to F9 respectively. # Driver model -Currently gui.cs is built on top of curses, but the console driver has -been abstracted, an implementation that uses `System.Console` is -possible, but would have to emulate some of the behavior of curses, -namely that operations are performed on the buffer, and the Refresh -call reflects the contents of an internal buffer into the screen and -position the cursor in the last set position at the end. +Currently gui.cs has support for both ncurses and the `System.Console` +front-ends. ncurses is used on Unix, while `System.Console` is used +on Windows, but youc an force the use of `System.Console` on Unix as +well, see `Core.cs`. # Tasks diff --git a/StandaloneExample/Program.cs b/StandaloneExample/Program.cs new file mode 100644 index 000000000..d12ec8048 --- /dev/null +++ b/StandaloneExample/Program.cs @@ -0,0 +1,187 @@ +using Terminal.Gui; +using System; +using Mono.Terminal; + +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++) { + Rune r; + switch (x % 3) { + case 0: + r = '.'; + break; + case 1: + r = 'o'; + break; + default: + r = 'O'; + break; + } + Driver.AddRune (r); + } + } + } + } + + + static void ShowTextAlignments (View container) + { + container.Add ( + new Label (new Rect (0, 0, 40, 3), "1-Hello world, how are you doing today") { TextAlignment = TextAlignment.Left }, + new Label (new Rect (0, 4, 40, 3), "2-Hello world, how are you doing today") { TextAlignment = TextAlignment.Right }, + new Label (new Rect (0, 8, 40, 3), "3-Hello world, how are you doing today") { TextAlignment = TextAlignment.Centered }, + new Label (new Rect (0, 12, 40, 3), "4-Hello world, how are you doing today") { TextAlignment = TextAlignment.Justified }); + } + + static void ShowEntries (View container) + { + var scrollView = new ScrollView (new Rect (50, 10, 20, 8)) { + ContentSize = new Size (100, 100), + ContentOffset = new Point (-1, -1), + ShowVerticalScrollIndicator = true, + ShowHorizontalScrollIndicator = true + }; + + scrollView.Add (new Box10x (0, 0)); + //scrollView.Add (new Filler (new Rect (0, 0, 40, 40))); + + // 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 caller) + { + progress.Pulse (); + return true; + } + + Application.MainLoop.AddTimeout (TimeSpan.FromMilliseconds (300), timer); + + // Add some content + container.Add ( + new Label (3, 6, "Login: "), + new TextField (14, 6, 40, ""), + new Label (3, 8, "Password: "), + new TextField (14, 8, 40, "") { Secret = true }, + new FrameView (new Rect (3, 10, 25, 6), "Options"){ + new CheckBox (1, 0, "Remember me"), + new RadioGroup (1, 2, new [] { "_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 (3, 19, "Ok"), + new Button (10, 19, "Cancel"), + progress, + new Label (3, 22, "Press ESC and 9 to activate the menubar") + ); + + } + + public static Label ml2; + + static void NewFile () + { + var d = new Dialog ( + "New File", 50, 20, + new Button ("Ok", is_default: true) { Clicked = () => { Application.RequestStop (); } }, + new Button ("Cancel") { Clicked = () => { Application.RequestStop (); } }); + 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, 5, "Error", "There is nothing to close", "Ok"); + } + + public static Label ml; + static void Main () + { + //Application.UseSystemConsole = true; + Application.Init (); + + var top = Application.Top; + var tframe = top.Frame; + + var win = new Window (new Rect (0, 1, tframe.Width, tframe.Height - 1), "Hello"); + 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) + }) + }); + + ShowEntries (win); + int count = 0; + ml = new Label (new Rect (3, 17, 47, 1), "Mouse: "); + Application.RootMouseEvent += delegate (MouseEvent me) { + + ml.Text = $"Mouse: ({me.X},{me.Y}) - {me.Flags} {count++}"; + }; + + win.Add (ml); + + // ShowTextAlignments (win); + top.Add (win); + top.Add (menu); + Application.Run (); + } +} \ No newline at end of file diff --git a/StandaloneExample/README.md b/StandaloneExample/README.md new file mode 100644 index 000000000..c959ff9f8 --- /dev/null +++ b/StandaloneExample/README.md @@ -0,0 +1,12 @@ +This is just a simple standalone sample that shows how to consume +the gui.cs from a NuGet package and .NET Core project. + +Simply run: + +``` +$ dotnet run +``` + +To launch the application. + +Or use Visual Studio, open the solution and run. diff --git a/StandaloneExample/StandaloneExample.csproj b/StandaloneExample/StandaloneExample.csproj new file mode 100644 index 000000000..7fbc7d708 --- /dev/null +++ b/StandaloneExample/StandaloneExample.csproj @@ -0,0 +1,11 @@ + + + + Exe + netcoreapp2.0 + + + + + +