Compute grapheme index in find_cursor_position for TextInput

This commit is contained in:
Héctor Ramón Jiménez 2023-02-10 20:03:33 +01:00
parent 51844c5d0c
commit 26e902f7d8
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
2 changed files with 13 additions and 15 deletions

View file

@ -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
}
}
}
}
}

View file

@ -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;