use crate::{ gui::components::{navigation, Panel}, traits::Component, }; use super::{Action, FilesScreen, Message, OptionId}; impl<'a> Component<'a, Message, Action> for FilesScreen { fn update(&mut self, message: Message) -> Action { match message { Message::NavigationMessage(message) => self.update_options(message), Message::NextOption => self.update_options(navigation::Message::SelectNext), Message::PrevOption => self.update_options(navigation::Message::SelectPrev), Message::ActivateSelectedOption => match &self.options.active_option { Some(option) => { self.update_options(navigation::Message::ActivateOption(option.clone())) } None => Action::None, }, Message::ReportFailedToOpenFile(path, err) => { self.report_err(OptionId::OpenFile(path), &err, "Failed to open file"); Action::None } Message::ReportFailedToCreateFile(err) => { self.report_err(OptionId::NewFile, &err, "Failed to create new file"); Action::None } Message::ReportFailedToImportFromActualbudget(err) => { self.report_err( OptionId::ImportFromActualbudget, &err, "Failed to import from Actualbudget", ); Action::None } Message::ReportFailedToPickFile(err) => { self.report_err(OptionId::PickFile, &err, "Failed to choose file"); Action::None } } } } impl FilesScreen { fn report_err(&mut self, id: OptionId, err: &str, dialog_title: &str) { let old_panel = self.options.find(|o| o.id == id); let file_panel_with_err = Panel::new( id.clone(), old_panel.as_ref().map(|p| p.name.as_str()).unwrap_or(""), old_panel.as_ref().map(|p| p.small.clone()).flatten(), Some(err.to_string()), ); self.options .replace_first(|o| o.id == id, &vec![file_panel_with_err]); rfd::MessageDialog::new() .set_title(dialog_title) .set_level(rfd::MessageLevel::Error) .set_description(err) .show(); } fn update_options(&mut self, message: navigation::Message>) -> Action { match self.options.update(message) { navigation::Action::ActivateOption(option) => match option { Panel { id: OptionId::NewFile, .. } => Action::NewFile, Panel { id: OptionId::OpenFile(file_path), .. } => Action::OpenFile(file_path), Panel { id: OptionId::PickFile, .. } => Action::PickFile, Panel { id: OptionId::ImportFromActualbudget, .. } => Action::ImportFromActualbudget, }, navigation::Action::SelectOption(_) | navigation::Action::None => Action::None, } } }