summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui/components/buckets_view.rs
diff options
context:
space:
mode:
Diffstat (limited to 'schist_desktop_gui/src/gui/components/buckets_view.rs')
-rw-r--r--schist_desktop_gui/src/gui/components/buckets_view.rs105
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,
+ }
+ }
+ }
+ }
+}