From 1a2ff0a4bc39921a7e80396daa435aae234b9141 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Sun, 4 May 2025 22:40:18 -0500 Subject: [PATCH] making some text_svg changes --- src/core/slide.rs | 10 +++++++- src/ui/presenter.rs | 57 +++++++++++++++++++++++++-------------------- src/ui/text_svg.rs | 37 ++++++++++++++++++++++------- 3 files changed, 69 insertions(+), 35 deletions(-) diff --git a/src/core/slide.rs b/src/core/slide.rs index ec267d6..277034d 100644 --- a/src/core/slide.rs +++ b/src/core/slide.rs @@ -12,7 +12,15 @@ use tracing::error; use super::songs::Song; #[derive( - Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize, + Clone, + Copy, + Debug, + Default, + PartialEq, + Eq, + Serialize, + Deserialize, + Hash, )] pub enum TextAlignment { TopLeft, diff --git a/src/ui/presenter.rs b/src/ui/presenter.rs index d103617..34268dd 100644 --- a/src/ui/presenter.rs +++ b/src/ui/presenter.rs @@ -29,6 +29,7 @@ use url::Url; use crate::{ core::{service_items::ServiceItemModel, slide::Slide}, + ui::text_svg::{self, Font as SvgFont}, BackgroundKind, }; @@ -542,33 +543,39 @@ pub(crate) fn slide_view( responsive(move |size| { let width = size.height * 16.0 / 9.0; let font_size = scale_font(slide.font_size() as f32, width); - // let font = SvgFont::from(font).size(font_size.floor() as u8); + let font = SvgFont::from(font).size(font_size.floor() as u8); let slide_text = slide.text(); - // let text = text_svg::TextSvg::new() - // .text(&slide_text) - // .fill("#fff") - // .shadow(shadow(2, 2, 5, "#000000")) - // .stroke(stroke(1, "#000")) - // .font(font) - // .view() - // .map(|m| Message::None); + + // SVG based + let text = text_svg::TextSvg::new() + .text(&slide_text) + .fill("#fff") + .shadow(text_svg::shadow(2, 2, 5, "#000000")) + .stroke(text_svg::stroke(1, "#000")) + .font(font) + .view() + .map(|m| Message::None); + // let text = text!("{}", &slide_text); - let lines = slide_text.lines(); - let text: Vec> = lines - .map(|t| { - rich_text([span(format!("{}\n", t)) - .background( - Background::Color(Color::BLACK) - .scale_alpha(0.4), - ) - .padding(1)]) - .size(font_size) - .font(font) - .center() - .into() - }) - .collect(); - let text = Column::with_children(text).spacing(6); + // text widget based + // let lines = slide_text.lines(); + // let text: Vec> = lines + // .map(|t| { + // rich_text([span(format!("{}\n", t)) + // .background( + // Background::Color(Color::BLACK) + // .scale_alpha(0.4), + // ) + // .padding(1)]) + // .size(font_size) + // .font(font) + // .center() + // .into() + // }) + // .collect(); + // let text = Column::with_children(text).spacing(6); + + //Next let text_container = Container::new(text) .center(Length::Fill) .align_x(Horizontal::Left); diff --git a/src/ui/text_svg.rs b/src/ui/text_svg.rs index 760ca2f..2a4dac5 100644 --- a/src/ui/text_svg.rs +++ b/src/ui/text_svg.rs @@ -1,4 +1,7 @@ -use std::fmt::Display; +use std::{ + fmt::Display, + hash::{Hash, Hasher}, +}; use colors_transform::Rgb; use cosmic::{ @@ -7,7 +10,7 @@ use cosmic::{ Length, }, prelude::*, - widget::{container, responsive, svg::Handle, Svg}, + widget::{container, lazy, responsive, svg::Handle, Svg}, }; use tracing::error; @@ -23,7 +26,18 @@ pub struct TextSvg { alignment: TextAlignment, } -#[derive(Clone, Debug, Default, PartialEq, Eq)] +impl Hash for TextSvg { + fn hash(&self, state: &mut H) { + self.text.hash(state); + self.font.hash(state); + self.shadow.hash(state); + self.stroke.hash(state); + self.fill.hash(state); + self.alignment.hash(state); + } +} + +#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] pub struct Font { name: String, weight: Weight, @@ -92,6 +106,12 @@ impl Font { #[derive(Clone, Debug, PartialEq)] pub struct Color(Rgb); +impl Hash for Color { + fn hash(&self, state: &mut H) { + self.0.to_css_hex_string().hash(state); + } +} + impl Color { pub fn from_hex_str(color: impl AsRef) -> Color { match Rgb::from_hex_str(color.as_ref()) { @@ -128,7 +148,7 @@ impl Display for Color { } } -#[derive(Clone, Debug, Default, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq, Hash)] pub struct Shadow { pub offset_x: i16, pub offset_y: i16, @@ -136,7 +156,7 @@ pub struct Shadow { pub color: Color, } -#[derive(Clone, Debug, Default, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq, Hash)] pub struct Stroke { size: u16, color: Color, @@ -226,12 +246,11 @@ impl TextSvg { self.fill, stroke, text); // debug!(final_svg); - - Svg::new(Handle::from_memory( - Box::leak(final_svg.into_boxed_str()).as_bytes(), + lazy(self.clone(), move |_s| Svg::new(Handle::from_memory( + Box::leak(::clone(&final_svg).into_boxed_str()).as_bytes(), )) .width(Length::Fill) - .height(Length::Fill) + .height(Length::Fill)) .into() })).width(Length::Fill).height(Length::Fill).into() }