updating to use the in memory rendered images for text
Some checks are pending
/ test (push) Waiting to run

This commit is contained in:
Chris Cochrun 2025-09-05 13:05:54 -05:00
parent 6c8cb6c5b2
commit 035f8896f1
6 changed files with 482 additions and 65 deletions

View file

@ -142,6 +142,7 @@ enum Message {
AddServiceItem(usize, ServiceItem),
AddServiceItemDrop(usize),
AppendServiceItem(ServiceItem),
AddService(Vec<ServiceItem>),
}
const HEADER_SPACE: u16 = 6;
@ -174,7 +175,7 @@ impl cosmic::Application for App {
windows.push(core.main_window_id().unwrap());
}
let mut items = match read_to_string(input.file) {
let items = match read_to_string(input.file) {
Ok(lisp) => {
let mut service_items = vec![];
let lisp = crisp::reader::read(&lisp);
@ -200,23 +201,23 @@ impl cosmic::Application for App {
}
};
let items: Vec<ServiceItem> = items
.into_par_iter()
.map(|mut item| {
item.slides = item
.slides
.into_par_iter()
.map(|mut slide| {
text_svg::text_svg_generator(
&mut slide,
Arc::clone(&fontdb),
);
slide
})
.collect();
item
})
.collect();
// let items: Vec<ServiceItem> = items
// .into_par_iter()
// .map(|mut item| {
// item.slides = item
// .slides
// .into_par_iter()
// .map(|mut slide| {
// text_svg::text_svg_generator(
// &mut slide,
// Arc::clone(&fontdb),
// );
// slide
// })
// .collect();
// item
// })
// .collect();
let presenter = Presenter::with_items(items.clone());
let song_editor = SongEditor::new(Arc::clone(&fontdb));
@ -230,7 +231,7 @@ impl cosmic::Application for App {
presenter,
core,
nav_model,
service: items,
service: items.clone(),
file: PathBuf::default(),
windows,
presentation_open: false,
@ -243,7 +244,7 @@ impl cosmic::Application for App {
searching: false,
current_item: (0, 0),
library_dragged_item: None,
fontdb,
fontdb: Arc::clone(&fontdb),
};
let mut batch = vec![];
@ -257,7 +258,7 @@ impl cosmic::Application for App {
};
batch.push(app.add_library());
// batch.push(app.add_service(items));
batch.push(app.add_service(items, Arc::clone(&fontdb)));
let batch = Task::batch(batch);
(app, batch)
}
@ -944,6 +945,10 @@ impl cosmic::Application for App {
self.library = Some(library);
Task::none()
}
Message::AddService(service) => {
self.service = service;
Task::none()
}
Message::None => Task::none(),
Message::DndLeave(entity) => {
// debug!(?entity);
@ -1182,28 +1187,35 @@ where
})
}
// fn add_service(
// &mut self,
// items: Vec<ServiceItem>,
// ) -> Task<Message> {
// Task::perform(
// async move {
// for item in items {
// debug!(?item, "Item to be appended");
// let slides = item.to_slides().unwrap_or(vec![]);
// map.insert(item, slides);
// }
// let len = map.len();
// debug!(len, "to be append: ");
// map
// },
// |x| {
// let len = x.len();
// debug!(len, "to append: ");
// cosmic::Action::App(Message::AppendService(x))
// },
// )
// }
fn add_service(
&mut self,
items: Vec<ServiceItem>,
fontdb: Arc<fontdb::Database>,
) -> Task<Message> {
Task::perform(
async move {
let items: Vec<ServiceItem> = items
.into_par_iter()
.map(|mut item| {
item.slides = item
.slides
.into_par_iter()
.map(|mut slide| {
text_svg::text_svg_generator(
&mut slide,
Arc::clone(&fontdb),
);
slide
})
.collect();
item
})
.collect();
items
},
|x| cosmic::Action::App(Message::AddService(x)),
)
}
fn process_key_press(
&mut self,

View file

@ -812,7 +812,6 @@ pub(crate) fn slide_view(
let text: Element<Message> =
if let Some(text) = &slide.text_svg {
if let Some(handle) = &text.handle {
debug!("we made it boys");
Image::new(handle)
.content_fit(ContentFit::Cover)
.width(Length::Fill)

View file

@ -242,6 +242,7 @@ impl TextSvg {
}
pub fn build(mut self) -> Self {
debug!("starting...");
let shadow = if let Some(shadow) = &self.shadow {
format!("<filter id=\"shadow\"><feDropShadow dx=\"{}\" dy=\"{}\" stdDeviation=\"{}\" flood-color=\"{}\"/></filter>",
shadow.offset_x,
@ -260,12 +261,12 @@ impl TextSvg {
"".into()
};
let size = Size::new(3840.0, 2160.0);
let font_size = self.font.size as f32 * (size.width / 960.0);
let total_lines = self.text.lines().count();
let half_lines = (total_lines / 2) as f32;
let middle_position = size.height / 2.0;
let line_spacing = 10.0;
let text_and_line_spacing =
self.font.size as f32 + line_spacing;
let text_and_line_spacing = font_size + line_spacing;
let starting_y_position =
middle_position - (half_lines * text_and_line_spacing);
@ -289,9 +290,9 @@ impl TextSvg {
size.height,
shadow,
self.font.name,
self.font.size,
font_size,
self.fill, stroke, text);
debug!("starting...");
debug!("text string built...");
let resvg_tree = Tree::from_data(
&final_svg.as_bytes(),
&resvg::usvg::Options {
@ -314,9 +315,13 @@ impl TextSvg {
// &self.text.lines().next().unwrap().trim_end();
// path.push(PathBuf::from(file_title));
// path.set_extension("png");
// let _ = pixmap.save_png(path);
// let _ = pixmap.save_png(&path);
debug!("rendered");
let handle = Handle::from_bytes(pixmap.take());
let handle = Handle::from_rgba(
size.width as u32,
size.height as u32,
pixmap.take(),
);
self.handle = Some(handle);
debug!("stored");
self