summaryrefslogtreecommitdiff
path: root/src/widgets
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-07-26 10:32:55 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-07-26 10:32:55 +0200
commit6ca07d6af8a338e76817d06c6c6c6f13e64fba9c (patch)
tree32680f0942da8c45af8425ebc20330f5456a9213 /src/widgets
parent8b7c56df1940d2ac6e3ece3385464009e46382fa (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);
}
}
}