use crate::ComputedTextBlock;
use crate::FontCx;
use bevy_asset::Asset;
use bevy_asset::AssetEvent;
use bevy_asset::Assets;
use bevy_ecs::message::MessageReader;
use bevy_ecs::system::Query;
use bevy_ecs::system::Res;
use bevy_ecs::system::ResMut;
use bevy_reflect::TypePath;
use parley::fontique::Blob;
use parley::fontique::FontInfoOverride;
use smol_str::SmolStr;
#[derive(Debug, TypePath, Clone, Asset)]
pub struct Font {
pub data: Blob<u8>,
pub family_name: SmolStr,
}
impl Font {
pub fn try_from_bytes(font_data: Vec<u8>, family_name: &str) -> Font {
Self {
data: Blob::from(font_data),
family_name: family_name.into(),
}
}
}
pub fn load_font_assets_into_font_collection(
fonts: Res<Assets<Font>>,
mut events: MessageReader<AssetEvent<Font>>,
mut font_cx: ResMut<FontCx>,
mut text_block_query: Query<&mut ComputedTextBlock>,
) {
let mut new_fonts_added = false;
for event in events.read() {
if let AssetEvent::Added { id } = event
&& let Some(font) = fonts.get(*id)
{
font_cx.0.collection.register_fonts(
font.data.clone(),
Some(FontInfoOverride {
family_name: Some(font.family_name.as_str()),
..Default::default()
}),
);
new_fonts_added = true;
}
}
if new_fonts_added {
for mut block in text_block_query.iter_mut() {
block.needs_rerender = true;
}
}
}