diff options
Diffstat (limited to 'src/widgets/luaeditor/mod.rs')
| -rw-r--r-- | src/widgets/luaeditor/mod.rs | 96 |
1 files changed, 49 insertions, 47 deletions
diff --git a/src/widgets/luaeditor/mod.rs b/src/widgets/luaeditor/mod.rs index 6fc8436..de35c3d 100644 --- a/src/widgets/luaeditor/mod.rs +++ b/src/widgets/luaeditor/mod.rs @@ -1,25 +1,22 @@ use ratatui::{ - crossterm::event::{KeyCode, KeyEvent}, + crossterm::event::{KeyCode, KeyEvent, KeyModifiers}, style::{Style, Stylize}, text::{ToLine, ToSpan}, widgets::Widget, }; - -pub mod buffer; -pub mod theme; -pub mod treesitter; - -use buffer::Buffer; use tree_sitter_highlight::HighlightConfiguration; -use crate::cursor::CursorMove; +use crate::state::{editor::EditorState, window::Window, GlobalState}; +use crate::{cursor::CursorMove, lua}; use super::statusbar::StatusBar; +pub mod theme; +pub mod treesitter; + pub struct LuaEditor { bar: StatusBar, scroll: usize, - buffer: Buffer, highlight_config: HighlightConfiguration, } @@ -30,35 +27,53 @@ impl LuaEditor { .left(" [No Name] ") .left_style(Style::default().on_magenta()), scroll: 0, - buffer: Buffer::new(), highlight_config: treesitter::new_highlight_configuration(), } } pub fn handle_key_event(&mut self, event: KeyEvent) { match event.code { - KeyCode::Char(c) => self.buffer.insert(c), + KeyCode::Char('r') if event.modifiers == KeyModifiers::CONTROL => { + EditorState::run(&lua::get()) + } + KeyCode::Char(c) => GlobalState::instance_mut().editor.buffer.insert(c), KeyCode::Backspace => { - self.buffer.delete(); + GlobalState::instance_mut().editor.buffer.delete(); } KeyCode::Enter => { - self.buffer.insert('\n'); + GlobalState::instance_mut().editor.buffer.insert('\n'); } - KeyCode::Left => self.buffer.move_cursor(CursorMove::Left(1)), - KeyCode::Right => self.buffer.move_cursor(CursorMove::Right(1)), - KeyCode::Up => self.buffer.move_cursor(CursorMove::Up(1)), - KeyCode::Down => self.buffer.move_cursor(CursorMove::Down(1)), + KeyCode::Left => GlobalState::instance_mut() + .editor + .buffer + .move_cursor(CursorMove::Left(1)), + KeyCode::Right => GlobalState::instance_mut() + .editor + .buffer + .move_cursor(CursorMove::Right(1)), + KeyCode::Up => GlobalState::instance_mut() + .editor + .buffer + .move_cursor(CursorMove::Up(1)), + KeyCode::Down => GlobalState::instance_mut() + .editor + .buffer + .move_cursor(CursorMove::Down(1)), KeyCode::Home => {} KeyCode::End => {} KeyCode::PageUp => {} KeyCode::PageDown => {} - KeyCode::Tab => self.buffer.insert('\t'), + KeyCode::Tab => GlobalState::instance_mut().editor.buffer.insert('\t'), KeyCode::BackTab => {} KeyCode::Delete => {} KeyCode::Insert => {} KeyCode::F(_) => {} KeyCode::Null => {} - KeyCode::Esc => {} + KeyCode::Esc => { + let mut state = GlobalState::instance_mut(); + state.editor.visible = false; + state.set_focus(Window::View) + } KeyCode::CapsLock => {} KeyCode::ScrollLock => {} KeyCode::NumLock => {} @@ -70,18 +85,6 @@ impl LuaEditor { KeyCode::Modifier(_) => {} } } - - pub fn set_text<S>(&mut self, content: S) - where - S: AsRef<str>, - { - self.buffer - .set_lines(content.as_ref().lines().map(|s| s.to_string()).collect()) - } - - pub fn text(&self) -> String { - self.buffer.lines().join("\n") - } } impl Widget for &mut LuaEditor { @@ -89,13 +92,16 @@ impl Widget for &mut LuaEditor { where Self: Sized, { + let state = GlobalState::instance(); + let buffer = &state.editor.buffer; + self.bar.render(area, buf); let inner_area = self.bar.area(area); - let text = self.text(); + let text = buffer.as_string(); let highlights = treesitter::highlighter_split(text.as_bytes(), &self.highlight_config); - let nr_width = (self.buffer.lines().len().to_string().len() + 1).max(4) as u16; + let nr_width = (buffer.lines().len().to_string().len() + 1).max(4) as u16; let mut text_area = inner_area; text_area.x += nr_width; @@ -122,7 +128,7 @@ impl Widget for &mut LuaEditor { } } - for i in self.scroll..self.buffer.lines().len() { + for i in self.scroll..buffer.lines().len() { let mut nr_area = span_area; nr_area.x = inner_area.x; nr_area.width = nr_width - 1; @@ -139,13 +145,10 @@ impl Widget for &mut LuaEditor { let mut cursor_area = text_area; cursor_area.width = 1; cursor_area.height = 1; - cursor_area.y += self.buffer.cursor().y() as u16; - cursor_area.x += self.buffer.cursor().x() as u16; + cursor_area.y += buffer.cursor().y() as u16; + cursor_area.x += buffer.cursor().x() as u16; - let (first, _) = self - .buffer - .current_line() - .split_at(self.buffer.cursor().x()); + let (first, _) = buffer.current_line().split_at(buffer.cursor().x()); for c in first.chars() { if c == '\t' { @@ -153,19 +156,19 @@ impl Widget for &mut LuaEditor { } } - if self.scroll > self.buffer.cursor().y() { - self.scroll = self.buffer.cursor().y(); - } else if inner_area.height as usize + self.scroll - 1 < self.buffer.cursor().y() { - self.scroll = self.buffer.cursor().y() - inner_area.height as usize + 1; + if self.scroll > buffer.cursor().y() { + self.scroll = buffer.cursor().y(); + } else if inner_area.height as usize + self.scroll - 1 < buffer.cursor().y() { + self.scroll = buffer.cursor().y() - inner_area.height as usize + 1; } cursor_area.y -= self.scroll as u16; if inner_area.contains(cursor_area.into()) { - self.buffer + buffer .current_line() .chars() - .nth(self.buffer.cursor().x()) + .nth(buffer.cursor().x()) .map(|c| if c == '\t' { ' ' } else { c }) .unwrap_or(' ') .to_span() @@ -181,7 +184,6 @@ impl Default for LuaEditor { highlight_config: treesitter::new_highlight_configuration(), bar: StatusBar::default(), scroll: 0, - buffer: Buffer::default(), } } } |