use super::View; use iced::{ alignment, widget::{row, Container}, Element, Length, }; use schist_models::{Account, Bucket, Transaction}; use crate::{ gui::components::{ balances_view, buckets_view, navigation, transactions_view, BalancesView, BucketsView, Navigation, TransactionsView, }, style::SPACING_LG, traits::{Component, Viewable}, }; pub struct MainScreen { pub active_view: View, pub buckets: Vec, pub balances_view: BalancesView, pub buckets_view: BucketsView, pub transactions_view: TransactionsView, pub view_navigation: Navigation, } #[derive(Clone, Debug)] pub enum Message { BalancesViewMessage(balances_view::Message), BucketsViewMessage(buckets_view::Message), ExpandItem, CollapseItem, NextItem, PrevItem, TransactionsViewMessage(transactions_view::Message), SelectView(View), SetAccounts(Vec), SetBuckets(Vec), SetTransactions(Vec), ViewNavigationMessage(navigation::Message), } pub enum Action { None, } impl<'a> Viewable<'a, Message> for MainScreen { fn view(&'a self) -> Element<'a, Message> { let view_navigation = self .view_navigation .view() .map(Message::ViewNavigationMessage); let view = match &self.active_view { View::Balances => self.balances_view.view().map(Message::BalancesViewMessage), View::Buckets => self.buckets_view.view().map(Message::BucketsViewMessage), View::Transactions => self .transactions_view .view() .map(Message::TransactionsViewMessage), }; row![ Container::new(view_navigation).width(Length::FillPortion(1)), Container::new(view).width(Length::FillPortion(4)), ] .align_y(alignment::Vertical::Center) .height(Length::Fill) .spacing(u32::from(SPACING_LG)) .into() } } impl<'a> Component<'a, Message, Action> for MainScreen { fn update(&mut self, message: Message) -> Action { match message { Message::SelectView(view) => { self.active_view = view; self.view_navigation .update(navigation::Message::SelectOption(view)); Action::None } Message::BalancesViewMessage(message) => match self.balances_view.update(message) { balances_view::Action::None => Action::None, }, Message::BucketsViewMessage(message) => { self.buckets_view.update(message); Action::None } Message::TransactionsViewMessage(message) => { match self.transactions_view.update(message) { transactions_view::Action::None => Action::None, } } Message::ViewNavigationMessage(message) => match self.view_navigation.update(message) { navigation::Action::ActivateOption(view) | navigation::Action::SelectOption(view) => { self.active_view = view; Action::None } navigation::Action::None => Action::None, }, Message::SetBuckets(buckets) => { self.buckets = buckets.clone(); self.balances_view .update(balances_view::Message::SetBuckets(buckets.clone())); self.buckets_view .update(buckets_view::Message::SetBuckets(buckets.clone())); self.transactions_view .update(transactions_view::Message::SetBuckets(buckets)); Action::None } Message::SetAccounts(accounts) => { self.transactions_view .update(transactions_view::Message::SetAccounts(accounts)); Action::None } Message::SetTransactions(transactions) => { self.transactions_view .update(transactions_view::Message::SetTransactions(transactions)); Action::None } Message::NextItem => match self.active_view { View::Balances => { self.balances_view .update(balances_view::Message::SelectNextBucket); Action::None } View::Buckets => { self.buckets_view.update(buckets_view::Message::SelectNext); Action::None } View::Transactions => { self.transactions_view .update(transactions_view::Message::SelectNextAccount); Action::None } }, Message::PrevItem => match self.active_view { View::Balances => { self.balances_view .update(balances_view::Message::SelectPrevBucket); Action::None } View::Buckets => { self.buckets_view.update(buckets_view::Message::SelectPrev); Action::None } View::Transactions => { self.transactions_view .update(transactions_view::Message::SelectPrevAccount); Action::None } }, Message::ExpandItem => match self.active_view { View::Balances => Action::None, View::Buckets => match self.buckets_view.active_group() { Some(active_group) => { match self.buckets_view.update(buckets_view::Message::ExpandGroup( active_group.clone(), self.buckets .iter() .filter(|bucket| bucket.group.eq(&active_group)) .cloned() .collect(), )) { buckets_view::Action::None => Action::None, } } None => Action::None, }, View::Transactions => Action::None, }, Message::CollapseItem => match self.active_view { View::Balances => Action::None, View::Buckets => match self.buckets_view.active_group() { Some(active_group) => { match self .buckets_view .update(buckets_view::Message::CollapseGroup(active_group)) { buckets_view::Action::None => Action::None, } } None => Action::None, }, View::Transactions => Action::None, }, } } } impl MainScreen { pub fn new() -> Self { Self { balances_view: BalancesView::new(Vec::new()), buckets: Vec::new(), buckets_view: BucketsView::new(Vec::new(), "Hello, buckets!"), transactions_view: TransactionsView::new(&[], &[], &[]), active_view: View::Balances, view_navigation: Navigation::new(Some(View::Balances), View::views()), } } }