This commit is contained in:
thatscringebro
2026-03-18 11:12:16 -04:00
parent 1a7a3baaf5
commit 91f43092c3
3 changed files with 89 additions and 34 deletions

View File

@@ -14,6 +14,8 @@ pub struct App {
pub selected_account_input: AccountInput, pub selected_account_input: AccountInput,
pub current_input: String, pub current_input: String,
pub tr_types: Vec<TransactionType>, pub tr_types: Vec<TransactionType>,
pub selected_tab: usize,
pub tabs: Vec<String>,
pub connection: Connection, pub connection: Connection,
} }
@@ -40,6 +42,14 @@ impl App {
selected_account_input: AccountInput::Asset, selected_account_input: AccountInput::Asset,
current_input: String::new(), current_input: String::new(),
tr_types: data_layer::get_transaction_types(&con), tr_types: data_layer::get_transaction_types(&con),
selected_tab: 0,
tabs: [
"Transactions".to_string(),
"Chart".to_string(),
"Chart 2".to_string(),
"Chart 3".to_string(),
]
.to_vec(),
connection: con, connection: con,
}; };
} }
@@ -258,4 +268,14 @@ impl App {
} }
} }
} }
pub fn next_tab(&mut self) {
if self.selected_tab < self.tabs.len() {
self.selected_tab += 1;
}
}
pub fn previous_tab(&mut self) {
if self.selected_tab > 0 {
self.selected_tab -= 1;
}
}
} }

View File

@@ -90,6 +90,18 @@ where
app.previous_tr(); 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 { KeyCode::Char('n') => match app.current_widget {
CurrentWidget::AccountList => { CurrentWidget::AccountList => {
app.current_screen = CurrentScreen::NewAccount; app.current_screen = CurrentScreen::NewAccount;

View File

@@ -3,7 +3,7 @@ use ratatui::{
Frame, Frame,
layout::{Constraint, Direction, Layout, Rect}, layout::{Constraint, Direction, Layout, Rect},
style::{Color, Modifier, Style, palette::tailwind::SLATE}, style::{Color, Modifier, Style, palette::tailwind::SLATE},
text::{Line, Text}, text::{Line, Span, Text},
widgets::{ widgets::{
Block, Borders, Clear, HighlightSpacing, List, ListItem, Paragraph, Row, StatefulWidget, Block, Borders, Clear, HighlightSpacing, List, ListItem, Paragraph, Row, StatefulWidget,
Table, Wrap, Table, Wrap,
@@ -32,6 +32,7 @@ pub fn ui(frame: &mut Frame, app: &mut App) {
.borders(Borders::ALL) .borders(Borders::ALL)
.border_style(Style::new().fg(Color::DarkGray)); .border_style(Style::new().fg(Color::DarkGray));
let mut trx_block = Block::default() let mut trx_block = Block::default()
.title(build_tab_title(app.selected_tab, app.tabs.clone()))
.borders(Borders::ALL) .borders(Borders::ALL)
.border_style(Style::new().fg(Color::DarkGray)); .border_style(Style::new().fg(Color::DarkGray));
@@ -68,6 +69,7 @@ pub fn ui(frame: &mut Frame, app: &mut App) {
}; };
frame.render_widget(Paragraph::new(info).block(info_block), right_layout[0]); frame.render_widget(Paragraph::new(info).block(info_block), right_layout[0]);
if app.selected_tab == 0 {
let trx_header = Row::new(["Date", "Type", "Amount", "Description"]); let trx_header = Row::new(["Date", "Type", "Amount", "Description"]);
let trx_rows = app.get_list_trx().into_iter().map(|tr| { let trx_rows = app.get_list_trx().into_iter().map(|tr| {
Row::new([ Row::new([
@@ -102,6 +104,8 @@ pub fn ui(frame: &mut Frame, app: &mut App) {
frame.buffer_mut(), frame.buffer_mut(),
&mut app.trx_table.state, &mut app.trx_table.state,
); );
} else if app.selected_tab == 1 {
}
if let CurrentScreen::NewAccount = app.current_screen { if let CurrentScreen::NewAccount = app.current_screen {
let popup = Block::default() let popup = Block::default()
@@ -314,6 +318,25 @@ fn ac_input_str(input: AccountInput, app: &mut App) -> String {
AccountInput::Asset => app.new_account.get_asset_price().to_string(), AccountInput::Asset => app.new_account.get_asset_price().to_string(),
} }
} }
fn build_tab_title(selected: usize, labels: Vec<String>) -> Vec<Span<'static>> {
let mut spans = Vec::new();
for (i, label) in labels.iter().enumerate() {
let style = if i == selected {
Style::new().fg(Color::Magenta)
} else {
Style::new()
};
spans.push(Span::raw(label.clone()).style(style));
if i + 1 < labels.len() {
spans.push(Span::raw(" | ").style(Style::new().fg(Color::DarkGray)));
}
}
return spans;
}
impl From<&Account> for ListItem<'_> { impl From<&Account> for ListItem<'_> {
fn from(value: &Account) -> Self { fn from(value: &Account) -> Self {
let line = Line::styled( let line = Line::styled(