From d1492a10cdaf714074d29ad3366ab9c169d95b75 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 2 Aug 2024 15:51:45 +0200 Subject: add bartheme and barstate to sheetview --- src/widgets/sheetview/mod.rs | 177 +++++++++++++++++++------------------------ 1 file changed, 79 insertions(+), 98 deletions(-) (limited to 'src/widgets/sheetview') diff --git a/src/widgets/sheetview/mod.rs b/src/widgets/sheetview/mod.rs index 96c4234..202bb70 100644 --- a/src/widgets/sheetview/mod.rs +++ b/src/widgets/sheetview/mod.rs @@ -1,17 +1,16 @@ use ratatui::{ crossterm::event::{KeyCode, KeyEvent}, prelude::*, - style::Stylize, text::ToLine, widgets::{Paragraph, Widget}, }; use crate::{ - config::GlobalConfig, + config::{theme::sheetview::bar::SheetViewBarTheme, GlobalConfig}, cursor::CursorMove, lua, sheet::cell::Cell, - state::{view::mode::Mode, window::Window, GlobalState}, + state::{view::{bar::SheetViewBarState, mode::Mode}, window::Window, GlobalState}, }; use super::statusbar::StatusBar; @@ -27,12 +26,7 @@ pub struct SheetView { impl SheetView { pub fn new() -> Self { Self { - bar: StatusBar::new() - .left(" NORMAL ") - .left_style(Style::default().on_magenta()) - .middle("Sheet") - .right("") - .right_style(Style::default().on_red()), + bar: StatusBar::new(), scroll: (0, 0), } } @@ -48,17 +42,18 @@ impl SheetView { .move_checked(cm) } - fn cursor(&self) -> (usize, usize) { - let state = GlobalState::instance(); - (state.sheetview.cursor.y(), state.sheetview.cursor.x()) - } - fn start_selection(&self) { let mut state = GlobalState::instance_mut(); - state.sheetview.selection_anchor = Some(self.cursor()); + state.sheetview.selection_anchor = Some((state.sheetview.cursor.y(), state.sheetview.cursor.x())); state.sheetview.mode = Mode::Visual; } + fn stop_selection(&self) { + let mut state = GlobalState::instance_mut(); + state.sheetview.selection_anchor = None; + state.sheetview.mode = Mode::Normal; + } + fn open_editor(&self) { let mut state = GlobalState::instance_mut(); state.editor.buffer.set_lines_from_string( @@ -126,7 +121,7 @@ end)"#, KeyCode::Char('k') => self.move_cursor(CursorMove::Up(1)), KeyCode::Char('h') => self.move_cursor(CursorMove::Left(1)), KeyCode::Char('l') => self.move_cursor(CursorMove::Right(1)), - KeyCode::Char('v') => self.start_selection(), + KeyCode::Char('v') | KeyCode::Esc => self.stop_selection(), KeyCode::Char('s') => self.open_editor(), KeyCode::Char(':') => { self.set_mode(Mode::Command); @@ -162,99 +157,85 @@ impl Widget for &mut SheetView { where Self: Sized, { - let theme = GlobalConfig::instance().theme.sheetview.clone(); - - let state = GlobalState::instance(); - let lock = state.sheetview.active_sheet().unwrap(); - let sheet = lock.read().unwrap(); - let cursor = &state.sheetview.cursor; - - let sheet_area_inner = self.bar.area(area); - - let viewport_rows = sheet.height().min(sheet_area_inner.height as usize); - let viewport_columns = sheet - .width() - .min((sheet_area_inner.width / DEFAULT_COLUMN_WIDTH) as usize); - - if cursor.y() >= viewport_rows + self.scroll.0 { - self.scroll.0 = (cursor.y() - viewport_rows) + 1; - } else if cursor.y() < self.scroll.0 { - self.scroll.0 = cursor.y(); - } + let mode = { + let theme = GlobalConfig::instance().theme.sheetview.clone(); - if cursor.x() >= viewport_columns + self.scroll.1 { - self.scroll.1 = (cursor.x() - viewport_columns) + 1; - } else if cursor.x() < self.scroll.1 { - self.scroll.1 = cursor.x(); - } - - theme - .background - .get((), &lua::get()) - .unwrap_or_default() - .apply(Paragraph::default()) - .render(area, buf); - - for row in 0..viewport_rows { - for column in 0..(viewport_columns + 1) { - let (cell_pos_y, cell_pos_x) = (row + self.scroll.0, column + self.scroll.1); + let state = GlobalState::instance(); + let lock = state.sheetview.active_sheet().unwrap(); + let sheet = lock.read().unwrap(); + let cursor = &state.sheetview.cursor; - if let Some(cell_ref) = sheet.get_ref(cell_pos_y, cell_pos_x) { - let cell = cell_ref.value().to_string() + " "; + let sheet_area_inner = self.bar.area(area); - let line = if (cell_pos_y, cell_pos_x) == (cursor.y(), cursor.x()) { - theme - .cursor - .get(cell_ref, &lua::get()) - .unwrap_or_default() - .apply(cell.to_line()) - } else if state.sheetview.selection_contains(cell_pos_y, cell_pos_x) { - theme - .selection - .get(cell_ref, &lua::get()) - .unwrap_or_default() - .apply(cell.to_line()) - } else { - theme - .cell - .get(cell_ref, &lua::get()) - .unwrap_or_default() - .apply(cell.to_line()) - }; + let viewport_rows = sheet.height().min(sheet_area_inner.height as usize); + let viewport_columns = sheet + .width() + .min((sheet_area_inner.width / DEFAULT_COLUMN_WIDTH) as usize); - let rect = Rect::new( - sheet_area_inner.x + (column as u16) * DEFAULT_COLUMN_WIDTH, - sheet_area_inner.y + (row as u16), - (sheet_area_inner.width - (column as u16) * DEFAULT_COLUMN_WIDTH) - .min(DEFAULT_COLUMN_WIDTH), - 1, - ); - - line.render(rect, buf); - } + if cursor.y() >= viewport_rows + self.scroll.0 { + self.scroll.0 = (cursor.y() - viewport_rows) + 1; + } else if cursor.y() < self.scroll.0 { + self.scroll.0 = cursor.y(); } - } - match state.sheetview.mode { - Mode::Command => { - self.bar.set_left(" COMMAND "); + if cursor.x() >= viewport_columns + self.scroll.1 { + self.scroll.1 = (cursor.x() - viewport_columns) + 1; + } else if cursor.x() < self.scroll.1 { + self.scroll.1 = cursor.x(); } - Mode::Insert => { - self.bar.set_left(" INSERT "); - } - - _ => { - if state.sheetview.selection_anchor.is_some() { - self.bar.set_left(" VISUAL "); - } else { - self.bar.set_left(" NORMAL "); - self.bar.set_middle_alignment(Alignment::Center); - self.bar.set_middle("Sheet"); + theme + .background + .get((), &lua::get()) + .unwrap_or_default() + .apply(Paragraph::default()) + .render(sheet_area_inner, buf); + + for row in 0..viewport_rows { + for column in 0..(viewport_columns + 1) { + let (cell_pos_y, cell_pos_x) = (row + self.scroll.0, column + self.scroll.1); + + if let Some(cell_ref) = sheet.get_ref(cell_pos_y, cell_pos_x) { + let cell = cell_ref.value().to_string() + " "; + + let line = if (cell_pos_y, cell_pos_x) == (cursor.y(), cursor.x()) { + theme + .cursor + .get(cell_ref, &lua::get()) + .unwrap_or_default() + .apply(cell.to_line()) + } else if state.sheetview.selection_contains(cell_pos_y, cell_pos_x) { + theme + .selection + .get(cell_ref, &lua::get()) + .unwrap_or_default() + .apply(cell.to_line()) + } else { + theme + .cell + .get(cell_ref, &lua::get()) + .unwrap_or_default() + .apply(cell.to_line()) + }; + + let rect = Rect::new( + sheet_area_inner.x + (column as u16) * DEFAULT_COLUMN_WIDTH, + sheet_area_inner.y + (row as u16), + (sheet_area_inner.width - (column as u16) * DEFAULT_COLUMN_WIDTH) + .min(DEFAULT_COLUMN_WIDTH), + 1, + ); + + line.render(rect, buf); + } } } - } + state.sheetview.mode + }; + + SheetViewBarState::apply(&mut self.bar, mode, &lua::get()); + SheetViewBarTheme::apply(&mut self.bar, mode, &lua::get()); self.bar.render(area, buf); } } -- cgit v1.2.3-70-g09d2