changing presenter to use an action instead of the Task<Message>

This also helped me to find a bug in the system where we weren't
changing the audio if the slide we change to doesn't have audio.
This commit is contained in:
Chris Cochrun 2025-03-24 21:58:40 -05:00
parent d8699721b7
commit 4500fe7bf1
3 changed files with 49 additions and 46 deletions

View file

@ -8,9 +8,7 @@ use cosmic::app::{Core, Settings, Task};
use cosmic::iced::clipboard::dnd::DndAction;
use cosmic::iced::keyboard::{Key, Modifiers};
use cosmic::iced::window::{Mode, Position};
use cosmic::iced::{
self, event, window, Color, Length, Padding, Point,
};
use cosmic::iced::{self, event, window, Length, Padding, Point};
use cosmic::iced_futures::Subscription;
use cosmic::iced_widget::{column, row};
use cosmic::widget::dnd_destination::DragId;
@ -28,7 +26,6 @@ use cosmic::{widget::Container, Theme};
use crisp::types::Value;
use lisp::parse_lisp;
use miette::{miette, Result};
use sqlx::{SqliteConnection, SqlitePool};
use std::collections::BTreeMap;
use std::fs::read_to_string;
use std::path::PathBuf;
@ -304,13 +301,14 @@ impl cosmic::Application for App {
let editor_toggle = toggler(self.editor_mode.is_some())
.label("Editor")
.spacing(10)
.width(Length::Shrink)
.on_toggle(Message::EditorToggle);
let presenter_window = self.windows.get(1);
let text = if self.presentation_open {
text::body("Close Presentation")
text::body("End Presentation")
} else {
text::body("Open Presentation")
text::body("Present")
};
vec![
@ -449,10 +447,14 @@ impl cosmic::Application for App {
video.set_muted(false);
}
}
self.presenter.update(message).map(|x| {
match self.presenter.update(message) {
// debug!(?x);
cosmic::app::Message::App(Message::None)
})
// cosmic::app::Message::App(Message::None)
presenter::Action::Task(task) => task.map(|m| {
cosmic::app::Message::App(Message::Present(m))
}),
presenter::Action::None => Task::none(),
}
}
Message::Library(message) => {
let mut song = Song::default();

View file

@ -358,6 +358,8 @@ impl<'a> Library {
model.items.iter().enumerate().map(
|(index, item)| {
let service_item = item.to_service_item();
let drag_item =
self.single_item(index, item, model);
let visual_item = self
.single_item(index, item, model)
.map(|_| Message::None);
@ -384,8 +386,6 @@ impl<'a> Library {
)),
)
// .drag_icon(move |i| {
// let drag_item =
// self.single_item(index, item, model);
// let state =
// drag_item.as_widget().state();
// (drag_item, state, i)

View file

@ -50,6 +50,11 @@ pub(crate) struct Presenter {
current_font: Font,
}
pub enum Action {
Task(Task<Message>),
None,
}
#[derive(Debug, Clone)]
pub(crate) enum Message {
NextSlide,
@ -153,7 +158,7 @@ impl Presenter {
}
}
pub fn update(&mut self, message: Message) -> Task<Message> {
pub fn update(&mut self, message: Message) -> Action {
match message {
Message::NextSlide => {
debug!("next slide");
@ -161,21 +166,21 @@ impl Presenter {
== self.current_slide_index
{
debug!("no more slides");
return Task::none();
return Action::None;
}
self.update(Message::SlideChange(
return self.update(Message::SlideChange(
self.current_slide_index + 1,
))
));
}
Message::PrevSlide => {
debug!("prev slide");
if 0 == self.current_slide_index {
debug!("beginning slides");
return Task::none();
return Action::None;
}
self.update(Message::SlideChange(
return self.update(Message::SlideChange(
self.current_slide_index - 1,
))
));
}
Message::SlideChange(id) => {
debug!(id, "slide changed");
@ -224,24 +229,23 @@ impl Presenter {
match &self.audio {
Some(aud) if aud != &audio => {
self.audio = Some(audio.clone());
tasks.push(
self.update(Message::StartAudio),
);
tasks.push(self.start_audio());
}
Some(_) => (),
None => {
self.audio = Some(audio.clone());
tasks.push(
self.update(Message::StartAudio),
);
tasks.push(self.start_audio());
}
};
} else {
self.audio = None;
tasks.push(self.update(Message::EndAudio));
self.update(Message::EndAudio);
}
} else {
self.audio = None;
self.update(Message::EndAudio);
}
Task::batch(tasks)
return Action::Task(Task::batch(tasks));
}
Message::ChangeFont(s) => {
let font_name = s.into_boxed_str();
@ -256,7 +260,6 @@ impl Presenter {
style,
};
self.current_font = font;
Task::none()
}
Message::EndVideo => {
// if self.current_slide.video_loop() {
@ -269,7 +272,6 @@ impl Presenter {
// }
// }
// }
Task::none()
}
Message::StartVideo => {
if let Some(video) = &mut self.video {
@ -277,7 +279,6 @@ impl Presenter {
video
.set_looping(self.current_slide.video_loop());
}
Task::none()
}
Message::VideoPos(position) => {
if let Some(video) = &mut self.video {
@ -294,20 +295,18 @@ impl Presenter {
),
}
}
Task::none()
}
Message::VideoFrame => {
if let Some(video) = &self.video {
self.video_position =
video.position().as_secs_f32();
}
Task::none()
}
Message::MissingPlugin(element) => {
if let Some(video) = &mut self.video {
video.set_paused(true);
}
Task::perform(
return Action::Task(Task::perform(
async move {
tokio::task::spawn_blocking(move || {
match gst_pbutils::MissingPluginMessage::parse(&element) {
@ -337,13 +336,26 @@ impl Presenter {
.unwrap()
},
|x| x,
)
));
}
Message::HoveredSlide(slide) => {
self.hovered_slide = slide;
Task::none()
}
Message::StartAudio => {
return Action::Task(self.start_audio())
}
Message::EndAudio => {
self.sink.1.stop();
}
Message::None => debug!("Presenter Message::None"),
Message::Error(error) => {
error!(error);
}
};
Action::None
}
fn start_audio(&mut self) -> Task<Message> {
if let Some(audio) = &mut self.audio {
let audio = audio.clone();
Task::perform(
@ -354,17 +366,6 @@ impl Presenter {
Task::none()
}
}
Message::EndAudio => {
self.sink.1.stop();
Task::none()
}
Message::None => Task::none(),
Message::Error(error) => {
error!(error);
Task::none()
}
}
}
pub fn view(&self) -> Element<Message> {
slide_view(