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> { enable_raw_mode()?; let mut stderr = io::stderr(); execute!(stderr, EnterAlternateScreen, EnableMouseCapture)?; let mut path: &str = "ft_rs.db"; let args: Vec = 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(terminal: &mut Terminal, app: &mut App) -> io::Result where std::io::Error: From<::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; } }, } } } }