better structur so presenter tasks get back to the runtime
Some checks are pending
/ test (push) Waiting to run

This commit is contained in:
Chris Cochrun 2025-08-18 05:35:42 -05:00
parent 1847a35f1e
commit 206f5b16a5
2 changed files with 70 additions and 36 deletions

View file

@ -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()

View file

@ -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<Message> {
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<Message> {
slide_view(
self.current_slide.clone(),
@ -540,10 +531,26 @@ impl Presenter {
}
}
}
fn start_audio(&mut self) -> Task<Message> {
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<Sink>, audio: PathBuf) {
debug!(?audio);
let file = BufReader::new(File::open(audio).unwrap());
debug!(?file);
let source = Decoder::new(file).unwrap();