diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-07-26 10:32:55 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-07-26 10:32:55 +0200 |
| commit | 6ca07d6af8a338e76817d06c6c6c6f13e64fba9c (patch) | |
| tree | 32680f0942da8c45af8425ebc20330f5456a9213 /src/widgets | |
| parent | 8b7c56df1940d2ac6e3ece3385464009e46382fa (diff) | |
add neosheetrc support
Diffstat (limited to 'src/widgets')
| -rw-r--r-- | src/widgets/sheetview/mod.rs (renamed from src/widgets/sheetview.rs) | 144 |
1 files changed, 83 insertions, 61 deletions
diff --git a/src/widgets/sheetview.rs b/src/widgets/sheetview/mod.rs index c4f7a73..37e3d16 100644 --- a/src/widgets/sheetview.rs +++ b/src/widgets/sheetview/mod.rs @@ -1,25 +1,25 @@ use std::thread::JoinHandle; -use layout::Offset; use ratatui::{ crossterm::event::{KeyCode, KeyEvent, KeyModifiers}, prelude::*, style::Stylize, text::ToLine, - widgets::{block::BlockExt, Block, Clear, Gauge, Widget}, + widgets::{Block, Borders, Clear, Gauge, Paragraph, Widget, Wrap}, }; -use crate::sheet::{ +use crate::{config::GlobalConfig, sheet::{ + eval::EvalFunction, register::{Register, SheetId}, - eval::EvalFunction, Sheet, -}; + Sheet, +}}; use super::luaeditor::LuaEditor; const DEFAULT_COLUMN_WIDTH: u16 = 10; pub struct SheetView<'a> { - block: Option<Block<'a>>, + block: Block<'a>, luaeditor: Option<LuaEditor<'a>>, sheet: SheetId, selection: Option<(u16, u16)>, @@ -32,7 +32,15 @@ pub struct SheetView<'a> { impl<'a> SheetView<'a> { pub fn new(sheet: SheetId) -> Self { Self { - block: None, + block: Block::default() + .title_bottom(" Sheet ") + .title_style(Style::default().on_magenta().black()) + .borders(Borders::BOTTOM) + .border_style( + Style::default() + .bg(Color::Rgb(29, 32, 33)) + .fg(Color::Rgb(29, 32, 33)), + ), luaeditor: None, sheet, selection: None, @@ -43,11 +51,6 @@ impl<'a> SheetView<'a> { } } - pub fn block(mut self, block: Block<'a>) -> Self { - self.block = Some(block); - self - } - pub fn sheet(mut self, sheet: SheetId) -> Self { self.sheet = sheet; self @@ -197,14 +200,43 @@ impl<'a> SheetView<'a> { KeyCode::Char('l') => self.move_cursor_by((0, 1)), KeyCode::Char('v') => self.toggle_select_mode(), KeyCode::Char('s') => { - let editor = LuaEditor::new("function(cell)\n\treturn \"\"\nend") - .block(Some(Block::bordered().title(" Temp Script "))); + let editor = LuaEditor::new("function(cell)\n\treturn \"\"\nend"); self.luaeditor = Some(editor) } _ => {} } } } + + fn areas(&self, area: Rect) -> (Rect, Rect, Rect, Rect) { + let mut sheet = area; + let mut editor = Rect::default(); + let mut error = Rect::default(); + let mut progress = Rect::default(); + + if self.luaeditor.is_some() { + let layout = + Layout::horizontal([Constraint::Min(1), Constraint::Length(50)]).split(sheet); + sheet = layout[0]; + editor = layout[1]; + + if self.error_window.is_some() { + let layout = + Layout::vertical([Constraint::Min(1), Constraint::Length(10)]).split(editor); + editor = layout[0]; + error = layout[1]; + } + + if self.process_handle.is_some() { + let layout = + Layout::vertical([Constraint::Min(1), Constraint::Length(1)]).split(editor); + editor = layout[0]; + progress = layout[1]; + } + } + + (sheet, editor, error, progress) + } } impl Widget for &mut SheetView<'_> { @@ -212,25 +244,29 @@ impl Widget for &mut SheetView<'_> { where Self: Sized, { + let theme = GlobalConfig::instance().theme.sheetview.clone(); let progress; + let (sheet_area, editor_area, error_area, progress_area) = self.areas(area); + let separator = Block::default().borders(Borders::RIGHT).border_style( + Style::default() + .bg(Color::Rgb(29, 32, 33)) + .fg(Color::Rgb(29, 32, 33)), + ); { let lock = Register::get(self.sheet).unwrap(); let sheet = lock.read().unwrap(); - let splits = Layout::horizontal([Constraint::Min(1), Constraint::Length(50)]).split(area); - let block_area = if self.luaeditor.is_some() { - splits[0] - } else { - area - }; + let mut sheet_area_inner = self.block.inner(sheet_area); - let sheet_area = self.block.inner_if_some(block_area); + if self.luaeditor.is_some() { + sheet_area_inner = separator.inner(sheet_area_inner); + } let viewport_rows = sheet.height().min(sheet_area.height as usize); let viewport_columns = sheet .width() - .min((sheet_area.width / DEFAULT_COLUMN_WIDTH) as usize); + .min((sheet_area_inner.width / DEFAULT_COLUMN_WIDTH) as usize); if self.cursor.0 >= viewport_rows as u16 + self.scroll.0 { self.scroll.0 = self.cursor.0 - viewport_rows as u16 + 1; @@ -252,19 +288,19 @@ impl Widget for &mut SheetView<'_> { let cell = cell.to_string() + " "; let line = if (cell_pos_y, cell_pos_x) == self.cursor { - cell.to_line().bg(Color::Rgb(120, 90, 90)).white() + theme.cursor.apply(cell.to_line()) } else if self.is_in_selection(cell_pos_y, cell_pos_x) { - cell.to_line().bg(Color::Rgb(120, 120, 90)).white() + theme.selection.apply(cell.to_line()) } else if (row + column) % 2 == 0 { - cell.to_line().bg(Color::Rgb(30, 30, 30)).white() + theme.cell.0.apply(cell.to_line()) } else { - cell.to_line().bg(Color::Rgb(50, 50, 50)).white() + theme.cell.1.apply(cell.to_line()) }; let rect = Rect::new( - sheet_area.x + column * DEFAULT_COLUMN_WIDTH, - sheet_area.y + row, - (sheet_area.width - column * DEFAULT_COLUMN_WIDTH) + sheet_area_inner.x + column * DEFAULT_COLUMN_WIDTH, + sheet_area_inner.y + row, + (sheet_area_inner.width - column * DEFAULT_COLUMN_WIDTH) .min(DEFAULT_COLUMN_WIDTH), 1, ); @@ -274,33 +310,30 @@ impl Widget for &mut SheetView<'_> { } } - self.block.render(block_area, buf); + self.block.clone().render(sheet_area, buf); if let Some(textarea) = &mut self.luaeditor { - textarea.render(splits[1], buf) + separator.render(self.block.inner(sheet_area), buf); + textarea.render(editor_area, buf) } if let Some(error_msg) = &self.error_window { let lines = error_msg.lines().collect::<Vec<_>>(); - let height = lines.len() as u16 + 2; - let width = lines.iter().map(|s| s.len()).max().unwrap_or(0) as u16 + 2; - let centered = Rect::new( - (area.width - width) / 2, - (area.height - height) / 2, - width, - height, - ); + let block = Block::default() + .title_bottom(" Error ") + .title_style(Style::default().on_red()) + .border_style(Style::default().black().on_black()) + .borders(Borders::BOTTOM); + let error_inner = block.inner(error_area); + block.render(error_area, buf); - let block = Block::bordered().red().on_black().bold().title(" Error "); - let inner_centered = block.inner(centered); - Clear::default().render(centered, buf); - block.render(centered, buf); + let text = Text::from_iter(lines.iter().map(|s| s.to_line().white())); - for (i, line) in lines.iter().enumerate() { - let line = line.replace('\t', " ").red().on_black().bold(); - line.render(inner_centered.offset(Offset { x: 0, y: i as i32 }), buf); - } + Paragraph::new(text) + .wrap(Wrap { trim: true }) + .bg(Color::Rgb(70, 25, 25)) + .render(error_inner, buf); } progress = sheet.progress(); @@ -309,28 +342,17 @@ impl Widget for &mut SheetView<'_> { self.join_process_handle_on_finished(); if self.process_handle.is_some() { - let height = 3; - let width = area.width / 2; - - let centered = Rect::new( - (area.width - width) / 2, - (area.height - height) / 2, - width, - height, - ); - let gauge = Gauge::default() - .block(Block::bordered().title("Progress").on_black()) .gauge_style( Style::default() .fg(Color::White) - .bg(Color::Black) + .bg(Color::DarkGray) .add_modifier(Modifier::ITALIC), ) .percent(progress as u16); - Clear::default().render(centered, buf); - gauge.render(centered, buf); + Clear::default().render(progress_area, buf); + gauge.render(progress_area, buf); } } } |