mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2026-01-02 01:03:29 +01:00
* Adds basic MainLoop unit tests * Remove WinChange action from Curses * Remove WinChange action from Curses * Remove ProcessInput action from Windows MainLoop * Simplified MainLoop/ConsoleDriver by making MainLoop internal and moving impt fns to Application * Modernized Terminal resize events * Modernized Terminal resize events * Removed un used property * for _isWindowsTerminal devenv->wininit; not sure what changed * Modernized mouse/keyboard events (Action->EventHandler) * Updated OnMouseEvent API docs * Using WT_SESSION to detect WT * removes hacky GetParentProcess * Updates to fix #2634 (clear last line) * removes hacky GetParentProcess2 * Addressed mac resize issue * Addressed mac resize issue * Removes ConsoleDriver.PrepareToRun, has Init return MainLoop * Removes unneeded Attribute methods * Removed GetProcesssName * Removed GetProcesssName * Refactored KeyEvent and KeyEventEventArgs into a single class * Revert "Refactored KeyEvent and KeyEventEventArgs into a single class" This reverts commit88a00658db. * Fixed key repeat issue; reverted stupidity on 1049/1047 confusion * Updated CSI API Docs * merge * Rearranged Event.cs to Keyboard.cs and Mouse.cs * Renamed KeyEventEventArgs KeyEventArgs * temp renamed KeyEvent OldKeyEvent * Merged KeyEvent into KeyEventArgs * Renamed Application.ProcessKey members * Renamed Application.ProcessKey members * Renamed Application.ProcessKey members * Added Responder.KeyPressed * Removed unused references * Fixed arg naming * InvokeKeybindings->InvokeKeyBindings * InvokeKeybindings->InvokeKeyBindings * Fixed unit tests fail * More progress on refactoring key input; still broken and probably wrong * Moved OnKeyPressed out of Responder and made ProcessKeyPrssed non-virtual * Updated API docs * Moved key handling from Responder to View * Updated API docs * Updated HotKey API docs * Updated shortcut API docs * Fixed responder unit tests * Removed Shortcut from View as it is not used * Removed unneeded OnHotKey override from Button * Fixed BackTab logic * Button now uses Key Bindings exclusively * Button now uses Key Bindings exclusively * Updated keyboard.md docs * Fixed unit tests to account for Toplevel handling default button * Added View.InvokeCommand API * Modernized RadioGroup * Removed ColdKey * Modernized (partially) StatusBar * Worked around FileDialog issue with Ctrl-F * Fixed driver unit test; view must be focused to reciev key pressed * Application code cleanup * Start on updaing menu * Menu now mostly works * Menu Select refinement * Fixed known menu bugs! * Enabled HotKey to cause focus- experimental * Fixes #3022 & adds unit test to prove it * Actually Fixes #3022 & adds unit test to prove it * Working through hotkey issues * Misc fixes * removed hot/cold key stuff from Keys scenario * Fixed scenarios * Simplified shortcut string handling * Modernized Checkbox * Modernized TileView * Updated API docs * Updated API docs * attempting to publish v2 docs * Revert "attempting to publish v2 docs" This reverts commit59dcec111b. * Playing with api docs * Removed Key.BackTab * Removed Caps/Scroll/Numlock * Partial removal of keymodifiers - unit tests pass * Partial removal of keymodifiers - broke netdriver somewhere * WindowsDriver & added KeyEventArgsTests * Fixing menu shortcut/hotkeys - broke Menu.cs into separate files * Fixed MenuBar! * Finished modernizing Menu/MenuBar * Removed Key.a-z. Broke lots of stuff * checkout@v4 * progress on key mapping and formatting * VK tests are still failing * Fixed some unit tests * Added Hotkey and Keybinding unit tests * fixed unit test * All unit tests pass again... * Fixed broken unit tests * KeyEventArgs.KeyValue -> AsRune * Fixed bugs. Still some broken * Added KeyEventArgs.IsAlpha. Added KeyEventArgs.cast ops. Fixed bugs. Unit tests pass * Fixed WindowsDriver * Oops. * Refactoring based on bdisp's help. Not complete! * removed calling into subviews from OnKeyBindings * removed calling into subviews from OnKeyBindings * Improved View KeyEvent unit tests * More hotkey unit tests * BIg change - Got rid of KeyPress w/in Application/Drivers * Unit tests now pass again * Refreshed API docs * Better HotKey logic. More progress. Getting close. * Fixed handling of shifted chars like ö * Minor code cleanup * Minor code cleanup2 * Why is build Action failing? * Why is build Action failing?? * upgraded to .net8 to try to fix weird CI/CD build errors * upgraded to .net8 to try to fix weird CI/CD build errors2 * Disabling TextViewTests to diagnose build errors * reenable TextViewTests to diagnose build errors * Arrrrrrg * Merged v2_develop * Fixed uppercase accented keys in WindowsDriver * Fixed key binding api docs * Experimental impl of CommandScope.SubViews for MenuBar * Removed dead code from application.cs * Removed dead code from application.cs * Removed dead code from ConsoleDriver.cs * Cleaned up some key binding stuff * Disabled Alt to activate menu for now * Updated label commands * Fixed menu bugs. Upgraded menu unit tests * Fixed unit tests * Working on NetDriver * fixed netdriver * Fixed issues called out by @bdisp CR * fixed CursesDriver * added todo to netdriver * Cherry picked treeview test fix1b415e5* Fix NetDriver. * CommandScope->KeyBindingScope * Address some tznind feedback * Refactored KeyBindings big time! * Added key consts to KeyEventArgs and renamed Key to ConsoleDriverKey * Fixed some API docs * Moved ConsoleDriverKey to ConsoleDriver.cs * Renamed Key->ConsoleDriverKey * Renamed Key->ConsoleDriverKey * Renamed Key->ConsoleDriverKey * renamed file I forgot to rename before * Updated name and API docs of KeyEventArgs.isAlpha * Fixed issues with OnKeyUp not doing the right thing. * Fixed MainLoop.Running never being used * Fixed MainLoop.Running never being used - unit tests * Claned up BUGBUG comments * Disabled a unit test to see why ci/cd tests are failing * Removed defunct commented code * Removed more defunct commented code * Re-eanbled unit test; jsut removing one test case... * Disabled more... * Renambed Global->Applicaton and updated scope API docs * Disabled more unit tests... * Removed dead code * Disabled more unit tests...2 * Disabled more unit tests...3 * Renambed Global->Applicaton and updated scope API docs 2 * Added more KeyBinding scope tests * Added more KeyBinding scope tests2 * ConsoleDriverKey too long. Key too ambiguous. Settled on KeyCode. (Partialy because eventually I want to intro a class named Key). * KeyEventArgs improvements. cast to Rune must be explicit as it's lossy * Fixed warnings * Renamed KeyEventArgs to Key... progress on fixing broken stuff that resulted * Fix ConsoleKeyMapping bugs. * Fix NetDriver issue from converting a lower case to a upper case. * Started migration to Key from KeyCode - e.g. made HotKeys all consistent. * Fixed build warnings * Added key defns to Key * KeyBindings now uses Key vs. KeyCode * Verified by tweaking UICatalog * Fixed treeview test ... again * Renamed ProcessKeyDown/Up to NewKeyDown/Up and OnKeyPressed to OnProcessKeyDown to make things more clear * Added test AllViews_KeyDown_All_EventsFire unit tests and fixed a few Views that were wrong * fixed stupid KeyUp event bug * If key not handled, return false for datefield * dotnet test --no-restore --verbosity diag * dotnet test --blame * run tests on windows * Fix TestVKPacket unit test and move it to ConsoleKeyMappingTests.cs file. * Remove unnecessary commented code. * Tweaked unit tests and removed Key.BareKey * Fixed little details and updated api docs * updated api docs * AddKeyBindingsForHotKey: KeyCode->Key * Cleaned up more old KeyCode usages. Added TODOs --------- Co-authored-by: BDisp <bd.bdisp@gmail.com>
259 lines
8.8 KiB
C#
259 lines
8.8 KiB
C#
using System;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using Terminal.Gui;
|
||
using Terminal.Gui.TextValidateProviders;
|
||
|
||
|
||
namespace UICatalog.Scenarios {
|
||
[ScenarioMetadata (Name: "Text Input Controls", Description: "Tests all text input controls")]
|
||
[ScenarioCategory ("Controls")]
|
||
[ScenarioCategory ("Mouse and Keyboard")]
|
||
[ScenarioCategory ("Text and Formatting")]
|
||
public class Text : Scenario {
|
||
public override void Setup ()
|
||
{
|
||
// TextField is a simple, single-line text input control
|
||
var textField = new TextField ("TextField with test text. Unicode shouldn't 𝔹Aℝ𝔽!") {
|
||
X = 1,
|
||
Y = 0,
|
||
Width = Dim.Percent (50) - 1,
|
||
// Height will be replaced with 1
|
||
Height = 2
|
||
};
|
||
|
||
var singleWordGenerator = new SingleWordSuggestionGenerator ();
|
||
textField.Autocomplete.SuggestionGenerator = singleWordGenerator;
|
||
|
||
textField.TextChanging += TextField_TextChanging;
|
||
|
||
void TextField_TextChanging (object sender, TextChangingEventArgs e)
|
||
{
|
||
singleWordGenerator.AllSuggestions = Regex.Matches (e.NewText, "\\w+")
|
||
.Select (s => s.Value)
|
||
.Distinct ().ToList ();
|
||
}
|
||
Win.Add (textField);
|
||
|
||
var labelMirroringTextField = new Label (textField.Text) {
|
||
X = Pos.Right (textField) + 1,
|
||
Y = Pos.Top (textField),
|
||
Width = Dim.Fill (1) - 1
|
||
};
|
||
Win.Add (labelMirroringTextField);
|
||
|
||
textField.TextChanged += (s, prev) => {
|
||
labelMirroringTextField.Text = textField.Text;
|
||
};
|
||
|
||
// TextView is a rich (as in functionality, not formatting) text editing control
|
||
var textView = new TextView () {
|
||
X = 1,
|
||
Y = Pos.Bottom (textField) + 1,
|
||
Width = Dim.Percent (50) - 1,
|
||
Height = Dim.Percent (30),
|
||
};
|
||
textView.Text = "TextView with some more test text. Unicode shouldn't 𝔹Aℝ𝔽!";
|
||
textView.DrawContent += TextView_DrawContent;
|
||
|
||
// This shows how to enable autocomplete in TextView.
|
||
void TextView_DrawContent (object sender, DrawEventArgs e)
|
||
{
|
||
singleWordGenerator.AllSuggestions = Regex.Matches (textView.Text, "\\w+")
|
||
.Select (s => s.Value)
|
||
.Distinct ().ToList ();
|
||
}
|
||
Win.Add (textView);
|
||
|
||
var labelMirroringTextView = new Label () {
|
||
X = Pos.Right (textView) + 1,
|
||
Y = Pos.Top (textView),
|
||
Width = Dim.Fill (1) - 1,
|
||
Height = Dim.Height (textView) - 1,
|
||
};
|
||
Win.Add (labelMirroringTextView);
|
||
|
||
// Use ContentChanged to detect if the user has typed something in a TextView.
|
||
// The TextChanged property is only fired if the TextView.Text property is
|
||
// explicitly set
|
||
textView.ContentsChanged += (s, a) => {
|
||
labelMirroringTextView.Enabled = !labelMirroringTextView.Enabled;
|
||
labelMirroringTextView.Text = textView.Text;
|
||
};
|
||
|
||
// By default TextView is a multi-line control. It can be forced to
|
||
// single-line mode.
|
||
var chxMultiline = new CheckBox ("Multiline") {
|
||
X = Pos.Left (textView),
|
||
Y = Pos.Bottom (textView),
|
||
Checked = textView.Multiline
|
||
};
|
||
Win.Add (chxMultiline);
|
||
|
||
var chxWordWrap = new CheckBox ("Word Wrap") {
|
||
X = Pos.Right (chxMultiline) + 2,
|
||
Y = Pos.Top (chxMultiline),
|
||
Checked = textView.WordWrap
|
||
};
|
||
chxWordWrap.Toggled += (s, e) => textView.WordWrap = (bool)e.NewValue;
|
||
Win.Add (chxWordWrap);
|
||
|
||
// TextView captures Tabs (so users can enter /t into text) by default;
|
||
// This means using Tab to navigate doesn't work by default. This shows
|
||
// how to turn tab capture off.
|
||
var chxCaptureTabs = new CheckBox ("Capture Tabs") {
|
||
X = Pos.Right (chxWordWrap) + 2,
|
||
Y = Pos.Top (chxWordWrap),
|
||
Checked = textView.AllowsTab
|
||
};
|
||
|
||
chxMultiline.Toggled += (s, e) => {
|
||
textView.Multiline = (bool)e.NewValue;
|
||
if (!textView.Multiline && (bool)chxWordWrap.Checked) {
|
||
chxWordWrap.Checked = false;
|
||
}
|
||
if (!textView.Multiline && (bool)chxCaptureTabs.Checked) {
|
||
chxCaptureTabs.Checked = false;
|
||
}
|
||
};
|
||
|
||
var keyTab = textView.KeyBindings.GetKeyFromCommands (Command.Tab);
|
||
var keyBackTab = textView.KeyBindings.GetKeyFromCommands (Command.BackTab);
|
||
chxCaptureTabs.Toggled += (s, e) => {
|
||
if (e.NewValue == true) {
|
||
textView.KeyBindings.Add (keyTab, Command.Tab);
|
||
textView.KeyBindings.Add (keyBackTab, Command.BackTab);
|
||
} else {
|
||
textView.KeyBindings.Remove (keyTab);
|
||
textView.KeyBindings.Remove (keyBackTab);
|
||
}
|
||
textView.AllowsTab = (bool)e.NewValue;
|
||
};
|
||
Win.Add (chxCaptureTabs);
|
||
|
||
var hexEditor = new HexView (new MemoryStream (Encoding.UTF8.GetBytes ("HexEditor Unicode that shouldn't 𝔹Aℝ𝔽!"))) {
|
||
X = 1,
|
||
Y = Pos.Bottom (chxMultiline) + 1,
|
||
Width = Dim.Percent (50) - 1,
|
||
Height = Dim.Percent (30),
|
||
};
|
||
Win.Add (hexEditor);
|
||
|
||
var labelMirroringHexEditor = new Label () {
|
||
X = Pos.Right (hexEditor) + 1,
|
||
Y = Pos.Top (hexEditor),
|
||
Width = Dim.Fill (1) - 1,
|
||
Height = Dim.Height (hexEditor) - 1,
|
||
};
|
||
var array = ((MemoryStream)hexEditor.Source).ToArray ();
|
||
labelMirroringHexEditor.Text = Encoding.UTF8.GetString (array, 0, array.Length);
|
||
hexEditor.Edited += (s, kv) => {
|
||
hexEditor.ApplyEdits ();
|
||
var array = ((MemoryStream)hexEditor.Source).ToArray ();
|
||
labelMirroringHexEditor.Text = Encoding.UTF8.GetString (array, 0, array.Length);
|
||
};
|
||
Win.Add (labelMirroringHexEditor);
|
||
|
||
var dateField = new DateField (System.DateTime.Now) {
|
||
X = 1,
|
||
Y = Pos.Bottom (hexEditor) + 1,
|
||
Width = 20,
|
||
IsShortFormat = false
|
||
};
|
||
Win.Add (dateField);
|
||
|
||
var labelMirroringDateField = new Label (dateField.Text) {
|
||
X = Pos.Right (dateField) + 1,
|
||
Y = Pos.Top (dateField),
|
||
Width = Dim.Width (dateField),
|
||
Height = Dim.Height (dateField),
|
||
};
|
||
Win.Add (labelMirroringDateField);
|
||
|
||
dateField.TextChanged += (s, prev) => {
|
||
labelMirroringDateField.Text = dateField.Text;
|
||
};
|
||
|
||
_timeField = new TimeField (DateTime.Now.TimeOfDay) {
|
||
X = Pos.Right (labelMirroringDateField) + 5,
|
||
Y = Pos.Bottom (hexEditor) + 1,
|
||
Width = 20,
|
||
IsShortFormat = false
|
||
};
|
||
Win.Add (_timeField);
|
||
|
||
_labelMirroringTimeField = new Label (_timeField.Text) {
|
||
X = Pos.Right (_timeField) + 1,
|
||
Y = Pos.Top (_timeField),
|
||
Width = Dim.Width (_timeField),
|
||
Height = Dim.Height (_timeField),
|
||
};
|
||
Win.Add (_labelMirroringTimeField);
|
||
|
||
_timeField.TimeChanged += TimeChanged;
|
||
|
||
// MaskedTextProvider - uses .NET MaskedTextProvider
|
||
var netProviderLabel = new Label ("NetMaskedTextProvider [ 999 000 LLL >LLL| AAA aaa ]") {
|
||
X = Pos.Left (dateField),
|
||
Y = Pos.Bottom (dateField) + 1
|
||
};
|
||
Win.Add (netProviderLabel);
|
||
|
||
var netProvider = new NetMaskedTextProvider ("999 000 LLL > LLL | AAA aaa");
|
||
|
||
var netProviderField = new TextValidateField (netProvider) {
|
||
X = Pos.Right (netProviderLabel) + 1,
|
||
Y = Pos.Y (netProviderLabel),
|
||
};
|
||
|
||
Win.Add (netProviderField);
|
||
|
||
// TextRegexProvider - Regex provider implemented by Terminal.Gui
|
||
var regexProvider = new Label ("TextRegexProvider [ ^([0-9]?[0-9]?[0-9]|1000)$ ]") {
|
||
X = Pos.Left (netProviderLabel),
|
||
Y = Pos.Bottom (netProviderLabel) + 1
|
||
};
|
||
Win.Add (regexProvider);
|
||
|
||
var provider2 = new TextRegexProvider ("^([0-9]?[0-9]?[0-9]|1000)$") { ValidateOnInput = false };
|
||
var regexProviderField = new TextValidateField (provider2) {
|
||
X = Pos.Right (regexProvider) + 1,
|
||
Y = Pos.Y (regexProvider),
|
||
Width = 30,
|
||
TextAlignment = TextAlignment.Centered
|
||
};
|
||
|
||
Win.Add (regexProviderField);
|
||
|
||
var labelAppendAutocomplete = new Label ("Append Autocomplete:") {
|
||
Y = Pos.Y (regexProviderField) + 2,
|
||
X = 1
|
||
};
|
||
var appendAutocompleteTextField = new TextField () {
|
||
X = Pos.Right (labelAppendAutocomplete),
|
||
Y = labelAppendAutocomplete.Y,
|
||
Width = Dim.Fill ()
|
||
};
|
||
appendAutocompleteTextField.Autocomplete = new AppendAutocomplete (appendAutocompleteTextField);
|
||
appendAutocompleteTextField.Autocomplete.SuggestionGenerator = new SingleWordSuggestionGenerator {
|
||
AllSuggestions = new System.Collections.Generic.List<string>{
|
||
"fish", "flipper", "fin","fun","the","at","there","some","my","of","be","use","her","than","and","this","an","would","first","have","each","make","water","to","from","which","like","been","in","or","she","him","call","is","one","do","into","who","you","had","how","time","oil","that","by","their","has","its","it","word","if","look","now","he","but","will","two","find","was","not","up","more","long","for","what","other","write","down","on","all","about","go","day","are","were","out","see","did","as","we","many","number","get","with","when","then","no","come","his","your","them","way","made","they","can","these","could","may","said","so","people","part"
|
||
}
|
||
};
|
||
|
||
Win.Add (labelAppendAutocomplete);
|
||
Win.Add (appendAutocompleteTextField);
|
||
}
|
||
|
||
TimeField _timeField;
|
||
Label _labelMirroringTimeField;
|
||
|
||
private void TimeChanged (object sender, DateTimeEventArgs<TimeSpan> e)
|
||
{
|
||
_labelMirroringTimeField.Text = _timeField.Text;
|
||
}
|
||
}
|
||
}
|