diff options
| author | 2023-03-04 05:37:11 +0100 | |
|---|---|---|
| committer | 2023-03-04 05:37:11 +0100 | |
| commit | 3a0d34c0240f4421737a6a08761f99d6f8140d02 (patch) | |
| tree | c9a4a6b8e9c1db1b8fcd05bc98e3f131d5ef4bd5 /widget/src/text_input/editor.rs | |
| parent | c54409d1711e1f615c7ea4b02c082954e340632a (diff) | |
| download | iced-3a0d34c0240f4421737a6a08761f99d6f8140d02.tar.gz iced-3a0d34c0240f4421737a6a08761f99d6f8140d02.tar.bz2 iced-3a0d34c0240f4421737a6a08761f99d6f8140d02.zip | |
Create `iced_widget` subcrate and re-organize the whole codebase
Diffstat (limited to 'widget/src/text_input/editor.rs')
| -rw-r--r-- | widget/src/text_input/editor.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/widget/src/text_input/editor.rs b/widget/src/text_input/editor.rs new file mode 100644 index 00000000..f1fd641f --- /dev/null +++ b/widget/src/text_input/editor.rs @@ -0,0 +1,70 @@ +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) { + if let Some((left, right)) = self.cursor.selection(self.value) { + self.cursor.move_left(self.value); + self.value.remove_many(left, right); + } + + 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(); + if let Some((left, right)) = self.cursor.selection(self.value) { + self.cursor.move_left(self.value); + self.value.remove_many(left, right); + } + + 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(self.value) { + Some((start, end)) => { + self.cursor.move_left(self.value); + self.value.remove_many(start, end); + } + None => { + let start = self.cursor.start(self.value); + + if start > 0 { + self.cursor.move_left(self.value); + self.value.remove(start - 1); + } + } + } + } + + pub fn delete(&mut self) { + match self.cursor.selection(self.value) { + Some(_) => { + self.backspace(); + } + None => { + let end = self.cursor.end(self.value); + + if end < self.value.len() { + self.value.remove(end); + } + } + } + } +} |
