use cushy::figures::units::Px; use cushy::fonts::FontCollection; use cushy::styles::components::{FontFamily, FontWeight, LineHeight, TextSize}; use cushy::styles::{Component, DynamicComponent, FamilyOwned, FontFamilyList}; use cushy::value::{Dynamic, Source}; use cushy::widget::MakeWidget; use cushy::widgets::input::InputValue; use cushy::Run; fn main() -> cushy::Result<()> { let file_path = Dynamic::::default(); let fonts = FontCollection::default(); let font_data = file_path.map_each(|path| std::fs::read(path).map_err(|err| err.to_string())); let loaded_font = font_data.map_each({ let fonts = fonts.clone(); move |result| { result .as_ref() .ok() .map(|data| fonts.push_unloadable(data.to_vec())) } }); let primary_family_name = DynamicComponent::new({ let loaded_font = loaded_font.clone(); move |context| { let font = loaded_font.get_tracking_invalidate(context)?; let face = context.loaded_font_faces(&font).first()?; Some(Component::custom(FontFamilyList::from(vec![ FamilyOwned::Name(face.families[0].0.clone()), ]))) } }); let family_weight = DynamicComponent::new(move |context| { let font = loaded_font.get_tracking_invalidate(context)?; let face = context.loaded_font_faces(&font).first()?; Some(Component::FontWeight(face.weight)) }); let mut window = file_path .into_input() .validation(font_data.clone()) .and( "The quick brown fox jumps over the lazy dog." .with(&TextSize, Px::new(36)) .with(&LineHeight, Px::new(36)) .with_dynamic(&FontFamily, primary_family_name) .with_dynamic(&FontWeight, family_weight), ) .into_rows() .into_window(); window.fonts = fonts; window.run() }