* Fixes #1446. Added more features to the Border and Toplevel focus. * Prevents throwing exception on negative effect3DOffset values * Ensures that a view can be focused. * Only sets focus if it isn't disposing. * Fixes ViewToScreen and DrawChildBorder Effect3D. * Unit test for negative coordinates with the ViewToScreen method. * Added Tab navigation feature to the Editor scenario. * ComboBox cursonDownKey nullref fix (#1472) * added null guard to fix null ref when pressing keyDown inside combobox Improved an error message when view cannot be found * Added a unit test to ensure combobox can process all key events Found and fixed a new nullref * Found a new bug when source is already present and combobox is added to a top view * searchSet is auto initialized to new List() now to make the code a little bit safer * Fixes WindowsDriver HeightAsBuffer set to false. (#1466) * Bump ReportGenerator from 4.8.12 to 4.8.13 (#1473) Bumps [ReportGenerator](https://github.com/danielpalme/ReportGenerator) from 4.8.12 to 4.8.13. - [Release notes](https://github.com/danielpalme/ReportGenerator/releases) - [Commits](https://github.com/danielpalme/ReportGenerator/compare/v4.8.12...v4.8.13) --- updated-dependencies: - dependency-name: ReportGenerator dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fixes #1445. Fixing more the Curses and WSL clipboard. (#1448) * Fixes #1445. Fixing more the Curses and WSL clipboard. * Fixing unit tests. * Changing namespace. * Fixes WSL2 clipboard unit test. * Upgrades devcontainer with the MainLoop fix. * Fixes pasting with no selection and with lines break. * Prevents the event button click being fired after a button pressed with mouse move. * Fixes the char [ not being processed. * Added Application.QuitKey property to allow change the quitting application key. (#1450) * Added Application.QuitKey property to allow change the quitting application key. * Fixes QuitKey unit test by reseting his value. * Locks timeouts until is added. * Fixes #1467. AlternateForward/BackwardKey bypasses dialog modality (#1468) * Changed namespace. * Fixing merge conflicts. * Fixes mouse click issue. * Removing windows resizing because buffer resizing is enough. * Fixes #1477. Mouse click and console bottom on Windows Terminal. Co-authored-by: Igor Bagdamyan <37334640+En3Tho@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Terminal.Gui UI Catalog
UI Catalog is a comprehensive sample library for Terminal.Gui. It attempts to satisfy the following goals:
- Be an easy to use showcase for Terminal.Gui concepts and features.
- Provide sample code that illustrates how to properly implement said concepts & features.
- Make it easy for contributors to add additional samples in a structured way.
Motivation
The original demo.cs sample app for Terminal.Gui is neither good to showcase, nor does it explain different concepts. In addition, because it is built on a single source file, it has proven to cause friction when multiple contributors are simultaneously working on different aspects of Terminal.Gui. See Issue #368 for more background.
API Reference
How To Use
Build and run UI Catalog by typing dotnet run from the UI Catalog folder or by using the Terminal.Gui Visual Studio solution.
Program.cs is the main UI Catalog app and provides a UI for selecting and running Scenarios. Each *Scenario is implemented as a class derived from Scenario and Program.cs uses reflection to dynamically build the UI.
Scenarios are tagged with categories using the [ScenarioCategory] attribute. The left pane of the main screen lists the categories. Clicking on a category shows all the scenarios in that category.
Scenarios can be run either from the UICatalog.exe app UI or by being specified on the command line:
UICatalog.exe <Scenario Name>
e.g.
UICatalog.exe Buttons
Hitting ENTER on a selected Scenario or double-clicking on a Scenario runs that scenario as though it were a stand-alone Terminal.Gui app.
When a Scenario is run, it runs as though it were a standalone Terminal.Gui app. However, scaffolding is provided (in the Scenario base class) that (optionally) takes care of Terminal.Gui initialization.
Contributing by Adding Scenarios
To add a new Scenario simply:
- Create a new
.csfile in theScenariosdirectory that derives fromScenario. - Add a
[ScenarioMetaData]attribute to the class specifying the scenario's name and description. - Add one or more
[ScenarioCategory]attributes to the class specifying which categories the sceanrio belongs to. If you don't specify a category the sceanrio will show up in "All". - Implement the
Setupoverride which will be called when a user selects the scenario to run. - Optionally, implement the
Initand/orRunoverrides to provide a custom implementation.
The sample below is provided in the Scenarios directory as a generic sample that can be copied and re-named:
using Terminal.Gui;
namespace UICatalog {
[ScenarioMetadata (Name: "Generic", Description: "Generic sample - A template for creating new Scenarios")]
[ScenarioCategory ("Controls")]
class MyScenario : Scenario {
public override void Setup ()
{
// Put your scenario code here, e.g.
Win.Add (new Button ("Press me!") {
X = Pos.Center (),
Y = Pos.Center (),
Clicked = () => MessageBox.Query (20, 7, "Hi", "Neat?", "Yes", "No")
});
}
}
}
Scenario provides a Toplevel and Window the provides a canvas for the Scenario to operate. The default Window shows the Scenario name and supports exiting the Scenario through the Esc key.
To build a more advanced scenario, where control of the Toplevel and Window is needed (e.g. for scenarios using MenuBar or StatusBar), simply set the Top and Window properties as appropriate, as seen in the UnicodeInMenu scenario:
using Terminal.Gui;
namespace UICatalog {
[ScenarioMetadata (Name: "Unicode In Menu", Description: "Unicode menus per PR #204")]
[ScenarioCategory ("Text")]
[ScenarioCategory ("Controls")]
class UnicodeInMenu : Scenario {
public override void Setup ()
{
Top = new Toplevel (new Rect (0, 0, Application.Driver.Cols, Application.Driver.Rows));
var menu = new MenuBar (new MenuBarItem [] {
new MenuBarItem ("_Файл", new MenuItem [] {
new MenuItem ("_Создать", "Creates new file", null),
new MenuItem ("_Открыть", "", null),
new MenuItem ("Со_хранить", "", null),
new MenuItem ("_Выход", "", () => Application.RequestStop() )
}),
new MenuBarItem ("_Edit", new MenuItem [] {
new MenuItem ("_Copy", "", null),
new MenuItem ("C_ut", "", null),
new MenuItem ("_Paste", "", null)
})
});
Top.Add (menu);
Win = new Window ($"Scenario: {GetName ()}") {
X = 0,
Y = 1,
Width = Dim.Fill (),
Height = Dim.Fill ()
};
Top.Add (Win);
}
}
}
For complete control, the Init and Run overrides can be implemented. The base.Init assigns Application.Top to Top and creates Win. The base.Run simply calls Application.Run(Top).
Contribution Guidelines
- Provide a terse, descriptive name for
Scenarios. Keep them short; theListViewthat displays them dynamically sizes the column width and long names will make it hard for people to use. - Provide a clear description.
- Comment
Scenariocode to describe to others why it's a usefulScenario. - Annotate
Scenarioswith[ScenarioCategory]attributes. Try to minimize the number of new categories created. - Use the
Bug ReroCategory forScnariosthat reproduce bugs.- Include the Github Issue # in the Description.
- Once the bug has been fixed in
mastersubmit another PR to remove theScenario(or modify it to provide a good regression test).
- Tag bugs or suggestions for
UI CatalogasTerminal.GuiGithub Issues with "UICatalog: ".

