diff --git a/src/main.rs b/src/main.rs index 4bb063e..98910fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -570,6 +570,7 @@ impl cosmic::Application for App { } match self.presenter.update(message) { presenter::Action::Task(task) => task.map(|m| { + debug!("Should run future"); cosmic::Action::App(Message::Present(m)) }), presenter::Action::None => Task::none(), @@ -616,6 +617,7 @@ impl cosmic::Application for App { presenter::Action::PrevSlide => { let slide_index = self.current_item.1; let item_index = self.current_item.0; + let mut tasks = vec![]; if let Some(item) = self.service.get(item_index) { @@ -623,14 +625,24 @@ impl cosmic::Application for App { let slide = item.slides [slide_index - 1] .clone(); - self.presenter.update( + let action = self.presenter.update( presenter::Message::SlideChange( slide, ), ); + match action { + presenter::Action::Task(task) => { + tasks.push(task.map(|m| { + cosmic::Action::App( + Message::Present(m), + ) + })) + } + _ => todo!(), + } self.current_item = (item_index, slide_index - 1); - Task::none() + Task::batch(tasks) } else if slide_index == 0 && item_index == 0 { @@ -653,9 +665,24 @@ impl cosmic::Application for App { if let Some(item) = self.service.get(item_index - 1) { - self.presenter.update(presenter::Message::SlideChange(item.slides[previous_item_slides_length - 1].clone())); + let action = self.presenter.update(presenter::Message::SlideChange(item.slides[previous_item_slides_length - 1].clone())); + match action { + presenter::Action::Task( + task, + ) => { + tasks + .push(task.map(|m| { + cosmic::Action::App( + Message::Present( + m, + ), + ) + })) + } + _ => todo!(), + } } - Task::none() + Task::batch(tasks) } } else { Task::none() diff --git a/src/ui/presenter.rs b/src/ui/presenter.rs index 46bab48..a30e1e0 100644 --- a/src/ui/presenter.rs +++ b/src/ui/presenter.rs @@ -232,44 +232,45 @@ impl Presenter { let mut tasks = vec![]; tasks.push(scroll_to(self.scroll_id.clone(), offset)); - if let Some(audio) = &mut self.current_slide.audio() { - let audio = audio.to_str().unwrap().to_string(); - let audio = if let Some(audio) = - audio.strip_prefix(r"file://") + if let Some(mut new_audio) = + self.current_slide.audio() + { + if let Some(stripped_audio) = new_audio + .to_str() + .unwrap() + .to_string() + .strip_prefix(r"file://") { - audio - } else { - audio.as_str() - }; - let audio = PathBuf::from(audio); - debug!("{:?}", audio); - if audio.exists() { + new_audio = PathBuf::from(stripped_audio); + } + debug!("{:?}", new_audio); + if new_audio.exists() { let old_audio = self.audio.clone(); match old_audio { Some(current_audio) - if current_audio != audio => + if current_audio != *new_audio => { - self.audio = Some(audio.clone()); + self.audio = Some(new_audio.clone()); debug!( - ?audio, + ?new_audio, ?current_audio, - "starting audio" + "audio needs to change" ); tasks.push(self.start_audio()); } Some(current_audio) => { debug!( - ?audio, + ?new_audio, ?current_audio, - "could not find audio" + "Same audio shouldn't change" ); } None => { debug!( - ?audio, - "could not find audio" + ?new_audio, + "could not find audio, need to change" ); - self.audio = Some(audio.clone()); + self.audio = Some(new_audio.clone()); tasks.push(self.start_audio()); } }; @@ -281,6 +282,8 @@ impl Presenter { self.audio = None; self.update(Message::EndAudio); } + let task_count = tasks.len(); + debug!(?task_count); return Action::Task(Task::batch(tasks)); } Message::ChangeFont(s) => { @@ -391,18 +394,6 @@ impl Presenter { Action::None } - fn start_audio(&mut self) -> Task { - if let Some(audio) = &mut self.audio { - let audio = audio.clone(); - Task::perform( - start_audio(Arc::clone(&self.sink.1), audio), - |_| Message::None, - ) - } else { - Task::none() - } - } - pub fn view(&self) -> Element { slide_view( self.current_slide.clone(), @@ -540,10 +531,26 @@ impl Presenter { } } } + + fn start_audio(&mut self) -> Task { + if let Some(audio) = &mut self.audio { + debug!(?audio, "This is where audio should be changing"); + let audio = audio.clone(); + Task::perform( + start_audio(Arc::clone(&self.sink.1), audio), + |_| Message::None, + ) + } else { + debug!(?self.audio, "Apparently this doesn't exist"); + Task::none() + } + } } +// This needs to be async so that rodio's audio will work #[allow(clippy::unused_async)] async fn start_audio(sink: Arc, audio: PathBuf) { + debug!(?audio); let file = BufReader::new(File::open(audio).unwrap()); debug!(?file); let source = Decoder::new(file).unwrap();