diff options
author | 2023-02-10 20:03:33 +0100 | |
---|---|---|
committer | 2023-02-24 13:37:32 +0100 | |
commit | 26e902f7d84290f8163a25c37488d29db4fc0708 (patch) | |
tree | 2ef873ef3b827449cdfd07a74c52665a172d58ad /native | |
parent | 51844c5d0c7f7c9b65c56330862b69f0baa0e3c1 (diff) | |
download | iced-26e902f7d84290f8163a25c37488d29db4fc0708.tar.gz iced-26e902f7d84290f8163a25c37488d29db4fc0708.tar.bz2 iced-26e902f7d84290f8163a25c37488d29db4fc0708.zip |
Compute grapheme index in `find_cursor_position` for `TextInput`
Diffstat (limited to 'native')
-rw-r--r-- | native/src/text.rs | 13 | ||||
-rw-r--r-- | native/src/widget/text_input.rs | 15 |
2 files changed, 13 insertions, 15 deletions
diff --git a/native/src/text.rs b/native/src/text.rs index 1bbd36cc..4c72abc3 100644 --- a/native/src/text.rs +++ b/native/src/text.rs @@ -1,6 +1,6 @@ //! Draw and interact with text. use crate::alignment; -use crate::{Color, Point, Rectangle, Size, Vector}; +use crate::{Color, Point, Rectangle, Size}; use std::borrow::Cow; @@ -34,10 +34,6 @@ pub struct Text<'a, Font> { pub enum Hit { /// The point was within the bounds of the returned character index. CharOffset(usize), - /// The provided point was not within the bounds of a glyph. The index - /// of the character with the closest centeroid position is returned, - /// as well as its delta. - NearestCharOffset(usize, Vector), } impl Hit { @@ -45,13 +41,6 @@ impl Hit { pub fn cursor(self) -> usize { match self { Self::CharOffset(i) => i, - Self::NearestCharOffset(i, delta) => { - if delta.x > f32::EPSILON { - i + 1 - } else { - i - } - } } } } diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index f51416e1..65a9bd3b 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -1193,17 +1193,26 @@ where let size = size.unwrap_or_else(|| renderer.default_size()); let offset = offset(renderer, text_bounds, font, size, value, state); + let value = value.to_string(); - renderer + let char_offset = renderer .hit_test( - &value.to_string(), + &value, size, font, Size::INFINITY, Point::new(x + offset, text_bounds.height / 2.0), true, ) - .map(text::Hit::cursor) + .map(text::Hit::cursor)?; + + Some( + unicode_segmentation::UnicodeSegmentation::graphemes( + &value[..char_offset], + true, + ) + .count(), + ) } const CURSOR_BLINK_INTERVAL_MILLIS: u128 = 500; |