use iced::{ alignment, widget::{column, row, Container}, Element, Length, }; use schist_models::Account; use crate::{ gui::components::{navigation, Navigation, Text}, style::SPACING_LG, traits::{Component, Viewable}, }; #[derive(Clone, Debug)] pub struct TransactionsView { accounts: Vec, greeting: String, navigation: Navigation, } #[derive(Clone, Debug)] pub enum Message { NavigationMessage(navigation::Message), SelectNextTransaction, SelectPrevTransaction, SetAccounts(Vec), } pub enum Action { None, } impl TransactionsView { pub fn new(accounts: Vec, greeting: &str) -> Self { let account_names = view_account_names(accounts.clone()); let navigation = Navigation::new(account_names.clone().first().cloned(), account_names); Self { accounts: accounts, greeting: greeting.to_owned(), navigation: navigation, } } } impl<'a> Viewable<'a, Message> for TransactionsView { fn view(&'a self) -> Element<'a, Message> { let navigation = self.navigation.view().map(Message::NavigationMessage); let main_content = column![Text::default(&self.greeting).as_element()]; row![ Container::new(navigation).width(Length::FillPortion(1)), Container::new(main_content).width(Length::FillPortion(3)), ] .align_y(alignment::Vertical::Center) .height(Length::Fill) .spacing(SPACING_LG) .into() } } impl<'a> Component<'a, Message, Action> for TransactionsView { fn update(&mut self, message: Message) -> Action { match message { Message::NavigationMessage(message) => { match self.navigation.update(message) { navigation::Action::SelectOption(group_name) => { self.greeting = make_greeting(group_name); Action::None } navigation::Action::None => Action::None, }; Action::None } Message::SetAccounts(accounts) => { self.accounts = accounts.clone(); match self .navigation .update(navigation::Message::SetOptions(view_account_names( accounts, ))) { navigation::Action::SelectOption(option) => { self.greeting = make_greeting(option); Action::None } navigation::Action::None => Action::None, } } Message::SelectNextTransaction => { match self.navigation.update(navigation::Message::SelectNext) { navigation::Action::SelectOption(option) => { self.greeting = make_greeting(option); Action::None } navigation::Action::None => Action::None, } } Message::SelectPrevTransaction => { match self.navigation.update(navigation::Message::SelectPrev) { navigation::Action::SelectOption(option) => { self.greeting = make_greeting(option); Action::None } navigation::Action::None => Action::None, } } } } } fn make_greeting(account_name: Text) -> String { format!("Hello, {} account!", account_name.content) } fn view_account_names(accounts: Vec) -> Vec { accounts .iter() .map(|acc| Text::new(acc.name.as_str())) .collect() }