summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui.rs
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.rs
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.rs')
-rw-r--r--schist_desktop_gui/src/gui.rs132
1 files changed, 132 insertions, 0 deletions
diff --git a/schist_desktop_gui/src/gui.rs b/schist_desktop_gui/src/gui.rs
new file mode 100644
index 0000000..0f84f41
--- /dev/null
+++ b/schist_desktop_gui/src/gui.rs
@@ -0,0 +1,132 @@
+pub mod components;
+pub mod screens;
+
+use iced::Element;
+use schist_models::{account::Account, bucket::Bucket};
+
+use crate::{
+ config::Config,
+ dummy_data::{self, fetch_accounts, fetch_buckets},
+ gui::screens::{main_screen, MainScreen, Screen},
+ shortcut::KeyBind,
+ traits::{Component, Viewable},
+};
+
+#[derive(Clone, Debug)]
+pub enum Message {
+ Event(iced::Event),
+ MainScreenMessage(main_screen::Message),
+ RefetchedAccounts(Result<Vec<Account>, dummy_data::Error>),
+ RefetchedBuckets(Result<Vec<Bucket>, dummy_data::Error>),
+}
+
+pub struct Gui {
+ active_screen: Screen,
+ buckets: Vec<Bucket>,
+ main_screen: MainScreen,
+ config: Config,
+}
+
+impl Gui {
+ pub fn new() -> (Self, iced::Task<Message>) {
+ let tasks = vec![
+ iced::Task::perform(fetch_buckets(), Message::RefetchedBuckets),
+ iced::Task::perform(fetch_accounts(), Message::RefetchedAccounts),
+ ];
+ let buckets = Vec::new();
+ let accounts = Vec::new();
+ let gui = Self {
+ active_screen: Screen::Main,
+ buckets: buckets.clone(),
+ main_screen: MainScreen::new(buckets, accounts),
+ config: Config::default(),
+ };
+ (gui, iced::Task::batch(tasks))
+ }
+}
+
+impl Gui {
+ pub fn view(&self) -> Element<Message> {
+ match self.active_screen {
+ Screen::Main => self.main_screen.view().map(Message::MainScreenMessage),
+ }
+ }
+
+ pub fn update(&mut self, message: Message) -> iced::Task<Message> {
+ match message {
+ Message::Event(iced::Event::Keyboard(iced::keyboard::Event::KeyPressed {
+ key,
+ modifiers,
+ ..
+ })) => {
+ let key_bind = KeyBind::from((key.clone(), modifiers));
+ if let Some(command) = self
+ .config
+ .keyboard
+ .shortcuts()
+ .iter()
+ .find_map(|shortcut| shortcut.execute(&key_bind))
+ {
+ match command {
+ crate::shortcut::Command::GotoNextView => {
+ self.main_screen.update(main_screen::Message::SelectView(
+ self.main_screen.active_view.next(),
+ ));
+ iced::Task::none()
+ }
+ crate::shortcut::Command::GotoPrevView => {
+ self.main_screen.update(main_screen::Message::SelectView(
+ self.main_screen.active_view.prev(),
+ ));
+ iced::Task::none()
+ }
+ crate::shortcut::Command::GotoView(view) => {
+ self.main_screen
+ .update(main_screen::Message::SelectView(view));
+ iced::Task::none()
+ }
+ crate::shortcut::Command::GotoNextItem => {
+ self.main_screen.update(main_screen::Message::NextItem);
+ iced::Task::none()
+ }
+ crate::shortcut::Command::GotoPrevItem => {
+ self.main_screen.update(main_screen::Message::PrevItem);
+ iced::Task::none()
+ }
+ }
+ } else {
+ iced::Task::none()
+ }
+ }
+ Message::Event(_) => iced::Task::none(),
+ Message::MainScreenMessage(message) => match self.main_screen.update(message) {
+ main_screen::Action::None => iced::Task::none(),
+ },
+ Message::RefetchedBuckets(buckets) => {
+ match buckets {
+ Ok(buckets) => {
+ self.buckets = buckets.clone();
+ self.main_screen
+ .update(main_screen::Message::SetBuckets(buckets));
+ }
+ Err(err) => println!("Failed to get buckets: {:?}", err),
+ };
+ iced::Task::none()
+ }
+ Message::RefetchedAccounts(accounts) => {
+ match accounts {
+ Ok(accounts) => {
+ self.main_screen
+ .update(main_screen::Message::SetAccounts(accounts));
+ }
+ Err(err) => println!("Failed to get accounts: {:?}", err),
+ }
+ iced::Task::none()
+ }
+ }
+ }
+}
+
+pub fn subscription(_state: &Gui) -> iced::Subscription<Message> {
+ iced::event::listen().map(Message::Event)
+}