Implement basic IME selection in Preedit overlay

This commit is contained in:
Héctor Ramón Jiménez 2025-02-03 02:33:40 +01:00
parent 3a35fd6249
commit c83809adb9
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
5 changed files with 180 additions and 42 deletions

View file

@ -55,6 +55,7 @@ use std::borrow::Cow;
use std::cell::RefCell;
use std::fmt;
use std::ops::DerefMut;
use std::ops::Range;
use std::sync::Arc;
pub use text::editor::{Action, Edit, Line, LineEnding, Motion};
@ -365,7 +366,7 @@ where
InputMethod::Open {
position,
purpose: input_method::Purpose::Normal,
preedit: Some(preedit),
preedit: Some(preedit.as_ref()),
}
}
}
@ -496,7 +497,7 @@ where
#[derive(Debug)]
pub struct State<Highlighter: text::Highlighter> {
focus: Option<Focus>,
preedit: Option<String>,
preedit: Option<input_method::Preedit>,
last_click: Option<mouse::Click>,
drag_click: Option<mouse::click::Kind>,
partial_scroll: f32,
@ -751,11 +752,15 @@ where
}
Update::InputMethod(update) => match update {
Ime::Toggle(is_open) => {
state.preedit = is_open.then(String::new);
state.preedit =
is_open.then(input_method::Preedit::new);
}
Ime::Preedit(text) => {
Ime::Preedit { content, selection } => {
if state.focus.is_some() {
state.preedit = Some(text);
state.preedit = Some(input_method::Preedit {
content,
selection,
});
}
}
Ime::Commit(text) => {
@ -1202,7 +1207,10 @@ enum Update<Message> {
enum Ime {
Toggle(bool),
Preedit(String),
Preedit {
content: String,
selection: Option<Range<usize>>,
},
Commit(String),
}
@ -1272,8 +1280,11 @@ impl<Message> Update<Message> {
input_method::Event::Opened
))))
}
input_method::Event::Preedit(content, _range) => {
Some(Update::InputMethod(Ime::Preedit(content)))
input_method::Event::Preedit(content, selection) => {
Some(Update::InputMethod(Ime::Preedit {
content,
selection,
}))
}
input_method::Event::Commit(content) => {
Some(Update::InputMethod(Ime::Commit(content)))

View file

@ -440,7 +440,7 @@ where
} else {
input_method::Purpose::Normal
},
preedit: Some(preedit),
preedit: Some(preedit.as_ref()),
}
}
@ -1256,13 +1256,16 @@ where
state.is_ime_open =
matches!(event, input_method::Event::Opened)
.then(String::new);
.then(input_method::Preedit::new);
}
input_method::Event::Preedit(content, _range) => {
input_method::Event::Preedit(content, selection) => {
let state = state::<Renderer>(tree);
if state.is_focused.is_some() {
state.is_ime_open = Some(content.to_owned());
state.is_ime_open = Some(input_method::Preedit {
content: content.to_owned(),
selection: selection.clone(),
});
}
}
input_method::Event::Commit(text) => {
@ -1514,7 +1517,7 @@ pub struct State<P: text::Paragraph> {
placeholder: paragraph::Plain<P>,
icon: paragraph::Plain<P>,
is_focused: Option<Focus>,
is_ime_open: Option<String>,
is_ime_open: Option<input_method::Preedit>,
is_dragging: bool,
is_pasting: Option<Value>,
last_click: Option<mouse::Click>,