makepad_widget/
plaineditor.rs

1use 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                // output current line
73                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