diff options
author | 2019-10-31 03:50:40 +0100 | |
---|---|---|
committer | 2019-10-31 03:50:40 +0100 | |
commit | 51a0e99097f9ecb63eeb7f2ea7c38089977eb4d0 (patch) | |
tree | d6532ec8c98b80fa72e3b78a556ccf1b26b33c02 /native | |
parent | 374b54c3ecbe39a24cfa6b8eccb9b2a2098f65c7 (diff) | |
download | iced-51a0e99097f9ecb63eeb7f2ea7c38089977eb4d0.tar.gz iced-51a0e99097f9ecb63eeb7f2ea7c38089977eb4d0.tar.bz2 iced-51a0e99097f9ecb63eeb7f2ea7c38089977eb4d0.zip |
Implement cursor movement in `TextInput`
Diffstat (limited to 'native')
-rw-r--r-- | native/src/widget/text_input.rs | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 976ca995..d9837b61 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -45,28 +45,55 @@ where Event::Keyboard(keyboard::Event::CharacterReceived(c)) if self.state.is_focused && !c.is_control() => { - self.value.push(c); + let cursor_position = self.state.cursor_position(&self.value); - let message = (self.on_change)(self.value.clone()); - messages.push(message); - } - Event::Keyboard(keyboard::Event::Input { - key_code: keyboard::KeyCode::Backspace, - state: ButtonState::Pressed, - }) => { - let _ = self.value.pop(); + self.value.insert(cursor_position, c); + self.state.move_cursor_right(&self.value); - let message = (self.on_change)(self.value.clone()); + let message = (self.on_change)(self.value.to_string()); messages.push(message); } Event::Keyboard(keyboard::Event::Input { - key_code: keyboard::KeyCode::Enter, + key_code, state: ButtonState::Pressed, - }) => { - if let Some(on_submit) = self.on_submit.clone() { - messages.push(on_submit); + }) if self.state.is_focused => match key_code { + keyboard::KeyCode::Enter => { + if let Some(on_submit) = self.on_submit.clone() { + messages.push(on_submit); + } } - } + keyboard::KeyCode::Backspace => { + let cursor_position = + self.state.cursor_position(&self.value); + + if cursor_position > 0 { + self.state.move_cursor_left(&self.value); + + let _ = self.value.remove(cursor_position - 1); + + let message = (self.on_change)(self.value.to_string()); + messages.push(message); + } + } + keyboard::KeyCode::Delete => { + let cursor_position = + self.state.cursor_position(&self.value); + + if cursor_position < self.value.len() { + let _ = self.value.remove(cursor_position); + + let message = (self.on_change)(self.value.to_string()); + messages.push(message); + } + } + keyboard::KeyCode::Left => { + self.state.move_cursor_left(&self.value); + } + keyboard::KeyCode::Right => { + self.state.move_cursor_right(&self.value); + } + _ => {} + }, _ => {} } } |