mirror of
https://github.com/qingjian-team/qingjian.git
synced 2026-11-06 08:13:51 +00:00
- 整句候选翻译译的是猜出来的候选,猜错就白发;改成用户在面板的框里自己打一句、停键后再译,整句只发确认过的内容 - 翻译组排在最前,每种目标语言算一个分类([ ] 换),打拼音时按 ↑ 直接落在这组;没在打字时 [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 行,按联想、导航、出帧拆开 - 初音主题当前分组胶囊改纯色
59 lines
1.8 KiB
Rust
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)
|
|
}
|