diff options
| author | Joe Carstairs <me@joeac.net> | 2025-08-13 07:50:21 +0000 |
|---|---|---|
| committer | joeac <me@joeac.net> | 2025-08-13 07:50:21 +0000 |
| commit | ee3cd780e21260257b401c3f5cbababd9e27a15a (patch) | |
| tree | b0571649a1a1a7644dbc50183cc4c3a29966a963 /schist_desktop_gui/src/gui/screens | |
| parent | 49342e8b553d5c92f1c043b3b0ce18bdf1c2cd44 (diff) | |
task-073
Co-authored-by: Joe Carstairs <jcarstairs@scottlogic.com>
Reviewed-on: https://git.joeac.net/joeac/schist/pulls/1
Co-authored-by: Joe Carstairs <me@joeac.net>
Co-committed-by: Joe Carstairs <me@joeac.net>
Diffstat (limited to 'schist_desktop_gui/src/gui/screens')
3 files changed, 215 insertions, 0 deletions
diff --git a/schist_desktop_gui/src/gui/screens/main_screen.rs b/schist_desktop_gui/src/gui/screens/main_screen.rs new file mode 100644 index 0000000..21ef44a --- /dev/null +++ b/schist_desktop_gui/src/gui/screens/main_screen.rs @@ -0,0 +1,7 @@ +mod main_screen; +mod view; + +pub use main_screen::Action; +pub use main_screen::MainScreen; +pub use main_screen::Message; +pub use view::View; diff --git a/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs b/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs new file mode 100644 index 0000000..bad3dee --- /dev/null +++ b/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs @@ -0,0 +1,160 @@ +use super::View; +use iced::{ + alignment, + widget::{row, Container}, + Element, Length, +}; +use schist_models::{account::Account, bucket::Bucket}; + +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<Bucket>, + pub balances_view: BalancesView, + pub buckets_view: BucketsView, + pub transactions_view: TransactionsView, + pub view_navigation: Navigation<View>, +} + +#[derive(Clone, Debug)] +pub enum Message { + BalancesViewMessage(balances_view::Message), + BucketsViewMessage(buckets_view::Message), + NextItem, + PrevItem, + TransactionsViewMessage(transactions_view::Message), + SelectView(View), + SetAccounts(Vec<Account>), + SetBuckets(Vec<Bucket>), + ViewNavigationMessage(navigation::Message<View>), +} + +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(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::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)); + Action::None + } + Message::SetAccounts(accounts) => { + self.transactions_view + .update(transactions_view::Message::SetAccounts(accounts)); + 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::SelectNextBucket); + Action::None + } + View::Transactions => { + self.transactions_view + .update(transactions_view::Message::SelectNextTransaction); + 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::SelectPrevBucket); + Action::None + } + View::Transactions => { + self.transactions_view + .update(transactions_view::Message::SelectPrevTransaction); + Action::None + } + }, + } + } +} + +impl MainScreen { + pub fn new(buckets: Vec<Bucket>, accounts: Vec<Account>) -> Self { + Self { + balances_view: BalancesView::new(buckets.clone()), + buckets: buckets.clone(), + buckets_view: BucketsView::new(buckets, "Hello, buckets!"), + transactions_view: TransactionsView::new(accounts, "Hello, transactions!"), + active_view: View::Balances, + view_navigation: Navigation::new(Some(View::Balances), View::views()), + } + } +} diff --git a/schist_desktop_gui/src/gui/screens/main_screen/view.rs b/schist_desktop_gui/src/gui/screens/main_screen/view.rs new file mode 100644 index 0000000..eb9c88e --- /dev/null +++ b/schist_desktop_gui/src/gui/screens/main_screen/view.rs @@ -0,0 +1,48 @@ +use iced::Element; + +use crate::gui::components::navigation; + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum View { + Balances, + Buckets, + Transactions, +} + +impl View { + pub const VIEW_1: View = View::Buckets; + pub const VIEW_2: View = View::Balances; + pub const VIEW_3: View = View::Transactions; + + pub fn views() -> Vec<View> { + vec![Self::VIEW_1, Self::VIEW_2, Self::VIEW_3] + } + + pub const fn name(self) -> &'static str { + match self { + View::Balances => "balances", + View::Buckets => "buckets", + View::Transactions => "transactions", + } + } + + pub fn next(&self) -> View { + match *self { + Self::VIEW_1 => Self::VIEW_2, + Self::VIEW_2 | Self::VIEW_3 => Self::VIEW_3, + } + } + + pub fn prev(&self) -> View { + match *self { + Self::VIEW_1 | Self::VIEW_2 => Self::VIEW_1, + Self::VIEW_3 => Self::VIEW_2, + } + } +} + +impl<'a> Into<Element<'a, navigation::Message<View>>> for View { + fn into(self) -> Element<'a, navigation::Message<View>> { + iced::widget::text(self.name()).into() + } +} |
