forked from kageru/tracc
86 lines
2.9 KiB
Rust
86 lines
2.9 KiB
Rust
use std::io;
|
|
use std::default::Default;
|
|
use termion::event::Key;
|
|
use termion::raw::IntoRawMode;
|
|
use termion::input::TermRead;
|
|
use tui::backend::Backend;
|
|
use tui::backend::TermionBackend;
|
|
use tui::style::{Color, Style};
|
|
use tui::widgets::*;
|
|
use tui::Terminal;
|
|
mod tracc;
|
|
use tracc::Tracc;
|
|
|
|
pub enum Mode {
|
|
Insert,
|
|
Normal,
|
|
}
|
|
|
|
fn main() -> Result<(), io::Error> {
|
|
let stdout = io::stdout().into_raw_mode()?;
|
|
let mut inputs = io::stdin().keys();
|
|
let backend = TermionBackend::new(stdout);
|
|
let mut terminal = Terminal::new(backend)?;
|
|
let mut tracc = Tracc::open_or_create();
|
|
let mut register = std::default::Default::default();
|
|
terminal.hide_cursor()?;
|
|
terminal.clear()?;
|
|
loop {
|
|
refresh(&mut terminal, &tracc)?;
|
|
// I need to find a better way to handle inputs. This is awful.
|
|
let input = inputs.next().unwrap()?;
|
|
match tracc.mode {
|
|
Mode::Normal => match input {
|
|
Key::Char('q') => {
|
|
tracc.persist();
|
|
break;
|
|
},
|
|
Key::Char('j') => tracc.selection_down(),
|
|
Key::Char('k') => tracc.selection_up(),
|
|
Key::Char('o') => {
|
|
tracc.insert(Default::default());
|
|
tracc.set_mode(Mode::Insert, &mut terminal)?;
|
|
}
|
|
Key::Char('a') => tracc.set_mode(Mode::Insert, &mut terminal)?,
|
|
Key::Char('A') => tracc.set_mode(Mode::Insert, &mut terminal)?,
|
|
Key::Char(' ') => tracc.toggle_current(),
|
|
// dd
|
|
Key::Char('d') => {
|
|
if let Key::Char('d') = inputs.next().unwrap()? {
|
|
register = tracc.remove_current()
|
|
}
|
|
}
|
|
Key::Char('p') => {
|
|
if register.is_some() {
|
|
tracc.insert(register.clone().unwrap());
|
|
}
|
|
}
|
|
_ => (),
|
|
},
|
|
Mode::Insert => match input {
|
|
Key::Char('\n') => tracc.set_mode(Mode::Normal, &mut terminal)?,
|
|
Key::Esc => tracc.set_mode(Mode::Normal, &mut terminal)?,
|
|
Key::Backspace => tracc.current_pop(),
|
|
Key::Char(x) => tracc.append_to_current(x),
|
|
_ => (),
|
|
},
|
|
};
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
fn refresh(terminal: &mut tui::Terminal<impl Backend>, tracc: &Tracc) -> Result<(), io::Error> {
|
|
terminal.draw(|mut frame| {
|
|
let size = frame.size();
|
|
let block = Block::default().title(" t r a c c ").borders(Borders::ALL);
|
|
SelectableList::default()
|
|
.block(block)
|
|
.items(&tracc.printable_todos())
|
|
.select(Some(tracc.selected))
|
|
.highlight_style(Style::default().fg(Color::LightGreen))
|
|
.highlight_symbol(">")
|
|
.render(&mut frame, size);
|
|
})?;
|
|
Ok(())
|
|
}
|