summaryrefslogtreecommitdiff
path: root/src/widgets/sheetview
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/sheetview')
-rw-r--r--src/widgets/sheetview/mod.rs169
1 files changed, 75 insertions, 94 deletions
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 mode = {
+ 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 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 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);
+ 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();
- }
+ 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();
+ }
- 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();
- }
+ 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);
+ 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);
+ 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() + " ";
+ 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 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,
- );
+ 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);
+ line.render(rect, buf);
+ }
}
}
- }
- match state.sheetview.mode {
- Mode::Command => {
- self.bar.set_left(" COMMAND ");
- }
-
- 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");
- }
- }
- }
+ state.sheetview.mode
+ };
+ SheetViewBarState::apply(&mut self.bar, mode, &lua::get());
+ SheetViewBarTheme::apply(&mut self.bar, mode, &lua::get());
self.bar.render(area, buf);
}
}