A simple CPU rendered GUI IDE experience.
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
use std::sync::Arc;

use rust_fsm::StateMachine;
use winit::event::MouseButton;
use winit::window::Window;

use crate::edi::*;
impl Editor {
    pub fn click(
        &mut self,
        bt: MouseButton,
        cursor_position: (usize, usize),
        w: Arc<dyn Window>,
    ) {
        let text = &mut self.text;
        _ = self
            .requests
            .complete
            .consume(CompletionAction::Click)
            .unwrap();
        match self.state.consume(Action::M(bt)).unwrap() {
            Some(Do::MoveCursor) => {
                text.cursor.just(
                    text.mapped_index_at(cursor_position),
                    &text.rope,
                );
                if let Some((lsp, path)) = lsp!(self + p) {
                    if self.requests.sig_help.result.is_some() {
                        self.requests.sig_help.request(lsp.runtime.spawn(
                            lsp.request_sig_help(
                                path,
                                text.primary_cursor(),
                            ),
                        ));
                    }
                }
                self.hist.lc = text.cursor.clone();
                self.chist.push(text.primary_cursor());
                text.cursor.first().setc(&text.rope);
                self.refresh_document_highlights();
            }
            Some(Do::NavForward) => self.nav_forward(),
            Some(Do::NavBack) => self.nav_back(),
            Some(Do::ExtendSelectionToMouse) => {
                let p = text.mapped_index_at(cursor_position);
                text.cursor.first_mut().extend_selection_to(p, &text.rope);
            }
            Some(Do::StartSelection) => {
                let p = text.mapped_index_at(cursor_position);

                let x = *text.cursor.first();
                text.cursor.first_mut().sel = Some((x..x).into());
                text.cursor.first_mut().extend_selection_to(p, &text.rope);
                self.hist.lc = text.cursor.clone();
            }
            Some(Do::GoToDefinition) => {
                if let Some(x) = self.requests.def.result.clone()
                    && let Err(e) = self.go(&x, w.clone())
                {
                    log::error!("gtd: {e}");
                }
            }
            Some(Do::InsertCursorAtMouse) => {
                text.cursor.add(
                    text.mapped_index_at(cursor_position),
                    &text.rope,
                );
                self.hist.lc = text.cursor.clone();
                self.chist.push(text.primary_cursor());
                text.cursor.first().setc(&text.rope);
            }
            None => {}
            _ => unreachable!(),
        }
    }
}