diff options
Diffstat (limited to 'schist_desktop_gui/src/gui/components/buckets_view.rs')
| -rw-r--r-- | schist_desktop_gui/src/gui/components/buckets_view.rs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/schist_desktop_gui/src/gui/components/buckets_view.rs b/schist_desktop_gui/src/gui/components/buckets_view.rs new file mode 100644 index 0000000..d27b7ff --- /dev/null +++ b/schist_desktop_gui/src/gui/components/buckets_view.rs @@ -0,0 +1,105 @@ +use iced::{ + alignment, + widget::{column, row, Container}, + Length, +}; +use schist_models::bucket::Bucket; + +use crate::{ + gui::components::{navigation, BucketNameAndBalance, Navigation}, + style::SPACING_LG, + traits::{Component, Viewable}, +}; + +#[derive(Clone, Debug)] +pub struct BucketsView { + buckets: Vec<Bucket>, + greeting: String, + navigation: Navigation<BucketNameAndBalance>, +} + +#[derive(Clone, Debug)] +pub enum Message { + NavigationMessage(navigation::Message<BucketNameAndBalance>), + SelectNextBucket, + SelectPrevBucket, + SetBuckets(Vec<Bucket>), +} + +pub enum Action { + None, +} + +impl BucketsView { + pub fn new(buckets: Vec<Bucket>, 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![iced::widget::text(self.greeting.clone())]; + 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, + } + } + } + } +} |
