feat: upgrade select list items

- add SelectItem model with labels and descriptions

- support filtering, wrap-around, scroll info, and selection change

- demonstrate select list filtering in Example
This commit is contained in:
chuan
2026-06-04 01:01:28 +08:00
parent ea8a5b08d7
commit 18e1f90f62
4 changed files with 244 additions and 39 deletions
+35 -7
View File
@@ -54,10 +54,11 @@ input.OnSubmitted = value =>
new SelectOverlay(runtime, message => AddEvent(eventsText, message), textMeasurer),
new OverlayOptions
{
Width = 34,
Width = OverlaySize.Percent(62),
MinWidth = 56,
Anchor = OverlayAnchor.LeftCenter,
Margin = new OverlayMargin(1),
MaxHeight = 9,
MaxHeight = 12,
});
break;
case "/edit":
@@ -229,15 +230,42 @@ file sealed class SelectOverlay : IInputComponent
{
_runtime = runtime;
_addEvent = addEvent;
_selectList = new SelectList(textMeasurer) { Height = 5 };
_selectList.SetItems(["Text", "Input", "Editor", "SelectList", "Markdown", "Loader", "Overlay"]);
_selectList.OnSubmitted = (item, _) =>
_selectList = new SelectList(textMeasurer)
{
_addEvent($"Selected: {item}");
Height = 6,
EmptyText = "没有匹配项",
};
_selectList.SetItems(
[
new SelectItem("text", "Text", "渲染纯文本和多行内容"),
new SelectItem("input", "Input", "单行输入 提交 取消和光标定位"),
new SelectItem("editor", "Editor", "多行编辑 历史记录 词级移动和撤销"),
new SelectItem("select-list", "SelectList", "过滤 描述列 循环选择和提交"),
new SelectItem("markdown", "Markdown", "轻量 Markdown 文本展示"),
new SelectItem("loader", "Loader", "自动 tick 的加载动画"),
new SelectItem("overlay", "Overlay", "定位 尺寸 焦点和 non-capturing 提示"),
]);
_selectList.OnSelectionChanged = (item, _) => _addEvent($"Selection: {item.Label}");
_selectList.OnItemSubmitted = (item, _) =>
{
_addEvent($"Selected: {item.Label} ({item.Value})");
_runtime.HideOverlay();
};
_selectList.OnCanceled = _runtime.HideOverlay;
_box = new Box(_selectList, textMeasurer) { Title = "SelectList" };
_box = new Box(
new Container
{
Children =
{
new Text("输入文本过滤 Backspace 删除过滤 Up/Down 循环选择 Enter 提交"),
new Text(),
_selectList,
},
},
textMeasurer)
{
Title = "SelectList",
};
}
public IReadOnlyList<string> Render(int width) => _box.Render(width);