diff options
author | 2019-12-21 05:30:48 +0100 | |
---|---|---|
committer | 2019-12-21 05:30:48 +0100 | |
commit | 36e7ac2048a680ac0830dbbacad4bcf7b1f72ead (patch) | |
tree | 4cba80ceaef26215058ac0313c8bf2271084f1a2 /native | |
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 'native')
-rw-r--r-- | native/src/renderer/null.rs | 10 | ||||
-rw-r--r-- | native/src/widget/text_input.rs | 55 |
2 files changed, 48 insertions, 17 deletions
diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs index 02f033a5..43076d61 100644 --- a/native/src/renderer/null.rs +++ b/native/src/renderer/null.rs @@ -93,6 +93,16 @@ impl text_input::Renderer for Null { 0.0 } + fn offset( + &self, + _text_bounds: Rectangle, + _size: u16, + _value: &text_input::Value, + _state: &text_input::State, + ) -> f32 { + 0.0 + } + fn draw( &mut self, _bounds: Rectangle, diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 71e3d75a..fe002965 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -179,35 +179,40 @@ where button: mouse::Button::Left, state: ButtonState::Pressed, }) => { - self.state.is_focused = - layout.bounds().contains(cursor_position); + let is_clicked = layout.bounds().contains(cursor_position); - if self.state.is_focused { + if is_clicked { let text_layout = layout.children().next().unwrap(); let target = cursor_position.x - text_layout.bounds().x; - if target < 0.0 { - self.state.cursor_position = 0; - } else if self.is_secure { - self.state.cursor_position = find_cursor_position( - renderer, - target, - &self.value.secure(), - self.size.unwrap_or(renderer.default_size()), - 0, - self.value.len(), + if target > 0.0 { + let value = if self.is_secure { + self.value.secure() + } else { + self.value.clone() + }; + + let size = self.size.unwrap_or(renderer.default_size()); + + let offset = renderer.offset( + text_layout.bounds(), + size, + &value, + &self.state, ); - } else { + self.state.cursor_position = find_cursor_position( renderer, - target, - &self.value, - self.size.unwrap_or(renderer.default_size()), + target + offset, + &value, + size, 0, self.value.len(), ); } } + + self.state.is_focused = is_clicked; } Event::Keyboard(keyboard::Event::CharacterReceived(c)) if self.state.is_focused @@ -392,6 +397,22 @@ pub trait Renderer: crate::Renderer + Sized { /// [`TextInput`]: struct.TextInput.html fn measure_value(&self, value: &str, size: u16) -> f32; + /// Returns the current horizontal offset of the value of the + /// [`TextInput`]. + /// + /// This is the amount of horizontal scrolling applied when the [`Value`] + /// does not fit the [`TextInput`]. + /// + /// [`TextInput`]: struct.TextInput.html + /// [`Value`]: struct.Value.html + fn offset( + &self, + text_bounds: Rectangle, + size: u16, + value: &Value, + state: &State, + ) -> f32; + /// Draws a [`TextInput`]. /// /// It receives: |