summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui/screens
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2025-08-13 07:50:21 +0000
committerjoeac <me@joeac.net>2025-08-13 07:50:21 +0000
commitee3cd780e21260257b401c3f5cbababd9e27a15a (patch)
treeb0571649a1a1a7644dbc50183cc4c3a29966a963 /schist_desktop_gui/src/gui/screens
parent49342e8b553d5c92f1c043b3b0ce18bdf1c2cd44 (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')
-rw-r--r--schist_desktop_gui/src/gui/screens/main_screen.rs7
-rw-r--r--schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs160
-rw-r--r--schist_desktop_gui/src/gui/screens/main_screen/view.rs48
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()
+ }
+}