We have a working build that is performant enough for text_svg
Some checks failed
/ test (push) Has been cancelled

This commit is contained in:
Chris Cochrun 2025-09-07 07:07:27 -05:00
parent fae83aedc5
commit 9971ccdf30
2 changed files with 74 additions and 65 deletions

View file

@ -202,15 +202,19 @@ impl Presenter {
// )); // ));
} }
Message::SlideChange(slide) => { Message::SlideChange(slide) => {
debug!(?slide, "slide changed"); let slide_text = slide.text();
let old_background = debug!(slide_text, "slide changed");
self.current_slide.background().clone(); debug!("comparing background...");
let backgrounds_match =
self.current_slide.background()
== slide.background();
// self.current_slide_index = slide; // self.current_slide_index = slide;
debug!("cloning slide...");
self.current_slide = slide.clone(); self.current_slide = slide.clone();
let _ = let _ =
self.update(Message::ChangeFont(slide.font())); self.update(Message::ChangeFont(slide.font()));
if self.current_slide.background() != &old_background debug!("changing video now...");
{ if !backgrounds_match {
if let Some(video) = &mut self.video { if let Some(video) = &mut self.video {
let _ = video.restart_stream(); let _ = video.restart_stream();
} }
@ -228,6 +232,7 @@ impl Presenter {
}, },
y: 0.0, y: 0.0,
}; };
debug!(?offset);
let mut tasks = vec![]; let mut tasks = vec![];
tasks.push(scroll_to(self.scroll_id.clone(), offset)); tasks.push(scroll_to(self.scroll_id.clone(), offset));
@ -249,12 +254,12 @@ impl Presenter {
Some(current_audio) Some(current_audio)
if current_audio != *new_audio => if current_audio != *new_audio =>
{ {
self.audio = Some(new_audio.clone());
debug!( debug!(
?new_audio, ?new_audio,
?current_audio, ?current_audio,
"audio needs to change" "audio needs to change"
); );
self.audio = Some(new_audio.clone());
tasks.push(self.start_audio()); tasks.push(self.start_audio());
} }
Some(current_audio) => { Some(current_audio) => {
@ -395,7 +400,7 @@ impl Presenter {
pub fn view(&self) -> Element<Message> { pub fn view(&self) -> Element<Message> {
slide_view( slide_view(
self.current_slide.clone(), &self.current_slide,
&self.video, &self.video,
self.current_font, self.current_font,
false, false,
@ -405,7 +410,7 @@ impl Presenter {
pub fn view_preview(&self) -> Element<Message> { pub fn view_preview(&self) -> Element<Message> {
slide_view( slide_view(
self.current_slide.clone(), &self.current_slide,
&self.video, &self.video,
self.current_font, self.current_font,
false, false,
@ -441,7 +446,7 @@ impl Presenter {
); );
let container = slide_view( let container = slide_view(
slide.clone(), &slide,
&self.video, &self.video,
font, font,
true, true,
@ -695,22 +700,21 @@ fn scale_font(font_size: f32, width: f32) -> f32 {
} }
} }
pub(crate) fn slide_view( pub(crate) fn slide_view<'a>(
slide: Slide, slide: &'a Slide,
video: &Option<Video>, video: &'a Option<Video>,
font: Font, font: Font,
delegate: bool, delegate: bool,
hide_mouse: bool, hide_mouse: bool,
) -> Element<'_, Message> { ) -> Element<'a, Message> {
let res = responsive(move |size| { let res = responsive(move |size| {
let width = size.height * 16.0 / 9.0; let width = size.height * 16.0 / 9.0;
let slide_text = slide.text(); // let slide_text = slide.text();
// let font = SvgFont::from(font).size(font_size.floor() as u8); // let font = SvgFont::from(font).size(font_size.floor() as u8);
// let text_container = if delegate { // let text_container = if delegate {
// // text widget based // // text widget based
// let font_size = // let font_size = scale_font(slide.font_size() as f32, width);
// scale_font(slide.font_size() as f32, width);
// let lines = slide_text.lines(); // let lines = slide_text.lines();
// let text: Vec<Element<Message>> = lines // let text: Vec<Element<Message>> = lines
// .map(|t| { // .map(|t| {
@ -741,9 +745,9 @@ pub(crate) fn slide_view(
// }) // })
// .collect(); // .collect();
// let text = Column::with_children(text).spacing(26); // let text = Column::with_children(text).spacing(26);
// Container::new(text) // let text = Container::new(text)
// .center(Length::Fill) // .center(Length::Fill)
// .align_x(Horizontal::Left) // .align_x(Horizontal::Left);
// } else { // } else {
// // SVG based // // SVG based
// let text: Element<Message> = // let text: Element<Message> =
@ -813,7 +817,7 @@ pub(crate) fn slide_view(
if let Some(text) = &slide.text_svg { if let Some(text) = &slide.text_svg {
if let Some(handle) = &text.handle { if let Some(handle) = &text.handle {
image(handle) image(handle)
.content_fit(ContentFit::Cover) .content_fit(ContentFit::ScaleDown)
.width(width) .width(width)
.height(size.height) .height(size.height)
.into() .into()

View file

@ -244,20 +244,20 @@ impl TextSvg {
pub fn build(mut self) -> Self { pub fn build(mut self) -> Self {
debug!("starting..."); debug!("starting...");
let mut path = dirs::data_local_dir().unwrap(); // let mut path = dirs::data_local_dir().unwrap();
path.push(PathBuf::from("lumina")); // path.push(PathBuf::from("lumina"));
path.push(PathBuf::from("temp")); // path.push(PathBuf::from("temp"));
let file_title = // let file_title =
&self.text.lines().next().unwrap().trim_end(); // &self.text.lines().next().unwrap().trim_end();
path.push(PathBuf::from(file_title)); // path.push(PathBuf::from(file_title));
path.set_extension("png"); // path.set_extension("png");
if path.exists() { // if path.exists() {
debug!("cached"); // debug!("cached");
let handle = Handle::from_path(path); // let handle = Handle::from_path(path);
self.handle = Some(handle); // self.handle = Some(handle);
return self; // return self;
} // }
let shadow = if let Some(shadow) = &self.shadow { let shadow = if let Some(shadow) = &self.shadow {
format!("<filter id=\"shadow\"><feDropShadow dx=\"{}\" dy=\"{}\" stdDeviation=\"{}\" flood-color=\"{}\"/></filter>", format!("<filter id=\"shadow\"><feDropShadow dx=\"{}\" dy=\"{}\" stdDeviation=\"{}\" flood-color=\"{}\"/></filter>",
shadow.offset_x, shadow.offset_x,
@ -322,10 +322,15 @@ impl TextSvg {
Pixmap::new(size.width as u32, size.height as u32) Pixmap::new(size.width as u32, size.height as u32)
.expect("opops"); .expect("opops");
resvg::render(&resvg_tree, transform, &mut pixmap.as_mut()); resvg::render(&resvg_tree, transform, &mut pixmap.as_mut());
let _ = pixmap.save_png(&path); // let _ = pixmap.save_png(&path);
debug!("rendered"); debug!("rendered");
let handle = Handle::from_path(path); // let handle = Handle::from_path(path);
let handle = Handle::from_rgba(
size.width as u32,
size.height as u32,
pixmap.take(),
);
self.handle = Some(handle); self.handle = Some(handle);
debug!("stored"); debug!("stored");
self self