From 84f4381cdf66c1d0cca6b91c50f8358fab6683f8 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 25 Oct 2022 14:14:23 -0600 Subject: [PATCH] Add text attributes --- examples/editor-libcosmic/src/main.rs | 31 ++---------------- examples/editor-orbclient/src/main.rs | 31 ++---------------- examples/editor-test/src/main.rs | 31 ++---------------- src/attrs.rs | 46 +++++++++++++++++++++++++++ src/font/system.rs | 29 ++++++++++++++++- src/lib.rs | 3 ++ 6 files changed, 83 insertions(+), 88 deletions(-) create mode 100644 src/attrs.rs diff --git a/examples/editor-libcosmic/src/main.rs b/examples/editor-libcosmic/src/main.rs index cfd822d..3c28107 100644 --- a/examples/editor-libcosmic/src/main.rs +++ b/examples/editor-libcosmic/src/main.rs @@ -101,35 +101,8 @@ impl Application for Window { type Theme = Theme; fn new(_flags: ()) -> (Self, Command) { - 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( diff --git a/examples/editor-orbclient/src/main.rs b/examples/editor-orbclient/src/main.rs index 098b46b..7127ba9 100644 --- a/examples/editor-orbclient/src/main.rs +++ b/examples/editor-orbclient/src/main.rs @@ -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); diff --git a/examples/editor-test/src/main.rs b/examples/editor-test/src/main.rs index e906da0..760ad16 100644 --- a/examples/editor-test/src/main.rs +++ b/examples/editor-test/src/main.rs @@ -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 diff --git a/src/attrs.rs b/src/attrs.rs new file mode 100644 index 0000000..990ff84 --- /dev/null +++ b/src/attrs.rs @@ -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 + } +} diff --git a/src/font/system.rs b/src/font/system.rs index 251c063..0809d1f 100644 --- a/src/font/system.rs +++ b/src/font/system.rs @@ -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> { + 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 { diff --git a/src/lib.rs b/src/lib.rs index b952ded..cfdd039 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,8 @@ // SPDX-License-Identifier: MIT OR Apache-2.0 +pub use self::attrs::*; +mod attrs; + pub use self::buffer::*; mod buffer;