Browse Source

Add .NET core sample

Miguel de Icaza 7 years ago
parent
commit
a776341ad6
4 changed files with 219 additions and 7 deletions
  1. 9 7
      README.md
  2. 187 0
      StandaloneExample/Program.cs
  3. 12 0
      StandaloneExample/README.md
  4. 11 0
      StandaloneExample/StandaloneExample.csproj

+ 9 - 7
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
 

+ 187 - 0
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 ();
+	}
+}

+ 12 - 0
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.

+ 11 - 0
StandaloneExample/StandaloneExample.csproj

@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp2.0</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Terminal.Gui" Version="0.2.0" />
+  </ItemGroup>
+</Project>