Lu Fan(SonnyCalcr)
e701cebbe4
feat(server,ui,installer): 内置皮肤改由皮肤清单定义,新增微信绿(卷轴)内置皮肤 ( #1061 )
...
* feat(ui): CandidateList 支持等宽网格列与关闭选中态
- Appearance::gridColumns:横排时按可用宽度均分成等宽列(列数不超过 gridColumns,每列不窄于
minItemWidth),放不下一列的项占多列。
- Appearance::selectable:为 false 时不画任何选中态,首项也能正常显示悬停与按下效果。
* feat(server,installer): 内置皮肤改由皮肤清单定义,新增微信绿(卷轴)内置皮肤
内置皮肤数据化:
- skins/default/<id>/skin.toml 从只放开关改为完整的出厂清单(配色、圆角、版式、工具栏、名称与说明),
并新增 canvas 基底的清单。候选窗、悬浮工具栏、光标状态徽标不再在代码里写死任何内置皮肤的参数。
- 出厂清单在构建时编进程序;数据目录里的清单写了的键覆盖出厂值,缺失或写错时退回出厂外观。
安装包改为每次整份覆盖 skins\default。
- 皮肤清单新增版式键(padding、item_gap、number_inset 等,长度可写 DIP 或 "0.3em"),以及
[candidate_window.horizontal] / [candidate_window.vertical] 分排列覆盖、page_arrow_divider、
toolbar.icon_corner_radius_dip。
- test_candidate_skin_tokens 保留改动前的内置分支作参照,逐个皮肤、主题、排列与字号比对清单解析结果。
共用候选窗场景:
- 候选框的场景搭建与套皮肤抽成 CandidateSkinScene,候选窗与设置页的皮肤预览共用;设置页预览改用
真实的候选窗控件绘制,删除原先移植自网页样式的预览绘制与各皮肤硬编码。
卷轴展开(expand_panel)与微信绿(卷轴):
- 皮肤开关 expand_panel / expand_rows:横排候选行右端的展开按钮,展开后首行与后续候选网格一起滚动,
右侧细滚动条;展开与收起只认按钮,展开时滚轮上下滚动、不翻页。
- 网格点选按绝对下标上屏并在工作线程核对显示文字;滚到底部时自动再展开一批候选。
- 新增内置皮肤 wechat_scroll「微信绿(卷轴)」。
2026-10-18 20:42:06 +08:00
Lu Fan(SonnyCalcr)
53649d9d12
feat(server,ui,ui-html): 新增实验性的 Direct2D 设置窗口 ( #999 )
...
* feat(ui): 动画时钟、渲染剔除与文本框扩展,并优化 msimeui 性能
- 新增 Animation.h:cubic-bezier 缓动、Tween、颜色插值,Window 提供
RequestAnimationFrame / GetFrameTime,动画帧随显示刷新率推进
- Window 可选 DirectComposition 渲染(含不透明模式以支持 ClearType)、
双击按下、捕获丢失时结束按压、悬停刷新、可关闭销毁时退出消息循环
- Scene 把滚轮交给光标下最内层可滚动元素并逐级冒泡
- DeviceResources:裁剪栈驱动的离屏剔除、按帧回收的笔刷缓存、SVG 栅格缓存
- ScrollViewer 可配置外观与平滑滚动;Popup 支持阴影通道与出现动画;
卡片阴影缓存抽成可复用的 ShadowCache
- TextBox 支持 SetText、密码掩码、多行滚动、字重/字间距/行高与外观设置
- 调试日志默认关闭(MSIMEUI_DEBUG_LOG=1 才写文件),不再在每次点击和
TSF GetTextExt 时打开文件
- 字体回退在 CJK/emoji 映射之后保留系统回退,缺字不再显示方框
- 新增动画与剔除单元测试
* feat(server): 新增实验性的 Direct2D 设置窗口
设置窗口可通过 appearance.settings_ui_backend 选择渲染方式:默认 webview2,
d2d 为实验性的 msimeui 原生实现(server/src/settings/native/),1:1 复刻
网页设置页,包括侧栏切换时竖向高亮条的滑动动画。
- 两个前端共用同一套 webview 契约消息与 HandleClientMessage,配置读写
映射仍只在 settings_app.cpp
- 切换渲染方式后设置进程自动以新方式重新打开;--d2d / --webview2 可临时指定
- 新配置项写入出厂模板与开发配置,UiBackendPolicy 与测试同步更新
- METASEQUOIA_IME_SETTINGS_INSTANCE 允许开发版与已安装的设置窗口并存
- 更新 ui-backends 文档与 server/AGENTS.md
* feat(ui-html): 外观页新增设置窗口渲染方式选项
2026-10-16 16:13:13 +08:00
fanlusky
797c0f5652
feat(server,ui,ui-html): 候选窗可严格按文字宽度收紧
...
皮肤新增 [candidate_window] fit_content,设置页「外观」新增「候选窗口按文字收紧宽度」
(appearance.candidate_window_fit_content),两者取或。打开后:
- D2D 不再垫 160 DIP 卡片最小宽度和列表 80 DIP 下限,行尾不再多留 6 DIP,
右侧留白与序号左侧留白相同;
- WebView2 去掉 .container 的 7em 下限;
- 同一输入里宽度不再只增不减,高度仍保持。
皮肤的 min_width_dip 与装饰图宽度照常生效;内置皮肤清单出厂为 false。
2026-10-12 02:03:59 +08:00
Lu Fan(SonnyCalcr)
0d7ae4ca79
feat(server): 翻译里的词性与分隔符单独配色 ( #848 )
...
候选翻译(如 "adj. spreading; n. sound of laughter")由 Server 切成单词、词性、
分隔符三段:WebView2 端包成 .cand-pos / .cand-sep,D2D 端经
CandidateList::Item::translationRuns 用分段画刷绘制,两端同一切法。
新增皮肤键 translation_pos / translation_separator 及选中行的
selected_translation_pos / selected_translation_separator,留空时与翻译同色。
内置皮肤的翻译改用 Notion 调色板:词性取相邻的另一个色相并降到 50% 不透明度,
分隔符为单词色 45%;铺实色高亮的选中行另配一组。仓库内的外部皮肤同步补上词性与
分隔符配色。
2026-10-11 23:28:30 +08:00
fanlusky
d256385264
perf(ui): 候选文字布局按内容跨帧复用
...
原来每次 Measure 都清空按项缓存的 DirectWrite 布局,每帧为每个候选重建全部
布局。改为按文字、字号与排版框缓存:移动选中、后补的翻译或云候选重绘同一批
字符串时直接命中,下一键的页面也常在别的下标复用上一页的字。字体或外观变化
时整体清空,条目数有上限。
2026-10-05 13:02:46 +08:00
fanlusky
ec00892121
feat(server): 新增仿微软拼音的内置皮肤 microsoft
...
- 候选窗:深色 #2C2C2C 底、#383838 选中底、#E183D9 紫色选中条,序号与候选同字号,
横排每项最小 4.35em、间距 0.28em(换行的行间同样隔 0.28em);尺寸均按字号缩放
- 翻页:默认开启,实心圆角三角,与候选行等高,横排前加分隔线
- 悬浮工具栏沿用默认页面,拖拽条改为紫色
- ui:PagerArrows 新增 Glyph::Triangle 与分隔线,三角用单一路径填充,半透明时不出现描边重叠;
CandidateList 新增 minItemWidth 与 selectedBarInside
- 设置页新增皮肤卡片与预览;更新内置皮肤列表、文档与配置注释,补充测试
2026-09-30 17:35:38 +08:00
fanlusky
806a4b1977
feat(ui): 新增 PagerArrows 翻页箭头控件
...
两个用线条绘制的「上一页 / 下一页」小按钮,不依赖字体;支持置灰、悬停与按下态,
按钮贴在槽位右下角,并提供 GlyphWidth 供调用方对齐箭头。
2026-09-30 12:42:14 +08:00
fanlusky
19bd5deae0
feat(ui): 候选列表支持行底内边距与横排行铺满
...
contentPadBottom:换到第二行的翻译和辅助码从行底内边距上方开始排,内边距挪到最后一行下面,行高不变。
justifyHorizontalRows:横排时把列表多出的宽度均分给同一行各项,末项贴着列表右边。
2026-09-30 01:33:47 +08:00
fanlusky
07c9dea9f9
feat(ui): 候选选中行翻译色与 TextBlock 背景、底部分隔线
...
CandidateList::Appearance 新增 rowTranslationSelected,选中行的翻译可以单独配色。TextBlock 新增 SetBackground 和 SetBottomRule,底部分隔线计入测量高度;高度折叠到分隔线以内时两者都不绘制。
2026-09-29 21:57:23 +08:00
fanlusky
0f627ef41d
feat(ui): Card 支持按圆角裁剪的背景图
...
Card::SetBackgroundImage 在底色之上、边框和子元素之下绘制图片,支持 Fill / Uniform / UniformToFill 与不透明度。ImageStretch 从 Controls.h 移到 Layout.h,供 Card 和 Image 共用。
2026-09-28 19:36:37 +08:00
fanlusky
7bbb9042fc
perf(ui): 缓存卡片阴影、TextBlock 字体格式和候选列表文字度量
...
- Card:每帧为每道阴影新建离屏位图、画刷和高斯模糊特效。改为把全部阴影
合成到一张位图,按尺寸、圆角、DPI、阴影参数和 render target 复用;
尺寸不变的重绘(选中项移动、译文与云候选补齐)直接贴图。合成失败时仍
走原来的逐帧绘制。
- TextBlock:每次测量都新建 IDWriteTextFormat,自定义回退字体还要把系统
回退表整份复制进新 builder。格式与文字、光标无关,改为只在字体、字号、
对齐或回退字体变化时重建。
- CandidateList:一帧里会测量多次(自然尺寸、保留尺寸、按最终宽度排版),
每次都为每段文字新建 DirectWrite layout,一页九项每键约一两百个。文字
宽高只取决于文字、字号、宽度和字体,改为记忆化,字体或外观变化时清空,
超过上限整体重来。空的辅助码和译文不再创建 layout。
2026-09-27 15:03:16 +08:00
fanlusky
7d66b2556c
feat(server,ui,ui-html): 候选翻译文本支持在皮肤中单独配色
...
外部皮肤 skin.toml 的 [candidate.dark] / [candidate.light] 新增 translation 键。
不写时沿用候选文字色叠 62% 不透明度;写了就按原值绘制(含选中行)。
D2D(CandidateList::Appearance::translationColor)、WebView2 注入 CSS
和设置页外部皮肤预览三处一致;预览顺带补上此前漏掉的 number 配色。
2026-09-26 23:38:37 +08:00
fanlusky
0b4d9172f8
feat(ui): CandidateList 让贴着列表四角的项使用外框圆角
...
Appearance 新增 outerCornerRadius 与 outerTopCornersEnabled:选中或悬停的
填充里,真正落在列表四角上的角改用外框半径,其余角保持 cornerRadius。
既支持内缩高亮与外框同 R,也支持整行铺满、只在外框四角处贴合的皮肤。
2026-09-26 21:49:04 +08:00
fanlusky
a54e2e08e8
fix(ui): 候选窗高亮行的辅助码与翻译跟随选中文字色
...
微信绿皮肤下高亮行的辅助码压在 #07C160 绿底上仍是暗色,与 webview 不一致。
候选行绘制里 rowTextSelected/rowLabelSelected 只覆盖候选文字和序号,辅助码
(annotation)和翻译一直无条件使用 appearance_.annotationColor。而皮肤 CSS 里
这两者是 .text 的子节点(.cand-content / .cand-translation),颜色继承自 .text,
选中行的 `.first .text { color: ... }` 会一并覆盖它们——D2D 端分开绘制,这层继承
关系就丢了。
改为在高亮行显式跟随 rowTextSelected,翻译再乘 CSS 的 opacity .62 保持原有观感。
判据是 rowTextSelected 的 alpha,所以各皮肤自动与各自 CSS 对齐:wechat 与
willow_green 白色,graphite #111827/#f1f3f5,fluent 没有 .first .text 覆盖,
沿用普通文字色不变。
2026-09-14 14:45:11 +08:00
fanlusky
ee5b50133f
fix(ui): 竖排候选窗选中项高亮铺满整行
...
d2d 渲染下,竖排候选窗被卡片最小宽度撑大时,候选项的自然宽度小于卡片内宽,
选中高亮与命中区域只覆盖到文字宽度,右侧留下大片空白(候选项较长、宽度超过
卡片最小宽度时表现正常)。
根因:候选项行矩形取自按自然宽度测量得到的 itemGeometry。列表虽被拉伸到卡片
内宽,但绘制前 Present 阶段会以窗口宽度重新测量,把每项宽度还原为自然宽度,而
此时排布命中缓存(矩形未变)被跳过,铺满逻辑无法重新生效。
改为在 ItemRect 中直接以列表最终布局宽度 bounds_ 计算竖排行矩形,不再依赖逐项
自然宽度,绘制与命中同时受益,且不受测量/排布缓存影响。右侧留白由卡片内边距
提供,与左侧保持一致。横排路径不变。
新增 GetItemBounds 访问器与三个回归测试,其中一个复刻了 Present 重新测量的时序,
可捕获此前方案的退化。
2026-09-14 02:04:58 +08:00
古明四季
42bfd9fc49
fix(ui): 修复候选列表溢出与换行后的点击区域
2026-09-11 23:34:57 +08:00
Jia Sui
bd7cf1114d
fix(server): D2D 内置皮肤补齐 light 配色,对齐 WebView2 CSS
...
Signed-off-by: Jia Sui <jsfaint@gmail.com >
2026-09-11 22:19:24 +08:00
Aegon8719
dea9292814
issue-55 候选窗支持可配置的有序回落字体
2026-09-09 18:03:56 +08:00
Evan
42238a2af6
style: 用 .clang-format 重排 server / windows / ui / log
...
一次性重排,无任何行为改动。四个目录各自的 .clang-format 放在仓库里已久,但全组织只有
MSIME-Linux 在 CI 里执行 clang-format 检查,这边 149 个文件里有 149 个不符合自己声明的风格。
已逐文件核对语义等价:去掉空白、注释与相邻字符串字面量拆分之后,全部 149 个文件与重排前逐字节
相同。差异只有三类——缩进与换行、clang-format 补的 } // namespace 结尾注释、以及长字符串被拆成
相邻字面量(C++ 保证自动拼接)。
这个提交会写进 .git-blame-ignore-revs。
2026-09-06 12:13:47 +09:00
fanlusky
5421c1dd1b
Add SVG icon rendering, toggle switch, and font fallback for MenuFlyoutItem
...
MenuFlyoutItem gains leading SVG icons (ID2D1SvgDocument), an optional
trailing toggle switch, and content-based width measurement so tray-style
menu items match the HTML menu layout. Default UI font is now Noto Sans SC
with Microsoft YaHei fallback via IDWriteFontFallback; CreateTextFormat
gracefully falls back when the primary family is missing.
2026-09-02 16:03:57 +08:00
fanlusky
d16f9f3fea
Add DirectComposition hosting and candidate-list chrome for the IME window
...
Adopt an existing HWND, render through D3D11/DXGI/DirectComposition, and
extend CandidateList with horizontal layout, skin colors, click-to-commit,
and a D2D context menu. Preedit TextBlock draws a caret in a fixed insert
slot so neighboring glyphs reflow instead of using letter-spacing; the
default end caret sits slightly after the last character.
2026-09-02 15:29:14 +08:00
fanlusky
64c08a7c02
Adjust some controls for emoji panel.
2026-08-15 02:32:00 +08:00
fanlusky
3a41372f24
Adjust font size and some layouts
2026-07-15 15:50:50 +08:00
fanlusky
59a73b8476
Optimize the emoji panel size.
2026-07-15 15:43:58 +08:00
fanlusky
05a4ada19d
Optimize the emoji panel.
2026-07-15 15:34:53 +08:00
fanlusky
4f62123699
Support image render
2026-07-15 14:39:55 +08:00
fanlusky
e210c8eb4c
Allow popups to scroll out of view
2026-06-19 13:00:35 +08:00
fanlusky
d2ca118d89
Add candidate hover highlight
2026-06-19 11:52:43 +08:00
fanlusky
41f4571bd2
Add candidate popup keyboard navigation
2026-06-17 20:20:17 +08:00
fanlusky
10cfb70d66
Add candidate popup preview primitives
2026-06-17 19:08:27 +08:00
fanlusky
40eb7d297b
Cache text layouts for button and list controls
2026-06-16 16:29:24 +08:00
fanlusky
d951c0e4e6
Revert "Add keyboard navigation and menu list support"
...
This reverts commit a1d4df897e .
2026-06-14 19:57:00 +08:00
fanlusky
a1d4df897e
Add keyboard navigation and menu list support
2026-06-14 19:54:34 +08:00
fanlusky
0b8063299a
Add ContextMenuHost and right-click popup routing
2026-06-14 19:45:53 +08:00
fanlusky
84b6636f89
Add ComboBox built on the popup overlay system
2026-06-14 19:41:58 +08:00
fanlusky
10b7b94c29
Add popup host and scene overlay popup system
2026-06-14 19:35:51 +08:00
fanlusky
6bb9ca27d8
Add more gui controls, make caret of search box align center in vertical.
2026-06-12 23:48:02 +08:00
fanlusky
f183070834
Add some basic controls
2026-06-12 22:42:35 +08:00
fanlusky
88f36a0ed9
Fix the issue with DPI conversion.
2026-06-12 15:03:39 +08:00
fanlusky
f58839114c
Build the basic framework of the project.
2026-06-12 10:03:15 +08:00