use iced::{ alignment, widget::{column, row, Container}, Length, }; use schist_models::Bucket; use crate::{ gui::components::{navigation, BucketNameAndBalance, Navigation, Text}, style::SPACING_LG, traits::{Component, Viewable}, }; #[derive(Clone, Debug)] pub struct BucketsView { buckets: Vec, greeting: String, navigation: Navigation, } #[derive(Clone, Debug)] pub enum Message { NavigationMessage(navigation::Message), SelectNextBucket, SelectPrevBucket, SetBuckets(Vec), } pub enum Action { None, } impl BucketsView { pub fn new(buckets: Vec, greeting: &str) -> Self { Self { buckets: buckets.clone(), greeting: greeting.to_owned(), navigation: Navigation::new( buckets.first().cloned().map(BucketNameAndBalance::new), buckets.into_iter().map(BucketNameAndBalance::new).collect(), ), } } fn update_greeting(&mut self, active_bucket: &Bucket) { self.greeting = format!("Hello, {} bucket!", active_bucket.name); } } impl<'a> Viewable<'a, Message> for BucketsView { fn view(&'a self) -> iced::Element<'a, Message> where Message: 'a, { 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 BucketsView { fn update(&mut self, message: Message) -> Action { match message { Message::SetBuckets(buckets) => { self.buckets = buckets.clone(); self.navigation.update(navigation::Message::SetOptions( buckets.into_iter().map(BucketNameAndBalance::new).collect(), )); Action::None } Message::NavigationMessage(message) => match self.navigation.update(message) { navigation::Action::SelectOption(bucket) => { self.update_greeting(&bucket.bucket); Action::None } navigation::Action::None => Action::None, }, Message::SelectNextBucket => { match self.navigation.update(navigation::Message::SelectNext) { navigation::Action::SelectOption(bucket) => { self.update_greeting(&bucket.bucket); Action::None } navigation::Action::None => Action::None, } } Message::SelectPrevBucket => { match self.navigation.update(navigation::Message::SelectPrev) { navigation::Action::SelectOption(bucket) => { self.update_greeting(&bucket.bucket); Action::None } navigation::Action::None => Action::None, } } } } }