From a1d4df897e84dfdedcf951867e2cee0650899f1b Mon Sep 17 00:00:00 2001 From: fanlusky <1730976608@qq.com> Date: Sun, 14 Jun 2026 19:54:34 +0800 Subject: [PATCH] Add keyboard navigation and menu list support --- ui/README.md | 2 + ui/demos/msimeui-demo/DemoScene.cpp | 42 ++- ui/include/msimeui/Controls.h | 46 ++++ ui/include/msimeui/Layout.h | 5 + ui/include/msimeui/Scene.h | 2 + ui/include/msimeui/Window.h | 1 + ui/src/Controls.cpp | 409 +++++++++++++++++++++++++++- ui/src/Layout.cpp | 62 +++++ ui/src/Scene.cpp | 40 +++ ui/src/Window.cpp | 22 ++ 10 files changed, 602 insertions(+), 29 deletions(-) diff --git a/ui/README.md b/ui/README.md index ef1b893a..cb40f18c 100644 --- a/ui/README.md +++ b/ui/README.md @@ -21,6 +21,7 @@ - `TextBlock` / `Button` / `CheckBox` / `ProgressBar` / `Slider` / `Separator` / `ListView` / `TreeView` / `TabControl` / `Accordion` - `ComboBox` - `ContextMenuHost` +- `MenuList` - `Card` - `TextBox` 输入控件 @@ -54,6 +55,7 @@ - 新增第一版 `PopupHost / Popup` 弹出层系统:`Scene` 现可管理 overlay popup,支持高于主视觉树的渲染顺序、命中测试、滚轮路由、窗口重排后的重新定位,以及点击空白区域自动关闭;demo 已加入一个快速操作弹出层示例 - 新增第一版 `ComboBox`:基于新的 overlay popup 系统实现下拉选择,支持展开/收起、点击项选中、当前值回写,以及点击空白区域自动关闭;demo 已加入可交互示例 - 新增第一版 `ContextMenuHost`:窗口现可分发右键上下文菜单事件,控件可在鼠标位置弹出 scene overlay 菜单,并支持点击菜单项执行动作、点击空白区域自动关闭;demo 已加入右键菜单示例 +- 新增第一版键盘导航能力:窗口现支持 `Tab / Shift+Tab` 在可聚焦控件间切换焦点,`Button` / `CheckBox` 支持 `Enter / Space` 触发,`ComboBox` 支持方向键切换,新增 `MenuList` 并用于 demo 右键菜单,支持 `Up / Down / Enter / Space` ## 构建 diff --git a/ui/demos/msimeui-demo/DemoScene.cpp b/ui/demos/msimeui-demo/DemoScene.cpp index 0ee5c045..af36ba04 100644 --- a/ui/demos/msimeui-demo/DemoScene.cpp +++ b/ui/demos/msimeui-demo/DemoScene.cpp @@ -442,15 +442,11 @@ std::unique_ptr CreateDemoScene() auto contextMenuPopupStack = std::make_shared(8.0f); contextMenuPopupStack->AddChild(std::make_shared(L"Canvas Actions", 15.0f, D2D1::ColorF(0x1F2937), true)); - auto contextMenuRefresh = std::make_shared