diff options
author | 2025-02-03 02:33:40 +0100 | |
---|---|---|
committer | 2025-02-03 02:33:40 +0100 | |
commit | c83809adb907498ba2a573ec9fb50936601ac8fc (patch) | |
tree | 5009581a507014cda6850f0780bd315108d56bdd /core | |
parent | 3a35fd6249eeb324379d3a14b020ccc48ec16fb4 (diff) | |
download | iced-c83809adb907498ba2a573ec9fb50936601ac8fc.tar.gz iced-c83809adb907498ba2a573ec9fb50936601ac8fc.tar.bz2 iced-c83809adb907498ba2a573ec9fb50936601ac8fc.zip |
Implement basic IME selection in `Preedit` overlay
Diffstat (limited to 'core')
-rw-r--r-- | core/src/input_method.rs | 47 | ||||
-rw-r--r-- | core/src/text.rs | 17 |
2 files changed, 59 insertions, 5 deletions
diff --git a/core/src/input_method.rs b/core/src/input_method.rs index b25f29aa..f10a1c3b 100644 --- a/core/src/input_method.rs +++ b/core/src/input_method.rs @@ -23,10 +23,50 @@ pub enum InputMethod<T = String> { /// Ideally, your widget will show pre-edits on-the-spot; but, since that can /// be tricky, you can instead provide the current pre-edit here and the /// runtime will display it as an overlay (i.e. "Over-the-spot IME"). - preedit: Option<T>, + preedit: Option<Preedit<T>>, }, } +/// The pre-edit of an [`InputMethod`]. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct Preedit<T = String> { + /// The current content. + pub content: T, + /// The selected range of the content. + pub selection: Option<Range<usize>>, +} + +impl<T> Preedit<T> { + /// Creates a new empty [`Preedit`]. + pub fn new() -> Self + where + T: Default, + { + Self::default() + } + + /// Turns a [`Preedit`] into its owned version. + pub fn to_owned(&self) -> Preedit + where + T: AsRef<str>, + { + Preedit { + content: self.content.as_ref().to_owned(), + selection: self.selection.clone(), + } + } +} + +impl Preedit { + /// Borrows the contents of a [`Preedit`]. + pub fn as_ref(&self) -> Preedit<&str> { + Preedit { + content: &self.content, + selection: self.selection.clone(), + } + } +} + /// The purpose of an [`InputMethod`]. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum Purpose { @@ -84,10 +124,7 @@ impl InputMethod { *self = Self::Open { position: *position, purpose: *purpose, - preedit: preedit - .as_ref() - .map(AsRef::as_ref) - .map(str::to_owned), + preedit: preedit.as_ref().map(Preedit::to_owned), }; } InputMethod::Allowed diff --git a/core/src/text.rs b/core/src/text.rs index c144fd24..8dde9e21 100644 --- a/core/src/text.rs +++ b/core/src/text.rs @@ -270,6 +270,23 @@ pub struct Span<'a, Link = (), Font = crate::Font> { pub strikethrough: bool, } +impl<Link, Font> Default for Span<'_, Link, Font> { + fn default() -> Self { + Self { + text: Cow::default(), + size: None, + line_height: None, + font: None, + color: None, + link: None, + highlight: None, + padding: Padding::default(), + underline: false, + strikethrough: false, + } + } +} + /// A text highlight. #[derive(Debug, Clone, Copy, PartialEq)] pub struct Highlight { |