makepad_widget/
plaineditor.rs1use makepad_render::*;
2
3use crate::textbuffer::*;
4use crate::texteditor::*;
5
6#[derive(Clone)]
7pub struct PlainEditor {
8 pub text_editor: TextEditor,
9}
10
11impl PlainEditor {
12 pub fn proto(cx: &mut Cx) -> Self {
13 let editor = Self {
14 text_editor: TextEditor{
15 folding_depth: 3,
16 ..TextEditor::proto(cx)
17 }
18 };
19 editor
20 }
21
22 pub fn handle_plain_editor(&mut self, cx: &mut Cx, event: &mut Event, text_buffer: &mut TextBuffer) -> TextEditorEvent {
23 let ce = self.text_editor.handle_text_editor(cx, event, text_buffer);
24 ce
25 }
26
27 pub fn draw_plain_editor(&mut self, cx: &mut Cx, text_buffer: &mut TextBuffer) {
28 if text_buffer.needs_token_chunks() && text_buffer.lines.len() >0{
29 let mut state = TokenizerState::new(&text_buffer.lines);
30 let mut tokenizer = PlainTokenizer::new();
31 let mut pair_stack = Vec::new();
32 loop {
33 let offset = text_buffer.flat_text.len();
34 let token_type = tokenizer.next_token(&mut state, &mut text_buffer.flat_text, &text_buffer.token_chunks);
35 TokenChunk::push_with_pairing(&mut text_buffer.token_chunks, &mut pair_stack, state.next, offset, text_buffer.flat_text.len(), token_type);
36 if token_type == TokenType::Eof {
37 break
38 }
39 }
40 }
41
42 if self.text_editor.begin_text_editor(cx, text_buffer).is_err() {return}
43
44 for (index, token_chunk) in text_buffer.token_chunks.iter_mut().enumerate(){
45 self.text_editor.draw_chunk(cx, index, &text_buffer.flat_text, token_chunk, &text_buffer.messages.cursors);
46 }
47
48 self.text_editor.end_text_editor(cx, text_buffer);
49 }
50}
51
52pub struct PlainTokenizer {
53}
54
55impl PlainTokenizer {
56 pub fn new() -> PlainTokenizer {
57 PlainTokenizer {}
58 }
59
60 pub fn next_token<'a>(&mut self, state: &mut TokenizerState<'a>, chunk: &mut Vec<char>, _token_chunks: &Vec<TokenChunk>) -> TokenType {
61 let start = chunk.len();
62 loop {
63 if state.next == '\0' {
64 if (chunk.len()-start)>0 {
65 return TokenType::Identifier
66 }
67 state.advance();
68 chunk.push(' ');
69 return TokenType::Eof
70 }
71 else if state.next == '\n' {
72 if (chunk.len()-start)>0 {
74 return TokenType::Identifier
75 }
76
77 chunk.push(state.next);
78 state.advance();
79 return TokenType::Newline
80 }
81 else if state.next == ' ' {
82 if (chunk.len()-start)>0 {
83 return TokenType::Identifier
84 }
85 while state.next == ' ' {
86 chunk.push(state.next);
87 state.advance();
88 }
89 return TokenType::Whitespace
90 }
91 else {
92 chunk.push(state.next);
93 state.advance();
94 }
95 }
96 }
97}
98