Files
ft_rs/src/main.rs
thatscringebro 91f43092c3 tabs
2026-03-18 11:12:16 -04:00

188 lines
6.7 KiB
Rust

mod app;
mod data_layer;
mod entities;
mod enums;
mod ui;
use crate::{app::App, enums::*, ui::ui};
use chrono::Local;
use entities::{Account, AccountType, Transaction};
use ratatui::{
Terminal,
crossterm::{
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode},
execute,
terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode},
},
prelude::Backend,
};
use std::{
env::{self},
error::Error,
io,
};
fn main() -> Result<(), Box<dyn Error>> {
enable_raw_mode()?;
let mut stderr = io::stderr();
execute!(stderr, EnterAlternateScreen, EnableMouseCapture)?;
let mut path: &str = "ft_rs.db";
let args: Vec<String> = env::args().collect();
if args.len() > 1 {
path = &args[1];
}
let mut terminal = ratatui::init();
let mut app = App::new(path);
let res = run_app(&mut terminal, &mut app);
disable_raw_mode()?;
execute!(
terminal.backend_mut(),
LeaveAlternateScreen,
DisableMouseCapture
)?;
terminal.show_cursor()?;
if let Err(err) = res {
println!("{err:?}");
}
return Ok(());
}
fn run_app<B: Backend>(terminal: &mut Terminal<B>, app: &mut App) -> io::Result<bool>
where
std::io::Error: From<<B as Backend>::Error>,
{
loop {
terminal.draw(|f| ui(f, app))?;
// S'occupe des keyevents
if let Event::Key(key) = event::read()? {
if key.kind == event::KeyEventKind::Release {
continue;
}
match app.current_screen {
CurrentScreen::Main => match key.code {
KeyCode::Char('q') => {
app.current_screen = CurrentScreen::Exiting;
}
KeyCode::Right => {
app.current_widget = CurrentWidget::TrxList;
}
KeyCode::Left => {
app.current_widget = CurrentWidget::AccountList;
}
KeyCode::Char('j') => match app.current_widget {
CurrentWidget::AccountList => {
app.next_ac();
}
CurrentWidget::TrxList => {
app.next_tr();
}
},
KeyCode::Char('k') => match app.current_widget {
CurrentWidget::AccountList => {
app.previous_ac();
}
CurrentWidget::TrxList => {
app.previous_tr();
}
},
KeyCode::Char('l') => match app.current_widget {
CurrentWidget::AccountList => {}
CurrentWidget::TrxList => {
app.next_tab();
}
},
KeyCode::Char('h') => match app.current_widget {
CurrentWidget::AccountList => {}
CurrentWidget::TrxList => {
app.previous_tab();
}
},
KeyCode::Char('n') => match app.current_widget {
CurrentWidget::AccountList => {
app.current_screen = CurrentScreen::NewAccount;
}
CurrentWidget::TrxList => {
app.current_screen = CurrentScreen::NewTransaction;
app.new_transaction
.set_account_id(app.acc_list.get_selected_id());
app.new_transaction.set_date(Local::now());
}
},
KeyCode::Char('m') => match app.current_widget {
CurrentWidget::AccountList => {
app.current_screen = CurrentScreen::NewAccount;
app.new_account = app.acc_list.selected_ac();
app.set_current_input_ac();
}
CurrentWidget::TrxList => {
app.current_screen = CurrentScreen::NewTransaction;
app.new_transaction = app.trx_table.selected_tr();
app.set_current_input_tr();
}
},
_ => {}
},
CurrentScreen::NewAccount => match key.code {
KeyCode::Down => {
app.next_ac_input();
}
KeyCode::Up => {
app.previous_ac_input();
}
KeyCode::Backspace => {
app.current_input.pop();
}
KeyCode::Char(value) => {
app.current_input.push(value);
}
KeyCode::Enter => {
app.save_new_account();
app.current_screen = CurrentScreen::Main;
}
KeyCode::Esc => {
app.current_screen = CurrentScreen::Main;
app.new_account = Account::new(0, String::new(), 0.0, AccountType::Cash);
}
_ => {}
},
CurrentScreen::NewTransaction => match key.code {
KeyCode::Down => {
app.next_tr_input();
}
KeyCode::Up => {
app.previous_tr_input();
}
KeyCode::Enter => {
app.save_new_tr();
app.current_screen = CurrentScreen::Main;
}
KeyCode::Backspace => {
app.current_input.pop();
}
KeyCode::Char(value) => {
app.current_input.push(value);
}
KeyCode::Esc => {
app.current_screen = CurrentScreen::Main;
app.new_transaction = Transaction::new_empty();
}
_ => {}
},
CurrentScreen::Exiting => match key.code {
KeyCode::Char('y') => {
return Ok(true);
}
_ => {
app.current_screen = CurrentScreen::Main;
}
},
}
}
}
}