Files
qingjian/apps/windows/server/src/dispatch/key/codes.rs
T
yenharvey 61ca4b4150 feat: 符号面板加「翻译」组,删掉 Windows 的整句候选翻译
- 整句候选翻译译的是猜出来的候选,猜错就白发;改成用户在面板的框里自己打一句、停键后再译,整句只发确认过的内容
- 翻译组排在最前,每种目标语言算一个分类([ ] 换),打拼音时按 ↑ 直接落在这组;没在打字时 [shortcut] translate_panel(Ctrl+Alt+Y / ⌃⌥Y)打开
- Core panel/translate:原文带光标,停键 800 ms、两个字以上才发,内容没变不重发,没翻出来 2 秒后自动重试一次、再失败等回车;译文按原文 + 语言缓存在内存(换提供方清空),不落盘
- 译文放进应用的 preedit:Windows 译文靠轮询送到,DLL 记着写进文档的组句文字,变了就补一次编辑会话;行内不显示拼音的设置下也照样放
- 框的排版抽成 bamboo-slip 的 TextFlow,与设置程序的 TextField 共用;面板不是 Ui 搭的,布局后按各字位置给出 PanelHit::Caret
- [predict] sentence_translation 不再认(旧配置里写着不报错),两个设置程序的开关与文档一并去掉;生词本整句翻译保留
- Windows dispatch/composed/mod.rs 超了 800 行,按联想、导航、出帧拆开
- 初音主题当前分组胶囊改纯色
2026-11-04 16:18:39 +08:00

59 lines
1.8 KiB
Rust

//! 按键分派用的虚拟键码与字符解析。
use qingjian_platform::protocol::KeyEvent;
use crate::dispatch::Router;
impl Router {
pub(super) fn page_step(&self, event: &KeyEvent) -> Option<isize> {
page_key(event, self.config.page_keys)
.or_else(|| self.config.extra_page_keys.step(event.character?))
}
}
pub(crate) const BACK: u32 = 0x08;
pub(crate) const TAB: u32 = 0x09;
pub(crate) const RETURN: u32 = 0x0D;
pub(crate) const ESCAPE: u32 = 0x1B;
pub(crate) const PRIOR: u32 = 0x21;
pub(crate) const NEXT: u32 = 0x22;
pub(crate) const END: u32 = 0x23;
pub(crate) const HOME: u32 = 0x24;
pub(crate) const LEFT: u32 = 0x25;
pub(crate) const UP: u32 = 0x26;
pub(crate) const RIGHT: u32 = 0x27;
pub(crate) const DOWN: u32 = 0x28;
pub(crate) const DELETE: u32 = 0x2E;
/// 翻页键对 `(上一页, 下一页)`:返回 -1 / +1。
pub(crate) fn page_key(event: &KeyEvent, page_keys: (char, char)) -> Option<isize> {
let c = event.character?;
if c == page_keys.0 {
Some(-1)
} else if c == page_keys.1 {
Some(1)
} else {
None
}
}
/// 敲出来是数字 1–9 的键(选候选用):按 `character` 认,Shift 出的 `!@#` 不算。
pub(crate) fn digit(event: &KeyEvent) -> Option<usize> {
match event.character {
Some(c) => ('1'..='9').contains(&c).then(|| c as usize - '0' as usize),
None => digit_key(event.virtual_key),
}
}
/// 主键盘区数字键 1–9 的键码,不管修饰键(修饰键 + 数字的快捷键按键位认)。
pub(crate) fn digit_key(virtual_key: u32) -> Option<usize> {
(0x31..=0x39)
.contains(&virtual_key)
.then(|| (virtual_key - 0x30) as usize)
}
/// 小键盘区的键(数字与 `* + - . /`):敲出来的标点一律半角。
pub(crate) fn is_keypad(virtual_key: u32) -> bool {
(0x60..=0x6F).contains(&virtual_key)
}