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:
parent
d8699721b7
commit
4500fe7bf1
20
src/main.rs
20
src/main.rs
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in a new issue