From 121d0a0cc847688411fdfbfe2a561c95f729babc Mon Sep 17 00:00:00 2001 From: tznind Date: Thu, 20 Oct 2022 16:18:29 +0100 Subject: [PATCH] Update 'Sample Usage' README.md section --- README.md | 119 ++++++++++++++------------------------- docfx/images/Example.png | Bin 0 -> 8085 bytes 2 files changed, 43 insertions(+), 76 deletions(-) create mode 100644 docfx/images/Example.png diff --git a/README.md b/README.md index 4361b8419..817b757ed 100644 --- a/README.md +++ b/README.md @@ -61,98 +61,65 @@ See the [`Terminal.Gui/` README](https://github.com/gui-cs/Terminal.Gui/tree/mas ## Sample Usage in C# +The following example shows basic Terminal.Gui application syntax. + +![Simple Usage app](docfx/images/simpleusage.png) + ```csharp // A simple Terminal.Gui example in C# - using C# 9.0 Top-level statements using Terminal.Gui; -using NStack; -Application.Init (); +// Initialize the console +Application.Init(); -// Creates the top-level window to show -var win = new Window ("Example App") { - X = 0, - Y = 1, // Leave one row for the toplevel menu +// Creates the top-level window with border and title +var win = new Window("Example App (Ctrl+Q to quit)"); - // By using Dim.Fill(), this Window will automatically resize without manual intervention - Width = Dim.Fill (), - Height = Dim.Fill () -}; +// Create input components and labels -Application.Top.Add (win); - -// Creates a menubar, the item "New" has a help menu. -var menu = new MenuBar (new MenuBarItem [] { - new MenuBarItem ("_File", new MenuItem [] { - new MenuItem ("_New", "Creates a new file", null), - new MenuItem ("_Close", "",null), - new MenuItem ("_Quit", "", () => { if (Quit ()) Application.Top.Running = false; }) - }), - new MenuBarItem ("_Edit", new MenuItem [] { - new MenuItem ("_Copy", "", null), - new MenuItem ("C_ut", "", null), - new MenuItem ("_Paste", "", null) - }) - }); -Application.Top.Add (menu); - -static bool Quit () +var usernameLabel = new Label("Username:"); +var usernameText = new TextField("") { - var n = MessageBox.Query (50, 7, "Quit Example", "Are you sure you want to quit this example?", "Yes", "No"); - return n == 0; -} + // Position text field adjacent to label + X = Pos.Right(usernameLabel) + 1, -var login = new Label ("Login: ") { X = 3, Y = 2 }; -var password = new Label ("Password: ") { - X = Pos.Left (login), - Y = Pos.Top (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) + // Fill remaining horizontal space with a margin of 1 + Width = Dim.Fill(1), }; -// Add the views to the main window, -win.Add ( - // Using Computed Layout: - login, password, loginText, passText, +var passwordLabel = new Label(0,2,"Password:"); +var passwordText = new TextField("") +{ + Secret = true, + // align with the text box above + X = Pos.Left(usernameText), + Y = 2, + Width = Dim.Fill(1), +}; - // Using Absolute Layout: - new CheckBox (3, 6, "Remember me"), - new RadioGroup (3, 8, new ustring [] { "_Personal", "_Company" }, 0), - new Button (3, 14, "Ok"), - new Button (10, 14, "Cancel"), - new Label (3, 18, "Press F9 or ESC plus 9 to activate the menubar") +// Create login button +var btnLogin = new Button("Login") +{ + Y = 4, + // center the login button horizontally + X = Pos.Center(), + IsDefault = true, +}; + +// When login button is clicked display a message popup +btnLogin.Clicked += () => MessageBox.Query("Logging In", "Login Successful", "Ok"); + +// Add all the views to the window +win.Add( + usernameLabel, usernameText, passwordLabel, passwordText,btnLogin ); -// Run blocks until the user quits the application -Application.Run (); +// Show the application +Application.Run(win); -// Always bracket Application.Init with .Shutdown. -Application.Shutdown (); -``` - -The example above shows adding views using both styles of layout supported by **Terminal.Gui**: **Absolute layout** and **[Computed layout](https://gui-cs.github.io/Terminal.Gui/articles/overview.html#layout)**. - -Alternatively, you can encapsulate the app behavior in a new `Window`-derived class, say `App.cs` containing the code above, and simplify your `Main` method to: - -```csharp -using Terminal.Gui; - -class Demo { - static void Main () - { - Application.Run (); - Application.Shutdown (); - } -} +// After the application exits, release and reset console for clean shutdown +Application.Shutdown(); ``` ## Installing diff --git a/docfx/images/Example.png b/docfx/images/Example.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3570f1c0cb79107ac2ab75e862a5a701f73ef1 GIT binary patch literal 8085 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