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 行,按联想、导航、出帧拆开 - 初音主题当前分组胶囊改纯色
69 lines
2.4 KiB
Rust
69 lines
2.4 KiB
Rust
//! 鼠标点候选窗口:上屏的字挂到焦点会话上,下一拍轮询(或抢先来的键)带给 DLL;老协议的 DLL 不收点击。
|
|
|
|
use qingjian_render::HitTarget;
|
|
|
|
use crate::support::*;
|
|
|
|
fn poll(router: &mut Router, session: SessionId) -> (Frame, Option<String>) {
|
|
match router.handle(ClientMessage::Poll { session }) {
|
|
Some(ServerMessage::Update { frame, commit, .. }) => (frame, commit),
|
|
other => panic!("expected Update, got {other:?}"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn clicking_a_candidate_commits_it_on_the_next_poll() {
|
|
let mut router = router();
|
|
let (_, _, frame) = type_letters(&mut router, "nihao");
|
|
let slot = slot_of(&frame, "你好");
|
|
router.handle_click(HitTarget::Candidate(slot as usize - 1));
|
|
let (after, commit) = poll(&mut router, SESSION);
|
|
assert_eq!(commit.as_deref(), Some("你好"));
|
|
assert!(after.is_empty());
|
|
// 交出去一次就没了
|
|
assert_eq!(poll(&mut router, SESSION).1, None);
|
|
}
|
|
|
|
#[test]
|
|
fn clicking_a_translation_commits_that_sense() {
|
|
let mut router = router();
|
|
let (_, _, frame) = type_letters(&mut router, "nihao");
|
|
let slot = slot_of(&frame, "你好");
|
|
router.handle_click(HitTarget::Translation {
|
|
candidate: slot as usize - 1,
|
|
sense: 0,
|
|
});
|
|
assert_eq!(poll(&mut router, SESSION).1.as_deref(), Some("hello"));
|
|
}
|
|
|
|
#[test]
|
|
fn a_key_before_the_poll_carries_the_clicked_text() {
|
|
let mut router = router();
|
|
let (_, _, frame) = type_letters(&mut router, "nihao");
|
|
let slot = slot_of(&frame, "你好");
|
|
router.handle_click(HitTarget::Candidate(slot as usize - 1));
|
|
let (_, commit, frame) = press(&mut router, letter('w'));
|
|
assert_eq!(commit.as_deref(), Some("你好"));
|
|
assert_eq!(preedit(&frame), "w");
|
|
assert_eq!(poll(&mut router, SESSION).1, None);
|
|
}
|
|
|
|
#[test]
|
|
fn old_dlls_do_not_take_clicks() {
|
|
let mut router = router();
|
|
let old = SessionId(2);
|
|
router.handle(ClientMessage::OpenSession {
|
|
session: old,
|
|
app: None,
|
|
// 点击上屏从协议 8 起(`CLICK_SINCE`),7 是最后一版不认 `Update.commit` 的 DLL
|
|
protocol: 7,
|
|
});
|
|
for c in "nihao".chars() {
|
|
press_in(&mut router, old, letter(c));
|
|
}
|
|
router.handle_click(HitTarget::Candidate(0));
|
|
let (frame, commit) = poll(&mut router, old);
|
|
assert_eq!(commit, None);
|
|
assert_eq!(preedit(&frame), "ni'hao");
|
|
}
|