diff --git a/src/app.rs b/src/app.rs index 28b8e59..7937bfe 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,76 +1,15 @@ use ratatui::widgets::ListState; use sqlite::Connection; -use crate::{ - data_layer, - entities::{Account, AccountType, Transaction}, -}; - -pub enum CurrentScreen { - Main, - Exiting, -} -pub enum CurrentWidget { - AccountList, - TrxInfo, - TrxList, -} - -pub struct AccountList { - accounts: Vec, - pub state: ListState, -} -impl AccountList { - fn new() -> AccountList { - let mut list_state = ListState::default(); - list_state.select_first(); - return AccountList { - accounts: Vec::new(), - state: list_state, - }; - } - - fn get_accounts(&self, con: &Connection) -> Vec { - if self.accounts.iter().count() == 0 { - return data_layer::get_accounts(con); - } - return self.accounts.clone(); - } -} - -pub struct TrxList { - trx: Vec, - pub state: ListState, -} -impl TrxList { - fn new() -> TrxList { - let mut list_state = ListState::default(); - list_state.select_first(); - return TrxList { - trx: Vec::new(), - state: list_state, - }; - } - - fn get_trx(&self, con: &Connection, app: &App) -> Vec { - if self.trx.iter().count() == 0 { - if let Some(i) = app.acc_list.state.selected() { - return data_layer::get_account_transactions( - con, - app.get_list_accounts()[i].get_id(), - ); - } - return Vec::new(); - } - return self.trx.clone(); - } -} +use crate::{data_layer, entities::*, enums::*}; pub struct App { pub current_screen: CurrentScreen, pub current_widget: CurrentWidget, pub acc_list: AccountList, pub trx_list: TrxList, + pub new_account: Account, + pub new_transaction: Transaction, pub connection: Connection, exit: bool, } @@ -89,12 +28,14 @@ impl App { current_widget: CurrentWidget::AccountList, acc_list: AccountList::new(), trx_list: TrxList::new(), + new_account: Account::new(0, String::new(), AccountType::Cash), + new_transaction: Transaction::new_empty(), connection: con, exit: false, }; } - pub fn get_list_accounts(&self) -> Vec { + pub fn get_list_accounts(&mut self) -> Vec { let mut accounts = self.acc_list.get_accounts(&self.connection); let all = Account::new(0, "All".to_string(), AccountType::Cash); accounts.insert(0, all); @@ -111,8 +52,10 @@ impl App { self.acc_list.state.select_previous(); } - pub fn get_list_trx(&self) -> Vec { - let accounts = &self.trx_list.get_trx(&self.connection, self); + pub fn get_list_trx(&mut self) -> Vec { + let accounts = self + .trx_list + .get_trx(self.acc_list.get_selected_id(), &self.connection); return accounts.to_vec(); } @@ -125,4 +68,10 @@ impl App { pub fn previous_tr(&mut self) { self.trx_list.state.select_previous(); } + + pub fn save_new_account(&mut self) { + let ac = data_layer::upsert_account(&self.connection, self.new_account.clone()); + self.acc_list.add_account(ac); + self.new_account = Account::new(0, String::new(), AccountType::Cash); + } } diff --git a/src/entities.rs b/src/entities.rs index 3f0f1ba..8da405e 100644 --- a/src/entities.rs +++ b/src/entities.rs @@ -1,5 +1,9 @@ pub mod account; +pub mod accountlist; pub mod transaction; +pub mod trxlist; pub use account::{Account, AccountType}; +pub use accountlist::*; pub use transaction::{Transaction, TransactionType}; +pub use trxlist::*; diff --git a/src/entities/accountlist.rs b/src/entities/accountlist.rs new file mode 100644 index 0000000..3969aff --- /dev/null +++ b/src/entities/accountlist.rs @@ -0,0 +1,38 @@ +use ratatui::widgets::ListState; +use sqlite::Connection; + +use crate::{data_layer, entities::*}; + +pub struct AccountList { + accounts: Vec, + pub state: ListState, +} +impl AccountList { + pub fn new() -> AccountList { + let mut list_state = ListState::default(); + list_state.select_first(); + return AccountList { + accounts: Vec::new(), + state: list_state, + }; + } + + pub fn get_accounts(&mut self, con: &Connection) -> Vec { + if self.accounts.iter().count() == 0 { + self.accounts = data_layer::get_accounts(con); + } + return self.accounts.clone(); + } + + pub fn get_selected_id(&self) -> i64 { + if let Some(i) = self.state.selected() { + self.accounts.get(i).map(|a| a.get_id()).unwrap_or(-1) + } else { + -1 + } + } + + pub fn add_account(&mut self, ac: Account) { + self.accounts.push(ac); + } +} diff --git a/src/entities/trxlist.rs b/src/entities/trxlist.rs new file mode 100644 index 0000000..a1c4dd2 --- /dev/null +++ b/src/entities/trxlist.rs @@ -0,0 +1,31 @@ +use ratatui::widgets::ListState; +use sqlite::Connection; + +use crate::{data_layer, entities::*}; + +pub struct TrxList { + trx: Vec, + ac_id: i64, + pub state: ListState, +} +impl TrxList { + pub fn new() -> TrxList { + let mut list_state = ListState::default(); + list_state.select_first(); + return TrxList { + trx: Vec::new(), + state: list_state, + ac_id: 0, + }; + } + + pub fn get_trx(&mut self, ac_id: i64, con: &Connection) -> Vec { + if ac_id == -1 { + return Vec::new(); + } + if self.trx.iter().count() == 0 || self.ac_id != ac_id { + self.trx = data_layer::get_account_transactions(con, ac_id); + } + return self.trx.clone(); + } +} diff --git a/src/enums.rs b/src/enums.rs new file mode 100644 index 0000000..4262df8 --- /dev/null +++ b/src/enums.rs @@ -0,0 +1,11 @@ +pub enum CurrentWidget { + AccountList, + TrxInfo, + TrxList, +} +pub enum CurrentScreen { + Main, + Exiting, + NewAccount, + NewTransaction, +} diff --git a/src/main.rs b/src/main.rs index 04ff29c..fb60d19 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,10 @@ mod app; mod data_layer; mod entities; +mod enums; mod ui; -use crate::{ - app::{App, CurrentScreen}, - ui::ui, -}; -use app::CurrentWidget; +use crate::{app::App, enums::*, ui::ui}; +use entities::{Account, AccountType}; use ratatui::{ Terminal, crossterm::{ @@ -62,27 +60,50 @@ fn run_app(terminal: &mut Terminal, app: &mut App) -> io::Result< KeyCode::Left => { app.current_widget = CurrentWidget::AccountList; } - KeyCode::Char('j') => { - match app.current_widget { - CurrentWidget::AccountList => { - app.next_ac(); - } - CurrentWidget::TrxList => { - //app.next_trx(); - } - _ => {} + 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('n') => match app.current_widget { + CurrentWidget::AccountList => { + app.current_screen = CurrentScreen::NewAccount; + } + CurrentWidget::TrxList => { + app.current_screen = CurrentScreen::NewTransaction; + } + _ => {} + }, + _ => {} + }, + CurrentScreen::NewAccount => match key.code { + KeyCode::Enter => { + app.save_new_account(); + app.current_screen = CurrentScreen::Main; } - KeyCode::Char('k') => { - match app.current_widget { - CurrentWidget::AccountList => { - app.previous_ac(); - } - CurrentWidget::TrxList => { - //app.previous_trx(); - } - _ => {} - } + KeyCode::Esc => { + app.current_screen = CurrentScreen::Main; + app.new_account = Account::new(0, String::new(), AccountType::Cash); + } + _ => {} + }, + CurrentScreen::NewTransaction => match key.code { + KeyCode::Enter => {} + KeyCode::Esc => { + app.current_screen = CurrentScreen::Main; } _ => {} }, @@ -94,6 +115,7 @@ fn run_app(terminal: &mut Terminal, app: &mut App) -> io::Result< app.current_screen = CurrentScreen::Main; } }, + _ => {} } } } diff --git a/src/ui.rs b/src/ui.rs index c089600..4718965 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,6 +1,7 @@ use crate::{ - app::{App, CurrentScreen, CurrentWidget}, + app::App, entities::{Account, Transaction}, + enums::*, }; use ratatui::{ Frame, @@ -103,6 +104,13 @@ pub fn ui(frame: &mut Frame, app: &mut App) { &mut app.trx_list.state, ); + if let CurrentScreen::NewAccount = app.current_screen { + let popup = Block::default() + .title("New account") + .borders(Borders::all()) + .style(Style::default()); + } + if let CurrentScreen::Exiting = app.current_screen { let popup = Block::default() .title("Exiting program")