diff options
Diffstat (limited to 'schist_desktop_gui/src/gui.rs')
| -rw-r--r-- | schist_desktop_gui/src/gui.rs | 132 |
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) +} |
