diff --git a/src/app/app.rs b/src/app/app.rs index 9a0c245..916eea2 100644 --- a/src/app/app.rs +++ b/src/app/app.rs @@ -42,7 +42,7 @@ impl Widget for &App { let (x_max, y_max) = self.screen.how_many_cells_fit_in(&area, &self.vars); let is_selected = |x: usize, y: usize| -> bool { - if let Mode::Visual((mut x1, mut y1)) = self.mode { + if let Mode::Visual((mut x1, mut y1)) | Mode::VisualCmd((mut x1, mut y1), _)= self.mode { let (mut x2, mut y2) = self.grid.cursor(); x1 += 1; y1 += 1; @@ -80,10 +80,6 @@ impl Widget for &App { y_idx = y as usize - 1 + self.screen.scroll_y(); } - if is_selected(x.into(), y.into()) { - style = style.fg(Color::LightMagenta).bg(Color::Blue); - } - const ORANGE1: Color = Color::Rgb(200, 160, 0); const ORANGE2: Color = Color::Rgb(180, 130, 0); @@ -171,6 +167,10 @@ impl Widget for &App { } None => should_render = false, } + + if is_selected(x.into(), y.into()) { + style = style.bg(Color::Blue); + } if (x_idx, y_idx) == self.grid.cursor() { should_render = true; style = Style::new().fg(Color::Black).bg(Color::White); diff --git a/src/app/mode.rs b/src/app/mode.rs index 025b8fe..ebf4487 100644 --- a/src/app/mode.rs +++ b/src/app/mode.rs @@ -1,5 +1,8 @@ use std::{ - cmp::{max, min}, fmt::Display, fs, path::PathBuf + cmp::{max, min}, + fmt::Display, + fs, + path::PathBuf, }; use ratatui::{ @@ -12,7 +15,7 @@ use crate::app::{ app::App, error_msg::StatusMessage, logic::{ - calc::{CSV_EXT, CUSTOM_EXT, LEN}, + calc::{CSV_EXT, CUSTOM_EXT, Grid, LEN}, cell::CellType, }, }; @@ -146,14 +149,31 @@ impl Mode { _ => {} } } - if let Mode::VisualCmd(pos, editor ) = &mut app.mode { + if let Mode::VisualCmd(pos, editor) = &mut app.mode { let cmd = &editor.as_string()[1..]; let args = cmd.split_ascii_whitespace().collect::>(); if args.is_empty() { return; } match args[0] { - "foo" => {} + "export" => { + if let Some(arg1) = args.get(1) { + let (x1, y1) = pos; + let (x1, y1) = (*x1, *y1); + let (x2, y2) = app.grid.cursor(); + let (low_x, hi_x) = if x1 < x2 { (x1, x2) } else { (x2, x1) }; + let (low_y, hi_y) = if y1 < y2 { (y1, y2) } else { (y2, y1) }; + + let mut g = Grid::new(); + for (i, x) in (low_x..=hi_x).enumerate() { + for (j, y) in (low_y..=hi_y).enumerate() { + g.set_cell_raw((i, j), app.grid.get_cell_raw(x, y).clone()); + } + } + g.save_to(arg1).expect("Failure"); + } + app.mode = Mode::Normal + } _ => {} } } @@ -343,10 +363,10 @@ impl Mode { } } } - // Keys are process in the handle_event method in App for these + // Keys are process in the handle_event method in App for these Mode::Insert(_chord) => {} Mode::Command(_chord) => {} - Mode::VisualCmd(_pos, _chord ) => {} + Mode::VisualCmd(_pos, _chord) => {} } }