mirror of
https://github.com/danbulant/cushy
synced 2026-05-20 20:58:57 +00:00
56 lines
1.9 KiB
Rust
56 lines
1.9 KiB
Rust
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::<String>::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()
|
|
}
|