diff options
-rw-r--r-- | core/src/widget/text_input.rs | 11 | ||||
-rw-r--r-- | native/src/widget/text_input.rs | 8 |
2 files changed, 19 insertions, 0 deletions
diff --git a/core/src/widget/text_input.rs b/core/src/widget/text_input.rs index 9c7f4bc8..c4ca0abc 100644 --- a/core/src/widget/text_input.rs +++ b/core/src/widget/text_input.rs @@ -91,6 +91,13 @@ impl State { Self::default() } + pub fn focused(value: &str) -> Self { + Self { + is_focused: true, + cursor_position: Value::new(value).len(), + } + } + pub fn move_cursor_right(&mut self, value: &Value) { let current = self.cursor_position(value); @@ -107,6 +114,10 @@ impl State { } } + pub fn move_cursor_to_end(&mut self, value: &Value) { + self.cursor_position = value.len(); + } + pub fn cursor_position(&self, value: &Value) -> usize { self.cursor_position.min(value.len()) } diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 7e81e257..35e10000 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -11,6 +11,10 @@ where Renderer: self::Renderer, Message: Clone + std::fmt::Debug, { + fn width(&self) -> Length { + self.width + } + fn layout( &self, renderer: &Renderer, @@ -46,6 +50,10 @@ where }) => { self.state.is_focused = layout.bounds().contains(cursor_position); + + if self.state.cursor_position(&self.value) == 0 { + self.state.move_cursor_to_end(&self.value); + } } Event::Keyboard(keyboard::Event::CharacterReceived(c)) if self.state.is_focused && !c.is_control() => |