diff options
| author | 2020-03-24 20:51:22 +0100 | |
|---|---|---|
| committer | 2020-03-24 20:51:22 +0100 | |
| commit | 6c47a40730938fb59aa7fb738b460dd37f756766 (patch) | |
| tree | 6d379676d180a53458ebc54179a47a7b07fae279 /native/src | |
| parent | 28382a47d3abd4f79064b610f1a2eca478a08595 (diff) | |
| download | iced-6c47a40730938fb59aa7fb738b460dd37f756766.tar.gz iced-6c47a40730938fb59aa7fb738b460dd37f756766.tar.bz2 iced-6c47a40730938fb59aa7fb738b460dd37f756766.zip | |
Create `text_input::Editor` to hold editing logic
Diffstat (limited to 'native/src')
| -rw-r--r-- | native/src/widget/text_input.rs | 78 | ||||
| -rw-r--r-- | native/src/widget/text_input/editor.rs | 80 | 
2 files changed, 103 insertions, 55 deletions
| diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 7e77b76a..9fc7c6e6 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -4,6 +4,7 @@  //!  //! [`TextInput`]: struct.TextInput.html  //! [`State`]: struct.State.html +mod editor;  mod value;  pub mod cursor; @@ -11,6 +12,8 @@ pub mod cursor;  pub use cursor::Cursor;  pub use value::Value; +use editor::Editor; +  use crate::{      input::{          keyboard, @@ -333,18 +336,12 @@ where                      && self.state.is_pasting.is_none()                      && !c.is_control() =>              { -                match self.state.cursor.selection() { -                    Some((left, right)) => { -                        self.value.remove_many(left, right); -                        self.state.cursor.move_left(&self.value); -                    } -                    _ => (), -                } +                let mut editor = +                    Editor::new(&mut self.value, &mut self.state.cursor); -                self.value.insert(self.state.cursor.end(&self.value), c); -                self.state.cursor.move_right(&self.value); +                editor.insert(c); -                let message = (self.on_change)(self.value.to_string()); +                let message = (self.on_change)(editor.contents());                  messages.push(message);              }              Event::Keyboard(keyboard::Event::Input { @@ -358,39 +355,21 @@ where                      }                  }                  keyboard::KeyCode::Backspace => { -                    match self.state.cursor.selection() { -                        Some((start, end)) => { -                            self.value.remove_many(start, end); -                            self.state.cursor.move_left(&self.value); -                        } -                        None => { -                            let start = self.state.cursor.start(&self.value); +                    let mut editor = +                        Editor::new(&mut self.value, &mut self.state.cursor); -                            if start > 0 { -                                self.state.cursor.move_left(&self.value); +                    editor.backspace(); -                                let _ = self.value.remove(start - 1); -                            } -                        } -                    } -                    let message = (self.on_change)(self.value.to_string()); +                    let message = (self.on_change)(editor.contents());                      messages.push(message);                  }                  keyboard::KeyCode::Delete => { -                    match self.state.cursor.selection() { -                        Some((start, end)) => { -                            self.value.remove_many(start, end); -                            self.state.cursor.move_left(&self.value); -                        } -                        None => { -                            let end = self.state.cursor.end(&self.value); +                    let mut editor = +                        Editor::new(&mut self.value, &mut self.state.cursor); -                            if end < self.value.len() { -                                let _ = self.value.remove(end); -                            } -                        } -                    } -                    let message = (self.on_change)(self.value.to_string()); +                    editor.delete(); + +                    let message = (self.on_change)(editor.contents());                      messages.push(message);                  }                  keyboard::KeyCode::Left => { @@ -462,28 +441,17 @@ where                                  }                              }; -                            match self.state.cursor.selection() { -                                Some((left, right)) => { -                                    self.value.remove_many(left, right); -                                    self.state.cursor.move_left(&self.value); -                                } -                                _ => (), -                            } - -                            self.value.insert_many( -                                self.state.cursor.end(&self.value), -                                content.clone(), +                            let mut editor = Editor::new( +                                &mut self.value, +                                &mut self.state.cursor,                              ); -                            self.state.cursor.move_right_by_amount( -                                &self.value, -                                content.len(), -                            ); -                            self.state.is_pasting = Some(content); +                            editor.paste(content.clone()); -                            let message = -                                (self.on_change)(self.value.to_string()); +                            let message = (self.on_change)(editor.contents());                              messages.push(message); + +                            self.state.is_pasting = Some(content);                          }                      } else {                          self.state.is_pasting = None; diff --git a/native/src/widget/text_input/editor.rs b/native/src/widget/text_input/editor.rs new file mode 100644 index 00000000..de235d52 --- /dev/null +++ b/native/src/widget/text_input/editor.rs @@ -0,0 +1,80 @@ +use crate::text_input::{Cursor, Value}; + +pub struct Editor<'a> { +    value: &'a mut Value, +    cursor: &'a mut Cursor, +} + +impl<'a> Editor<'a> { +    pub fn new(value: &'a mut Value, cursor: &'a mut Cursor) -> Editor<'a> { +        Editor { value, cursor } +    } + +    pub fn contents(&self) -> String { +        self.value.to_string() +    } + +    pub fn insert(&mut self, character: char) { +        match self.cursor.selection() { +            Some((left, right)) => { +                self.value.remove_many(left, right); +                self.cursor.move_left(&self.value); +            } +            _ => (), +        } + +        self.value.insert(self.cursor.end(&self.value), character); +        self.cursor.move_right(&self.value); +    } + +    pub fn paste(&mut self, content: Value) { +        let length = content.len(); + +        match self.cursor.selection() { +            Some((left, right)) => { +                self.value.remove_many(left, right); +                self.cursor.move_left(&self.value); +            } +            _ => (), +        } + +        self.value +            .insert_many(self.cursor.end(&self.value), content); + +        self.cursor.move_right_by_amount(&self.value, length); +    } + +    pub fn backspace(&mut self) { +        match self.cursor.selection() { +            Some((start, end)) => { +                self.value.remove_many(start, end); +                self.cursor.move_left(&self.value); +            } +            None => { +                let start = self.cursor.start(&self.value); + +                if start > 0 { +                    self.cursor.move_left(&self.value); + +                    let _ = self.value.remove(start - 1); +                } +            } +        } +    } + +    pub fn delete(&mut self) { +        match self.cursor.selection() { +            Some((start, end)) => { +                self.value.remove_many(start, end); +                self.cursor.move_left(&self.value); +            } +            None => { +                let end = self.cursor.end(&self.value); + +                if end < self.value.len() { +                    let _ = self.value.remove(end); +                } +            } +        } +    } +} | 
