summaryrefslogtreecommitdiffstats
path: root/src/input.rs
blob: d99e7cbc4f5dcef5d033899d3ff8fae107ff78c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/// Holds a string typed by the user and the cursor position.
/// Methods allow mutation of this string and movement of the cursor.
#[derive(Clone)]
pub struct Input {
    pub string: String,
    pub cursor_index: usize,
}

impl Default for Input {
    fn default() -> Self {
        Self {
            string: "".to_owned(),
            cursor_index: 0,
        }
    }
}

impl Input {
    /// Empty the string and move the cursor to start.
    pub fn reset(&mut self) {
        self.string.clear();
        self.cursor_index = 0;
    }

    /// Move the cursor to the start
    pub fn cursor_start(&mut self) {
        self.cursor_index = 0;
    }

    /// Move the cursor to the end
    pub fn cursor_end(&mut self) {
        self.cursor_index = self.string.len();
    }

    /// Move the cursor left if possible
    pub fn cursor_left(&mut self) {
        if self.cursor_index > 0 {
            self.cursor_index -= 1
        }
    }

    /// Move the cursor right if possible
    pub fn cursor_right(&mut self) {
        if self.cursor_index < self.string.len() {
            self.cursor_index += 1
        }
    }

    /// Backspace, delete the char under the cursor and move left
    pub fn delete_char_left(&mut self) {
        if self.cursor_index > 0 && !self.string.is_empty() {
            self.string.remove(self.cursor_index - 1);
            self.cursor_index -= 1;
        }
    }

    /// Delete all chars right to the cursor
    pub fn delete_chars_right(&mut self) {
        self.string = self
            .string
            .chars()
            .into_iter()
            .take(self.cursor_index)
            .collect();
    }

    /// Insert a char into the string at cursor index.
    pub fn insert(&mut self, c: char) {
        self.string.insert(self.cursor_index, c);
        self.cursor_index += 1
    }

    /// replace the string with the content
    pub fn replace(&mut self, content: String) {
        self.string = content
    }
}