diff options
author | 2021-10-31 16:13:03 +0700 | |
---|---|---|
committer | 2021-10-31 16:14:38 +0700 | |
commit | b3a01973c6c726e6539be959659f4306ef3234c6 (patch) | |
tree | 06e6ce43b5e47eb78f2707eb2c6177a2f9af91f4 /native/src/text.rs | |
parent | 0aafcde0ef1533c9eeba0379de8c0082e30c7504 (diff) | |
download | iced-b3a01973c6c726e6539be959659f4306ef3234c6.tar.gz iced-b3a01973c6c726e6539be959659f4306ef3234c6.tar.bz2 iced-b3a01973c6c726e6539be959659f4306ef3234c6.zip |
Introduce first-class `text` module in `iced_native`
Diffstat (limited to 'native/src/text.rs')
-rw-r--r-- | native/src/text.rs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/native/src/text.rs b/native/src/text.rs new file mode 100644 index 00000000..f112a8f3 --- /dev/null +++ b/native/src/text.rs @@ -0,0 +1,71 @@ +use crate::alignment; +use crate::{Color, Point, Rectangle, Size}; + +pub use iced_core::text::Hit; + +#[derive(Debug, Clone, Copy)] +pub struct Text<'a, Font> { + pub content: &'a str, + pub bounds: Rectangle, + pub size: f32, + pub color: Color, + pub font: Font, + pub horizontal_alignment: alignment::Horizontal, + pub vertical_alignment: alignment::Vertical, +} + +pub trait Renderer: crate::Renderer { + /// The font type used. + type Font: Default + Copy; + + /// The icon font of the backend. + const ICON_FONT: Self::Font; + + /// The `char` representing a ✔ icon in the [`ICON_FONT`]. + /// + /// [`ICON_FONT`]: Self::ICON_FONT + const CHECKMARK_ICON: char; + + /// The `char` representing a ▼ icon in the built-in [`ICON_FONT`]. + /// + /// [`ICON_FONT`]: Self::ICON_FONT + const ARROW_DOWN_ICON: char; + + /// Returns the default size of [`Text`]. + fn default_size(&self) -> u16; + + /// Measures the text in the given bounds and returns the minimum boundaries + /// that can fit the contents. + fn measure( + &self, + content: &str, + size: u16, + font: Self::Font, + bounds: Size, + ) -> (f32, f32); + + fn measure_width(&self, content: &str, size: u16, font: Self::Font) -> f32 { + let (width, _) = self.measure(content, size, font, Size::INFINITY); + + width + } + + /// Tests whether the provided point is within the boundaries of [`Text`] + /// laid out with the given parameters, returning information about + /// the nearest character. + /// + /// If `nearest_only` is true, the hit test does not consider whether the + /// the point is interior to any glyph bounds, returning only the character + /// with the nearest centeroid. + fn hit_test( + &self, + contents: &str, + size: f32, + font: Self::Font, + bounds: Size, + point: Point, + nearest_only: bool, + ) -> Option<Hit>; + + fn fill_text(&mut self, text: Text<'_, Self::Font>); +} |