feat: add default input parser
- define standard key names for normalized input events - parse common terminal key sequences and bracketed paste - update example to display parsed input events
This commit is contained in:
+29
-11
@@ -1,31 +1,34 @@
|
||||
using TinyTUI;
|
||||
using TinyTUI.Input;
|
||||
using TinyTUI.Stdio;
|
||||
using TinyTUI.Stdout;
|
||||
|
||||
using var input = new ConsoleTerminalInput();
|
||||
var output = new ConsoleTerminalOutput();
|
||||
var parser = new DefaultInputParser();
|
||||
var done = new ManualResetEventSlim();
|
||||
var latestSize = input.CurrentSize;
|
||||
|
||||
output.ClearScreen();
|
||||
output.HideCursor();
|
||||
Render(output, latestSize, "等待输入");
|
||||
Render(output, latestSize, "等待输入", []);
|
||||
|
||||
input.DataReceived += (_, data) =>
|
||||
{
|
||||
if (data == "\x1b")
|
||||
var events = parser.Parse(data);
|
||||
if (events.Any(static e => e is { Kind: TuiInputEventKind.Key, Value: KeyNames.Escape }))
|
||||
{
|
||||
done.Set();
|
||||
return;
|
||||
}
|
||||
|
||||
Render(output, latestSize, $"按键: {FormatInput(data)}");
|
||||
Render(output, latestSize, $"原始输入: {FormatInput(data)}", events);
|
||||
};
|
||||
|
||||
input.Resized += (_, size) =>
|
||||
{
|
||||
latestSize = size;
|
||||
Render(output, latestSize, "窗口尺寸已变化");
|
||||
Render(output, latestSize, "窗口尺寸已变化", [new TuiInputEvent(TuiInputEventKind.Resize, $"{size.Columns}x{size.Rows}")]);
|
||||
};
|
||||
|
||||
try
|
||||
@@ -41,18 +44,33 @@ finally
|
||||
output.Flush();
|
||||
}
|
||||
|
||||
static void Render(ConsoleTerminalOutput output, TerminalSize size, string message)
|
||||
static void Render(ConsoleTerminalOutput output, TerminalSize size, string message, IReadOnlyList<TuiInputEvent> events)
|
||||
{
|
||||
output.ClearScreen();
|
||||
output.Write("TinyTUI IO 示例\r\n");
|
||||
output.Write("================\r\n");
|
||||
output.Write("TinyTUI Input 示例\r\n");
|
||||
output.Write("===================\r\n");
|
||||
output.Write($"尺寸: {size.Columns} x {size.Rows}\r\n");
|
||||
output.Write($"{message}\r\n");
|
||||
output.Write("\r\n");
|
||||
output.Write("解析事件:\r\n");
|
||||
|
||||
if (events.Count == 0)
|
||||
{
|
||||
output.Write("- 无\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var inputEvent in events)
|
||||
{
|
||||
output.Write($"- {inputEvent.Kind}: {FormatInput(inputEvent.Value)}\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
output.Write("\r\n");
|
||||
output.Write("测试方式:\r\n");
|
||||
output.Write("- 输入普通字符 观察按键内容\r\n");
|
||||
output.Write("- 按方向键 Home End Delete F1-F12 观察原始序列\r\n");
|
||||
output.Write("- 改变终端窗口大小 观察尺寸刷新\r\n");
|
||||
output.Write("- 输入普通字符 应解析为 Text\r\n");
|
||||
output.Write("- 按方向键 Home End Delete F1-F12 应解析为 Key\r\n");
|
||||
output.Write("- 改变终端窗口大小 应解析为 Resize\r\n");
|
||||
output.Write("- 按 Esc 退出\r\n");
|
||||
output.Flush();
|
||||
}
|
||||
@@ -65,7 +83,7 @@ static string FormatInput(string data)
|
||||
'\n' => "\\n",
|
||||
'\t' => "\\t",
|
||||
'\b' => "\\b",
|
||||
'\x1b' => "\\x1b",
|
||||
'\e' => "\\e",
|
||||
_ when char.IsControl(c) => $"\\x{(int)c:x2}",
|
||||
_ => c.ToString(),
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user