duat_core/mode/
commander.rs

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
78
79
80
81
82
83
84
use super::{Cursors, EditHelper, KeyCode, KeyEvent, KeyMod, Mode, key};
use crate::{data::RwData, text::Point, ui::Ui, widgets::CmdLine};

#[derive(Clone)]
pub struct Command;

impl<U: Ui> Mode<U> for Command {
    type Widget = CmdLine<U>;

    fn send_key(
        &mut self,
        key: KeyEvent,
        widget: &RwData<Self::Widget>,
        area: &U::Area,
        cursors: &mut Cursors,
    ) {
        cursors.make_excl();
        let mut helper = EditHelper::new(widget, area, cursors);

        match key {
            key!(KeyCode::Backspace) => {
                helper.move_main(|mut m| {
                    m.set_anchor();
                    m.move_hor(-1);
                });
                helper.edit_main(|e| e.replace(""));
                helper.move_main(|mut m| {
                    m.unset_anchor();
                });
            }
            key!(KeyCode::Delete) => {
                helper.move_main(|mut m| {
                    m.set_anchor();
                    m.move_hor(1);
                });
                helper.edit_main(|e| {
                    e.replace("");
                });
                helper.move_main(|mut m| {
                    m.unset_anchor();
                });
            }

            key!(KeyCode::Char(char)) => {
                helper.edit_main(|e| e.insert(char));
                helper.move_main(|mut m| m.move_hor(1));
            }
            key!(KeyCode::Char(char), KeyMod::SHIFT) => {
                helper.edit_main(|e| e.insert(char));
                helper.move_main(|mut m| m.move_hor(1));
            }

            key!(KeyCode::Left) => {
                helper.move_main(|mut m| {
                    m.unset_anchor();
                    m.move_hor(-1)
                });
            }
            key!(KeyCode::Right) => {
                helper.move_main(|mut m| {
                    m.unset_anchor();
                    m.move_hor(1)
                });
            }

            key!(KeyCode::Esc) => {
                let p = helper.text_len();
                helper.move_main(|mut m| {
                    m.move_to(Point::default());
                    m.set_anchor();
                    m.move_to(p);
                });
                helper.edit_main(|e| e.replace(""));
                cursors.clear();
                super::reset();
            }
            key!(KeyCode::Enter) => {
                cursors.clear();
                super::reset();
            }
            _ => {}
        }
    }
}