close #21
This commit is contained in:
@@ -29,6 +29,8 @@ pub struct App {
|
|||||||
pub error_msg: ErrorMessage,
|
pub error_msg: ErrorMessage,
|
||||||
pub vars: HashMap<String, String>,
|
pub vars: HashMap<String, String>,
|
||||||
pub screen: ScreenSpace,
|
pub screen: ScreenSpace,
|
||||||
|
// this could probably be a normal array
|
||||||
|
pub marks: HashMap<char, (usize, usize)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Widget for &App {
|
impl Widget for &App {
|
||||||
@@ -198,6 +200,7 @@ impl App {
|
|||||||
error_msg: ErrorMessage::none(),
|
error_msg: ErrorMessage::none(),
|
||||||
vars: HashMap::new(),
|
vars: HashMap::new(),
|
||||||
screen: ScreenSpace::new(),
|
screen: ScreenSpace::new(),
|
||||||
|
marks: HashMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
use std::{
|
use std::{cmp::min, fmt::Display};
|
||||||
cmp::min,
|
|
||||||
fmt::Display,
|
|
||||||
};
|
|
||||||
|
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
prelude, style::{Color, Style}, widgets::{Paragraph, Widget}
|
prelude,
|
||||||
|
style::{Color, Style},
|
||||||
|
widgets::{Paragraph, Widget},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::app::{app::App, error_msg::ErrorMessage, logic::calc::{CellType, LEN}};
|
use crate::app::{
|
||||||
|
app::App,
|
||||||
|
error_msg::ErrorMessage,
|
||||||
|
logic::calc::{CellType, LEN},
|
||||||
|
};
|
||||||
|
|
||||||
pub enum Mode {
|
pub enum Mode {
|
||||||
Insert(Chord),
|
Insert(Chord),
|
||||||
@@ -83,7 +86,7 @@ impl Mode {
|
|||||||
} else {
|
} else {
|
||||||
app.exit = true
|
app.exit = true
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
// force quit
|
// force quit
|
||||||
"q!" => {
|
"q!" => {
|
||||||
app.exit = true;
|
app.exit = true;
|
||||||
@@ -180,7 +183,7 @@ impl Mode {
|
|||||||
Mode::Chord(chord) => {
|
Mode::Chord(chord) => {
|
||||||
chord.add_char(key);
|
chord.add_char(key);
|
||||||
|
|
||||||
// the chord starts with a :, send it over to be a comman
|
// the chord starts with a :, send it over to be a command
|
||||||
if chord.buf[0] == ':' {
|
if chord.buf[0] == ':' {
|
||||||
app.mode = Mode::Command(Chord::new(':'));
|
app.mode = Mode::Command(Chord::new(':'));
|
||||||
return;
|
return;
|
||||||
@@ -204,23 +207,42 @@ impl Mode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Err(_) => match chord.as_string().as_str() {
|
Err(_) => {
|
||||||
"d " | "dw" => {
|
let c = chord.as_string();
|
||||||
|
// match everything up to, and then the new key
|
||||||
|
match (&c[..c.len()-1], key) {
|
||||||
|
// delete cell under cursor
|
||||||
|
("d", ' ') | ("d", 'w') => {
|
||||||
let loc = app.grid.selected_cell;
|
let loc = app.grid.selected_cell;
|
||||||
app.grid.set_cell_raw::<CellType>(loc, None);
|
app.grid.set_cell_raw::<CellType>(loc, None);
|
||||||
app.mode = Mode::Normal;
|
app.mode = Mode::Normal;
|
||||||
}
|
}
|
||||||
"gg" => {
|
// go to top of row
|
||||||
|
("g", 'g') => {
|
||||||
app.grid.selected_cell.1 = 0;
|
app.grid.selected_cell.1 = 0;
|
||||||
app.mode = Mode::Normal;
|
app.mode = Mode::Normal;
|
||||||
}
|
}
|
||||||
"zz" => {
|
// center screen to cursor
|
||||||
|
("z", 'z') => {
|
||||||
app.screen.center_x(app.grid.selected_cell, &app.vars);
|
app.screen.center_x(app.grid.selected_cell, &app.vars);
|
||||||
app.screen.center_y(app.grid.selected_cell, &app.vars);
|
app.screen.center_y(app.grid.selected_cell, &app.vars);
|
||||||
app.mode = Mode::Normal;
|
app.mode = Mode::Normal;
|
||||||
}
|
}
|
||||||
|
// mark cell
|
||||||
|
("m", i) => {
|
||||||
|
app.marks.insert(i, app.grid.selected_cell);
|
||||||
|
app.mode = Mode::Normal;
|
||||||
|
}
|
||||||
|
// goto marked cell
|
||||||
|
("'", i) => {
|
||||||
|
if let Some(coords) = app.marks.get(&i) {
|
||||||
|
app.grid.selected_cell = *coords;
|
||||||
|
}
|
||||||
|
app.mode = Mode::Normal;
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
@@ -272,3 +294,32 @@ impl Widget for &Chord {
|
|||||||
Paragraph::new(self.buf.iter().collect::<String>()).render(area, buf);
|
Paragraph::new(self.buf.iter().collect::<String>()).render(area, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn keybinds() {
|
||||||
|
let mut app = App::new();
|
||||||
|
|
||||||
|
assert_eq!(app.grid.selected_cell, (0,0));
|
||||||
|
|
||||||
|
// start at B1
|
||||||
|
app.grid.selected_cell = (1,1);
|
||||||
|
assert_eq!(app.grid.selected_cell, (1,1));
|
||||||
|
|
||||||
|
// gg
|
||||||
|
app.mode = Mode::Chord(Chord::new('g'));
|
||||||
|
Mode::process_key(&mut app, 'g');
|
||||||
|
assert_eq!(app.grid.selected_cell, (1,0));
|
||||||
|
|
||||||
|
// 0
|
||||||
|
app.mode = Mode::Normal;
|
||||||
|
Mode::process_key(&mut app, '0');
|
||||||
|
assert_eq!(app.grid.selected_cell, (0,0));
|
||||||
|
|
||||||
|
// 10l
|
||||||
|
// this should mean all the directions work
|
||||||
|
app.grid.selected_cell = (0,0);
|
||||||
|
app.mode = Mode::Chord(Chord::new('1'));
|
||||||
|
Mode::process_key(&mut app, '0');
|
||||||
|
Mode::process_key(&mut app, 'l');
|
||||||
|
assert_eq!(app.grid.selected_cell, (10,0));
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user