diff options
author | 2019-12-21 05:30:48 +0100 | |
---|---|---|
committer | 2019-12-21 05:30:48 +0100 | |
commit | 36e7ac2048a680ac0830dbbacad4bcf7b1f72ead (patch) | |
tree | 4cba80ceaef26215058ac0313c8bf2271084f1a2 /wgpu | |
parent | 453d2d5bb0069904256cd88f07b0d0e9935e4e0a (diff) | |
download | iced-36e7ac2048a680ac0830dbbacad4bcf7b1f72ead.tar.gz iced-36e7ac2048a680ac0830dbbacad4bcf7b1f72ead.tar.bz2 iced-36e7ac2048a680ac0830dbbacad4bcf7b1f72ead.zip |
Fix cursor positioning in `TextInput` on overflow
Diffstat (limited to 'wgpu')
-rw-r--r-- | wgpu/src/renderer/widget/text_input.rs | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/wgpu/src/renderer/widget/text_input.rs b/wgpu/src/renderer/widget/text_input.rs index c6c64b88..929f94db 100644 --- a/wgpu/src/renderer/widget/text_input.rs +++ b/wgpu/src/renderer/widget/text_input.rs @@ -30,6 +30,28 @@ impl text_input::Renderer for Renderer { width } + fn offset( + &self, + text_bounds: Rectangle, + size: u16, + value: &text_input::Value, + state: &text_input::State, + ) -> f32 { + if state.is_focused() { + let (_, offset) = measure_cursor_and_scroll_offset( + self, + text_bounds, + value, + size, + state.cursor_position(value), + ); + + offset + } else { + 0.0 + } + } + fn draw( &mut self, bounds: Rectangle, @@ -91,11 +113,13 @@ impl text_input::Renderer for Renderer { }; let (contents_primitive, offset) = if state.is_focused() { - let text_before_cursor = - value.until(state.cursor_position(value)).to_string(); - - let text_value_width = - self.measure_value(&text_before_cursor, size); + let (text_value_width, offset) = measure_cursor_and_scroll_offset( + self, + text_bounds, + value, + size, + state.cursor_position(value), + ); let cursor = Primitive::Quad { bounds: Rectangle { @@ -112,11 +136,7 @@ impl text_input::Renderer for Renderer { Primitive::Group { primitives: vec![text_value, cursor], }, - Vector::new( - ((text_value_width + 5.0) - text_bounds.width).max(0.0) - as u32, - 0, - ), + Vector::new(offset as u32, 0), ) } else { (text_value, Vector::new(0, 0)) @@ -140,3 +160,20 @@ impl text_input::Renderer for Renderer { ) } } + +fn measure_cursor_and_scroll_offset( + renderer: &Renderer, + text_bounds: Rectangle, + value: &text_input::Value, + size: u16, + cursor_index: usize, +) -> (f32, f32) { + use iced_native::text_input::Renderer; + + let text_before_cursor = value.until(cursor_index).to_string(); + + let text_value_width = renderer.measure_value(&text_before_cursor, size); + let offset = ((text_value_width + 5.0) - text_bounds.width).max(0.0); + + (text_value_width, offset) +} |