Add text attributes

This commit is contained in:
Jeremy Soller 2022-10-25 14:14:23 -06:00
parent bc04887b35
commit 84f4381cdf
No known key found for this signature in database
GPG key ID: 87F211AF2BE4C2FE
6 changed files with 83 additions and 88 deletions

View file

@ -101,35 +101,8 @@ impl Application for Window {
type Theme = Theme;
fn new(_flags: ()) -> (Self, Command<Self::Message>) {
let font_matches: FontMatches<'static> = FONT_SYSTEM.matches(|info| -> bool {
#[cfg(feature = "mono")]
let monospaced = true;
#[cfg(not(feature = "mono"))]
let monospaced = false;
let matched = {
info.style == fontdb::Style::Normal &&
info.weight == fontdb::Weight::NORMAL &&
info.stretch == fontdb::Stretch::Normal &&
(info.monospaced == monospaced || info.post_script_name.contains("Emoji"))
};
if matched {
log::debug!(
"{:?}: family '{}' postscript name '{}' style {:?} weight {:?} stretch {:?} monospaced {:?}",
info.id,
info.family,
info.post_script_name,
info.style,
info.weight,
info.stretch,
info.monospaced
);
}
matched
}).unwrap();
let attrs = cosmic_text::Attrs::new().monospaced(cfg!(feature = "mono"));
let font_matches = FONT_SYSTEM.matches_attrs(attrs).unwrap();
let font_size_i = 1; // Body
let buffer = TextBuffer::new(

View file

@ -30,35 +30,8 @@ fn main() {
)
.unwrap();
let font_matches = font_system.matches(|info| -> bool {
#[cfg(feature = "mono")]
let monospaced = true;
#[cfg(not(feature = "mono"))]
let monospaced = false;
let matched = {
info.style == fontdb::Style::Normal &&
info.weight == fontdb::Weight::NORMAL &&
info.stretch == fontdb::Stretch::Normal &&
(info.monospaced == monospaced || info.post_script_name.contains("Emoji"))
};
if matched {
log::debug!(
"{:?}: family '{}' postscript name '{}' style {:?} weight {:?} stretch {:?} monospaced {:?}",
info.id,
info.family,
info.post_script_name,
info.style,
info.weight,
info.stretch,
info.monospaced
);
}
matched
}).unwrap();
let attrs = cosmic_text::Attrs::new().monospaced(cfg!(feature = "mono"));
let font_matches = font_system.matches_attrs(attrs).unwrap();
let bg_color = Color::rgb(0x34, 0x34, 0x34);
let font_color = Color::rgb(0xFF, 0xFF, 0xFF);

View file

@ -45,35 +45,8 @@ fn main() {
)
.unwrap();
let font_matches = font_system.matches(|info| -> bool {
#[cfg(feature = "mono")]
let monospaced = true;
#[cfg(not(feature = "mono"))]
let monospaced = false;
let matched = {
info.style == fontdb::Style::Normal &&
info.weight == fontdb::Weight::NORMAL &&
info.stretch == fontdb::Stretch::Normal &&
(info.monospaced == monospaced || info.post_script_name.contains("Emoji"))
};
if matched {
log::debug!(
"{:?}: family '{}' postscript name '{}' style {:?} weight {:?} stretch {:?} monospaced {:?}",
info.id,
info.family,
info.post_script_name,
info.style,
info.weight,
info.stretch,
info.monospaced
);
}
matched
}).unwrap();
let attrs = cosmic_text::Attrs::new().monospaced(cfg!(feature = "mono"));
let font_matches = font_system.matches_attrs(attrs).unwrap();
let font_sizes = [
TextMetrics::new(10, 14).scale(display_scale), // Caption

46
src/attrs.rs Normal file
View file

@ -0,0 +1,46 @@
pub use fontdb::{Family, Stretch, Style, Weight};
pub struct Attrs<'a> {
pub family: Family<'a>,
pub monospaced: bool,
pub stretch: Stretch,
pub style: Style,
pub weight: Weight,
}
impl<'a> Attrs<'a> {
pub fn new() -> Self {
Self {
family: Family::SansSerif,
monospaced: false,
stretch: Stretch::Normal,
style: Style::Normal,
weight: Weight::NORMAL,
}
}
pub fn family(mut self, family: Family<'a>) -> Self {
self.family = family;
self
}
pub fn monospaced(mut self, monospaced: bool) -> Self {
self.monospaced = monospaced;
self
}
pub fn stretch(mut self, stretch: Stretch) -> Self {
self.stretch = stretch;
self
}
pub fn style(mut self, style: Style) -> Self {
self.style = style;
self
}
pub fn weight(mut self, weight: Weight) -> Self {
self.weight = weight;
self
}
}

View file

@ -2,7 +2,7 @@
use std::ops::Deref;
use super::{Font, FontMatches};
use crate::{Attrs, Font, FontMatches};
/// Access system fonts
pub struct FontSystem {
@ -81,6 +81,33 @@ impl FontSystem {
None
}
}
pub fn matches_attrs(&self, attrs: Attrs) -> Option<FontMatches<'_>> {
self.matches(|info| {
let matched = {
info.style == attrs.style &&
info.weight == attrs.weight &&
info.stretch == attrs.stretch &&
//TODO: smarter way of including emoji
(info.monospaced == attrs.monospaced || info.post_script_name.contains("Emoji"))
};
if matched {
log::debug!(
"{:?}: family '{}' postscript name '{}' style {:?} weight {:?} stretch {:?} monospaced {:?}",
info.id,
info.family,
info.post_script_name,
info.style,
info.weight,
info.stretch,
info.monospaced
);
}
matched
})
}
}
impl Default for FontSystem {

View file

@ -1,5 +1,8 @@
// SPDX-License-Identifier: MIT OR Apache-2.0
pub use self::attrs::*;
mod attrs;
pub use self::buffer::*;
mod buffer;