use crate::TextError;
use crate::{FontSmoothing, FontSource};
use bevy_derive::Deref;
use bevy_derive::DerefMut;
use bevy_ecs::resource::Resource;
use parley::LayoutContext;
use parley::{FontContext, GenericFamily};
use swash::scale::ScaleContext;
#[derive(Copy, Clone, PartialEq, Default, Debug)]
pub struct TextBrush {
pub section_index: u32,
pub font_smoothing: FontSmoothing,
}
impl TextBrush {
pub fn new(section_index: u32, font_smoothing: FontSmoothing) -> Self {
TextBrush {
section_index,
font_smoothing,
}
}
}
#[derive(Resource, Default, Deref, DerefMut)]
pub struct FontCx(pub FontContext);
impl FontCx {
pub fn get_family<'a>(&'a mut self, source: &'a FontSource) -> Option<&'a str> {
let generic_family = match source {
FontSource::Handle(_) => return None,
FontSource::Family(family) => return Some(family.as_str()),
FontSource::Serif => GenericFamily::Serif,
FontSource::SansSerif => GenericFamily::SansSerif,
FontSource::Cursive => GenericFamily::Cursive,
FontSource::Fantasy => GenericFamily::Fantasy,
FontSource::Monospace => GenericFamily::Monospace,
FontSource::SystemUi => GenericFamily::SystemUi,
FontSource::UiSerif => GenericFamily::UiSerif,
FontSource::UiSansSerif => GenericFamily::UiSansSerif,
FontSource::UiMonospace => GenericFamily::UiMonospace,
FontSource::UiRounded => GenericFamily::UiRounded,
FontSource::Emoji => GenericFamily::Emoji,
FontSource::Math => GenericFamily::Math,
FontSource::FangSong => GenericFamily::FangSong,
};
let family_id = self.0.collection.generic_families(generic_family).next();
family_id.and_then(|id| self.0.collection.family_name(id))
}
pub fn set_generic_family(
&mut self,
generic: GenericFamily,
family_name: &str,
) -> Result<(), TextError> {
self.collection
.family_id(family_name)
.ok_or(TextError::NoSuchFontFamily(family_name.to_string()))
.map(|id| {
self.collection
.set_generic_families(generic, core::iter::once(id));
})
}
pub fn set_serif_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::Serif, family_name)
}
pub fn set_sans_serif_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::SansSerif, family_name)
}
pub fn set_cursive_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::Cursive, family_name)
}
pub fn set_fantasy_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::Fantasy, family_name)
}
pub fn set_monospace_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::Monospace, family_name)
}
pub fn set_system_ui_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::SystemUi, family_name)
}
pub fn set_ui_serif_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::UiSerif, family_name)
}
pub fn set_ui_sans_serif_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::UiSansSerif, family_name)
}
pub fn set_ui_monospace_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::UiMonospace, family_name)
}
pub fn set_ui_rounded_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::UiRounded, family_name)
}
pub fn set_emoji_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::Emoji, family_name)
}
pub fn set_math_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::Math, family_name)
}
pub fn set_fang_song_family(&mut self, family_name: &str) -> Result<(), TextError> {
self.set_generic_family(GenericFamily::FangSong, family_name)
}
}
#[derive(Resource, Default, Deref, DerefMut)]
pub struct LayoutCx(pub LayoutContext<TextBrush>);
#[derive(Resource, Default, Deref, DerefMut)]
pub struct ScaleCx(pub ScaleContext);