summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-02-04 07:33:33 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-02-24 13:28:24 +0100
commitb29de28d1f0f608f8029c93d154cfd1b0f8b8cbb (patch)
treee100af1dd98d23b29046bc951b04b440d2aa5bc2
parenta7580e0696a1a0ba76a89db3f78bc99ba3fbb361 (diff)
downloadiced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.tar.gz
iced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.tar.bz2
iced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.zip
Overhaul `Font` type to allow font family selection
-rw-r--r--core/src/font.rs53
-rw-r--r--examples/todos/fonts/icons.ttfbin5596 -> 5732 bytes
-rw-r--r--examples/todos/src/main.rs5
-rw-r--r--graphics/fonts/Lato-Regular.ttfbin75136 -> 0 bytes
-rw-r--r--graphics/fonts/OFL.txt93
-rw-r--r--graphics/src/backend.rs3
-rw-r--r--graphics/src/layer.rs2
-rw-r--r--graphics/src/renderer.rs4
-rw-r--r--graphics/src/widget/canvas/text.rs2
-rw-r--r--native/src/overlay/menu.rs12
-rw-r--r--native/src/renderer/null.rs8
-rw-r--r--native/src/text.rs5
-rw-r--r--native/src/widget/checkbox.rs13
-rw-r--r--native/src/widget/pick_list.rs25
-rw-r--r--native/src/widget/radio.rs11
-rw-r--r--native/src/widget/text.rs20
-rw-r--r--native/src/widget/text_input.rs39
-rw-r--r--native/src/widget/toggler.rs13
-rw-r--r--src/application.rs1
-rw-r--r--src/settings.rs18
-rw-r--r--wgpu/fonts/Iced-Icons.ttf (renamed from graphics/fonts/Icons.ttf)bin5032 -> 5108 bytes
-rw-r--r--wgpu/src/backend.rs21
-rw-r--r--wgpu/src/lib.rs4
-rw-r--r--wgpu/src/settings.rs37
-rw-r--r--wgpu/src/text.rs10
25 files changed, 145 insertions, 254 deletions
diff --git a/core/src/font.rs b/core/src/font.rs
index 130e378e..1f774a70 100644
--- a/core/src/font.rs
+++ b/core/src/font.rs
@@ -1,40 +1,29 @@
-use std::hash::{Hash, Hasher};
+use std::hash::Hash;
/// A font.
-#[derive(Debug, Clone, Copy)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Font {
- /// The default font.
- ///
- /// This is normally a font configured in a renderer or loaded from the
- /// system.
- Default,
+ /// The name of a font family of choice.
+ Name(&'static str),
- /// An external font.
- External {
- /// The name of the external font
- name: &'static str,
+ /// Serif fonts represent the formal text style for a script.
+ Serif,
- /// The bytes of the external font
- bytes: &'static [u8],
- },
-}
+ /// Glyphs in sans-serif fonts, as the term is used in CSS, are generally low
+ /// contrast and have stroke endings that are plain — without any flaring,
+ /// cross stroke, or other ornamentation.
+ SansSerif,
-impl Default for Font {
- fn default() -> Font {
- Font::Default
- }
-}
+ /// Glyphs in cursive fonts generally use a more informal script style, and
+ /// the result looks more like handwritten pen or brush writing than printed
+ /// letterwork.
+ Cursive,
+
+ /// Fantasy fonts are primarily decorative or expressive fonts that contain
+ /// decorative or expressive representations of characters.
+ Fantasy,
-impl Hash for Font {
- fn hash<H: Hasher>(&self, hasher: &mut H) {
- match self {
- Self::Default => {
- 0.hash(hasher);
- }
- Self::External { name, .. } => {
- 1.hash(hasher);
- name.hash(hasher);
- }
- }
- }
+ /// The sole criterion of a monospace font is that all glyphs have the same
+ /// fixed width.
+ Monospace,
}
diff --git a/examples/todos/fonts/icons.ttf b/examples/todos/fonts/icons.ttf
index 4498299d..7b65fd36 100644
--- a/examples/todos/fonts/icons.ttf
+++ b/examples/todos/fonts/icons.ttf
Binary files differ
diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs
index 6408f09c..5509cf0e 100644
--- a/examples/todos/src/main.rs
+++ b/examples/todos/src/main.rs
@@ -466,10 +466,7 @@ fn empty_message(message: &str) -> Element<'_, Message> {
}
// Fonts
-const ICONS: Font = Font::External {
- name: "Icons",
- bytes: include_bytes!("../../todos/fonts/icons.ttf"),
-};
+const ICONS: Font = Font::Name("Iced-Todos-Icons");
fn icon(unicode: char) -> Text<'static> {
text(unicode.to_string())
diff --git a/graphics/fonts/Lato-Regular.ttf b/graphics/fonts/Lato-Regular.ttf
deleted file mode 100644
index 33eba8b1..00000000
--- a/graphics/fonts/Lato-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/graphics/fonts/OFL.txt b/graphics/fonts/OFL.txt
deleted file mode 100644
index dfca0da4..00000000
--- a/graphics/fonts/OFL.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato"
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/graphics/src/backend.rs b/graphics/src/backend.rs
index 256b7ab5..7bbdee95 100644
--- a/graphics/src/backend.rs
+++ b/graphics/src/backend.rs
@@ -31,6 +31,9 @@ pub trait Text {
/// [`ICON_FONT`]: Self::ICON_FONT
const ARROW_DOWN_ICON: char;
+ /// Returns the default [`Font`].
+ fn default_font(&self) -> Font;
+
/// Returns the default size of text.
fn default_size(&self) -> f32;
diff --git a/graphics/src/layer.rs b/graphics/src/layer.rs
index cc8f299c..f6eb2fdd 100644
--- a/graphics/src/layer.rs
+++ b/graphics/src/layer.rs
@@ -63,7 +63,7 @@ impl<'a> Layer<'a> {
),
color: Color::new(0.9, 0.9, 0.9, 1.0),
size: 20.0,
- font: Font::Default,
+ font: Font::Monospace,
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top,
};
diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs
index 34b6eb1d..7ad53dec 100644
--- a/graphics/src/renderer.rs
+++ b/graphics/src/renderer.rs
@@ -130,6 +130,10 @@ where
const CHECKMARK_ICON: char = B::CHECKMARK_ICON;
const ARROW_DOWN_ICON: char = B::ARROW_DOWN_ICON;
+ fn default_font(&self) -> Self::Font {
+ self.backend().default_font()
+ }
+
fn default_size(&self) -> f32 {
self.backend().default_size()
}
diff --git a/graphics/src/widget/canvas/text.rs b/graphics/src/widget/canvas/text.rs
index 056f8204..8c0b2dfb 100644
--- a/graphics/src/widget/canvas/text.rs
+++ b/graphics/src/widget/canvas/text.rs
@@ -34,7 +34,7 @@ impl Default for Text {
position: Point::ORIGIN,
color: Color::BLACK,
size: 16.0,
- font: Font::Default,
+ font: Font::SansSerif,
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top,
}
diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs
index 50f741ef..9c3a8a44 100644
--- a/native/src/overlay/menu.rs
+++ b/native/src/overlay/menu.rs
@@ -31,7 +31,7 @@ where
width: f32,
padding: Padding,
text_size: Option<f32>,
- font: Renderer::Font,
+ font: Option<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}
@@ -58,7 +58,7 @@ where
width: 0.0,
padding: Padding::ZERO,
text_size: None,
- font: Default::default(),
+ font: None,
style: Default::default(),
}
}
@@ -82,8 +82,8 @@ where
}
/// Sets the font of the [`Menu`].
- pub fn font(mut self, font: Renderer::Font) -> Self {
- self.font = font;
+ pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
+ self.font = Some(font.into());
self
}
@@ -311,7 +311,7 @@ where
last_selection: &'a mut Option<T>,
padding: Padding,
text_size: Option<f32>,
- font: Renderer::Font,
+ font: Option<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}
@@ -491,7 +491,7 @@ where
..bounds
},
size: text_size,
- font: self.font.clone(),
+ font: self.font.unwrap_or_else(|| renderer.default_font()),
color: if is_selected {
appearance.selected_text_color
} else {
diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs
index 9376d540..50d7d6d6 100644
--- a/native/src/renderer/null.rs
+++ b/native/src/renderer/null.rs
@@ -40,12 +40,16 @@ impl Renderer for Null {
impl text::Renderer for Null {
type Font = Font;
- const ICON_FONT: Font = Font::Default;
+ const ICON_FONT: Font = Font::SansSerif;
const CHECKMARK_ICON: char = '0';
const ARROW_DOWN_ICON: char = '0';
+ fn default_font(&self) -> Self::Font {
+ Font::SansSerif
+ }
+
fn default_size(&self) -> f32 {
- 20.0
+ 16.0
}
fn measure(
diff --git a/native/src/text.rs b/native/src/text.rs
index 55c3cfd3..b7915a55 100644
--- a/native/src/text.rs
+++ b/native/src/text.rs
@@ -57,7 +57,7 @@ impl Hit {
/// A renderer capable of measuring and drawing [`Text`].
pub trait Renderer: crate::Renderer {
/// The font type used.
- type Font: Default + Clone;
+ type Font: Copy;
/// The icon font of the backend.
const ICON_FONT: Self::Font;
@@ -72,6 +72,9 @@ pub trait Renderer: crate::Renderer {
/// [`ICON_FONT`]: Self::ICON_FONT
const ARROW_DOWN_ICON: char;
+ /// Returns the default [`Font`].
+ fn default_font(&self) -> Self::Font;
+
/// Returns the default size of [`Text`].
fn default_size(&self) -> f32;
diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs
index 9b69e574..138c458c 100644
--- a/native/src/widget/checkbox.rs
+++ b/native/src/widget/checkbox.rs
@@ -55,7 +55,7 @@ where
size: f32,
spacing: f32,
text_size: Option<f32>,
- font: Renderer::Font,
+ font: Option<Renderer::Font>,
icon: Icon<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}
@@ -91,7 +91,7 @@ where
size: Self::DEFAULT_SIZE,
spacing: Self::DEFAULT_SPACING,
text_size: None,
- font: Renderer::Font::default(),
+ font: None,
icon: Icon {
font: Renderer::ICON_FONT,
code_point: Renderer::CHECKMARK_ICON,
@@ -128,8 +128,8 @@ where
/// Sets the [`Font`] of the text of the [`Checkbox`].
///
/// [`Font`]: crate::text::Renderer::Font
- pub fn font(mut self, font: Renderer::Font) -> Self {
- self.font = font;
+ pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
+ self.font = Some(font.into());
self
}
@@ -175,7 +175,7 @@ where
.push(Row::new().width(self.size).height(self.size))
.push(
Text::new(&self.label)
- .font(self.font.clone())
+ .font(self.font.unwrap_or_else(|| renderer.default_font()))
.width(self.width)
.size(
self.text_size
@@ -288,6 +288,7 @@ where
{
let label_layout = children.next().unwrap();
+ let font = self.font.unwrap_or_else(|| renderer.default_font());
widget::text::draw(
renderer,
@@ -295,7 +296,7 @@ where
label_layout,
&self.label,
self.text_size,
- self.font.clone(),
+ font,
widget::text::Appearance {
color: custom_style.text_color,
},
diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs
index a128d1ae..c1ff0004 100644
--- a/native/src/widget/pick_list.rs
+++ b/native/src/widget/pick_list.rs
@@ -35,7 +35,7 @@ where
width: Length,
padding: Padding,
text_size: Option<f32>,
- font: Renderer::Font,
+ font: Option<Renderer::Font>,
handle: Handle<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}
@@ -70,7 +70,7 @@ where
width: Length::Shrink,
padding: Self::DEFAULT_PADDING,
text_size: None,
- font: Default::default(),
+ font: None,
handle: Default::default(),
style: Default::default(),
}
@@ -101,8 +101,8 @@ where
}
/// Sets the font of the [`PickList`].
- pub fn font(mut self, font: Renderer::Font) -> Self {
- self.font = font;
+ pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
+ self.font = Some(font.into());
self
}
@@ -163,7 +163,7 @@ where
self.width,
self.padding,
self.text_size,
- &self.font,
+ self.font.unwrap_or_else(|| renderer.default_font()),
self.placeholder.as_deref(),
&self.options,
)
@@ -212,6 +212,7 @@ where
cursor_position: Point,
_viewport: &Rectangle,
) {
+ let font = self.font.unwrap_or_else(|| renderer.default_font());
draw(
renderer,
theme,
@@ -219,7 +220,7 @@ where
cursor_position,
self.padding,
self.text_size,
- &self.font,
+ font,
self.placeholder.as_deref(),
self.selected.as_ref(),
&self.handle,
@@ -232,7 +233,7 @@ where
&'b mut self,
tree: &'b mut Tree,
layout: Layout<'_>,
- _renderer: &Renderer,
+ renderer: &Renderer,
) -> Option<overlay::Element<'b, Message, Renderer>> {
let state = tree.state.downcast_mut::<State<T>>();
@@ -241,7 +242,7 @@ where
state,
self.padding,
self.text_size,
- self.font.clone(),
+ self.font.unwrap_or_else(|| renderer.default_font()),
&self.options,
self.style.clone(),
)
@@ -343,7 +344,7 @@ pub fn layout<Renderer, T>(
width: Length,
padding: Padding,
text_size: Option<f32>,
- font: &Renderer::Font,
+ font: Renderer::Font,
placeholder: Option<&str>,
options: &[T],
) -> layout::Node
@@ -362,7 +363,7 @@ where
let (width, _) = renderer.measure(
label,
text_size,
- font.clone(),
+ font,
Size::new(f32::INFINITY, f32::INFINITY),
);
@@ -560,7 +561,7 @@ pub fn draw<'a, T, Renderer>(
cursor_position: Point,
padding: Padding,
text_size: Option<f32>,
- font: &Renderer::Font,
+ font: Renderer::Font,
placeholder: Option<&str>,
selected: Option<&T>,
handle: &Handle<Renderer::Font>,
@@ -637,7 +638,7 @@ pub fn draw<'a, T, Renderer>(
renderer.fill_text(Text {
content: label,
size: text_size,
- font: font.clone(),
+ font,
color: if is_selected {
style.text_color
} else {
diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs
index 9daddfbc..bd803910 100644
--- a/native/src/widget/radio.rs
+++ b/native/src/widget/radio.rs
@@ -53,7 +53,7 @@ where
size: f32,
spacing: f32,
text_size: Option<f32>,
- font: Renderer::Font,
+ font: Option<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}
@@ -95,7 +95,7 @@ where
size: Self::DEFAULT_SIZE,
spacing: Self::DEFAULT_SPACING, //15
text_size: None,
- font: Default::default(),
+ font: None,
style: Default::default(),
}
}
@@ -125,8 +125,8 @@ where
}
/// Sets the text font of the [`Radio`] button.
- pub fn font(mut self, font: Renderer::Font) -> Self {
- self.font = font;
+ pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
+ self.font = Some(font.into());
self
}
@@ -268,6 +268,7 @@ where
{
let label_layout = children.next().unwrap();
+ let font = self.font.unwrap_or(renderer.default_font());
widget::text::draw(
renderer,
@@ -275,7 +276,7 @@ where
label_layout,
&self.label,
self.text_size,
- self.font.clone(),
+ font,
widget::text::Appearance {
color: custom_style.text_color,
},
diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs
index 3fee48f2..235a027e 100644
--- a/native/src/widget/text.rs
+++ b/native/src/widget/text.rs
@@ -37,7 +37,7 @@ where
height: Length,
horizontal_alignment: alignment::Horizontal,
vertical_alignment: alignment::Vertical,
- font: Renderer::Font,
+ font: Option<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}
@@ -51,7 +51,7 @@ where
Text {
content: content.into(),
size: None,
- font: Default::default(),
+ font: None,
width: Length::Shrink,
height: Length::Shrink,
horizontal_alignment: alignment::Horizontal::Left,
@@ -70,7 +70,7 @@ where
///
/// [`Font`]: crate::text::Renderer::Font
pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
- self.font = font.into();
+ self.font = Some(font.into());
self
}
@@ -138,8 +138,12 @@ where
let bounds = limits.max();
- let (width, height) =
- renderer.measure(&self.content, size, self.font.clone(), bounds);
+ let (width, height) = renderer.measure(
+ &self.content,
+ size,
+ self.font.unwrap_or_else(|| renderer.default_font()),
+ bounds,
+ );
let size = limits.resolve(Size::new(width, height));
@@ -156,13 +160,15 @@ where
_cursor_position: Point,
_viewport: &Rectangle,
) {
+ let font = self.font.unwrap_or_else(|| renderer.default_font());
+
draw(
renderer,
style,
layout,
&self.content,
self.size,
- self.font.clone(),
+ font,
theme.appearance(self.style),
self.horizontal_alignment,
self.vertical_alignment,
@@ -242,7 +248,7 @@ where
height: self.height,
horizontal_alignment: self.horizontal_alignment,
vertical_alignment: self.vertical_alignment,
- font: self.font.clone(),
+ font: self.font,
style: self.style,
}
}
diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs
index 5e198b8f..e6b70db2 100644
--- a/native/src/widget/text_input.rs
+++ b/native/src/widget/text_input.rs
@@ -61,7 +61,7 @@ where
placeholder: String,
value: Value,
is_secure: bool,
- font: Renderer::Font,
+ font: Option<Renderer::Font>,
width: Length,
padding: Padding,
size: Option<f32>,
@@ -92,7 +92,7 @@ where
placeholder: String::from(placeholder),
value: Value::new(value),
is_secure: false,
- font: Default::default(),
+ font: None,
width: Length::Fill,
padding: Padding::new(5.0),
size: None,
@@ -129,7 +129,7 @@ where
///
/// [`Font`]: text::Renderer::Font
pub fn font(mut self, font: Renderer::Font) -> Self {
- self.font = font;
+ self.font = Some(font);
self
}
/// Sets the width of the [`TextInput`].
@@ -179,6 +179,8 @@ where
cursor_position: Point,
value: Option<&Value>,
) {
+ let font = self.font.unwrap_or(renderer.default_font());
+
draw(
renderer,
theme,
@@ -188,7 +190,7 @@ where
value.unwrap_or(&self.value),
&self.placeholder,
self.size,
- &self.font,
+ font,
self.is_secure,
&self.style,
)
@@ -258,7 +260,7 @@ where
shell,
&mut self.value,
self.size,
- &self.font,
+ self.font.unwrap_or(renderer.default_font()),
self.is_secure,
self.on_change.as_ref(),
self.on_paste.as_deref(),
@@ -277,6 +279,8 @@ where
cursor_position: Point,
_viewport: &Rectangle,
) {
+ let font = self.font.unwrap_or(renderer.default_font());
+
draw(
renderer,
theme,
@@ -286,7 +290,7 @@ where
&self.value,
&self.placeholder,
self.size,
- &self.font,
+ font,
self.is_secure,
&self.style,
)
@@ -410,7 +414,7 @@ pub fn update<'a, Message, Renderer>(
shell: &mut Shell<'_, Message>,
value: &mut Value,
size: Option<f32>,
- font: &Renderer::Font,
+ font: Renderer::Font,
is_secure: bool,
on_change: &dyn Fn(String) -> Message,
on_paste: Option<&dyn Fn(String) -> Message>,
@@ -459,7 +463,7 @@ where
find_cursor_position(
renderer,
text_layout.bounds(),
- font.clone(),
+ font,
size,
&value,
state,
@@ -487,7 +491,7 @@ where
let position = find_cursor_position(
renderer,
text_layout.bounds(),
- font.clone(),
+ font,
size,
value,
state,
@@ -536,7 +540,7 @@ where
let position = find_cursor_position(
renderer,
text_layout.bounds(),
- font.clone(),
+ font,
size,
&value,
state,
@@ -816,7 +820,7 @@ pub fn draw<Renderer>(
value: &Value,
placeholder: &str,
size: Option<f32>,
- font: &Renderer::Font,
+ font: Renderer::Font,
is_secure: bool,
style: &<Renderer::Theme as StyleSheet>::Style,
) where
@@ -862,7 +866,7 @@ pub fn draw<Renderer>(
value,
size,
position,
- font.clone(),
+ font,
);
let is_cursor_visible = ((focus.now - focus.updated_at)
@@ -903,7 +907,7 @@ pub fn draw<Renderer>(
value,
size,
left,
- font.clone(),
+ font,
);
let (right_position, right_offset) =
@@ -913,7 +917,7 @@ pub fn draw<Renderer>(
value,
size,
right,
- font.clone(),
+ font,
);
let width = right_position - left_position;
@@ -948,7 +952,7 @@ pub fn draw<Renderer>(
let text_width = renderer.measure_width(
if text.is_empty() { placeholder } else { &text },
size,
- font.clone(),
+ font,
);
let render = |renderer: &mut Renderer| {
@@ -963,7 +967,7 @@ pub fn draw<Renderer>(
} else {
theme.value_color(style)
},
- font: font.clone(),
+ font: font,
bounds: Rectangle {
y: text_bounds.center_y(),
width: f32::INFINITY,
@@ -1195,8 +1199,7 @@ where
{
let size = size.unwrap_or_else(|| renderer.default_size());
- let offset =
- offset(renderer, text_bounds, font.clone(), size, value, state);
+ let offset = offset(renderer, text_bounds, font, size, value, state);
renderer
.hit_test(
diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs
index a434af65..495406db 100644
--- a/native/src/widget/toggler.rs
+++ b/native/src/widget/toggler.rs
@@ -42,7 +42,7 @@ where
text_size: Option<f32>,
text_alignment: alignment::Horizontal,
spacing: f32,
- font: Renderer::Font,
+ font: Option<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style,
}
@@ -79,7 +79,7 @@ where
text_size: None,
text_alignment: alignment::Horizontal::Left,
spacing: 0.0,
- font: Renderer::Font::default(),
+ font: None,
style: Default::default(),
}
}
@@ -117,8 +117,8 @@ where
/// Sets the [`Font`] of the text of the [`Toggler`]
///
/// [`Font`]: crate::text::Renderer::Font
- pub fn font(mut self, font: Renderer::Font) -> Self {
- self.font = font;
+ pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
+ self.font = Some(font.into());
self
}
@@ -160,7 +160,7 @@ where
row = row.push(
Text::new(label)
.horizontal_alignment(self.text_alignment)
- .font(self.font.clone())
+ .font(self.font.unwrap_or_else(|| renderer.default_font()))
.width(self.width)
.size(
self.text_size
@@ -236,6 +236,7 @@ where
if let Some(label) = &self.label {
let label_layout = children.next().unwrap();
+ let font = self.font.unwrap_or_else(|| renderer.default_font());
crate::widget::text::draw(
renderer,
@@ -243,7 +244,7 @@ where
label_layout,
label,
self.text_size,
- self.font.clone(),
+ font,
Default::default(),
self.text_alignment,
alignment::Vertical::Center,
diff --git a/src/application.rs b/src/application.rs
index 1db5c93f..9a1c1855 100644
--- a/src/application.rs
+++ b/src/application.rs
@@ -197,7 +197,6 @@ pub trait Application: Sized {
let renderer_settings = crate::renderer::Settings {
default_font: settings.default_font,
default_text_size: settings.default_text_size,
- text_multithreading: settings.text_multithreading,
antialiasing: if settings.antialiasing {
Some(crate::renderer::settings::Antialiasing::MSAAx4)
} else {
diff --git a/src/settings.rs b/src/settings.rs
index 266ad404..ce07b0dd 100644
--- a/src/settings.rs
+++ b/src/settings.rs
@@ -1,5 +1,6 @@
//! Configure your application.
use crate::window;
+use crate::Font;
/// The settings of an application.
#[derive(Debug, Clone)]
@@ -20,23 +21,16 @@ pub struct Settings<Flags> {
/// [`Application`]: crate::Application
pub flags: Flags,
- /// The bytes of the font that will be used by default.
+ /// The default [`Font`] to be used.
///
- /// If `None` is provided, a default system font will be chosen.
- // TODO: Add `name` for web compatibility
- pub default_font: Option<&'static [u8]>,
+ /// By default, it uses [`Font::SansSerif`].
+ pub default_font: Font,
/// The text size that will be used by default.
///
/// The default value is `16.0`.
pub default_text_size: f32,
- /// If enabled, spread text workload in multiple threads when multiple cores
- /// are available.
- ///
- /// By default, it is disabled.
- pub text_multithreading: bool,
-
/// If set to true, the renderer will try to perform antialiasing for some
/// primitives.
///
@@ -79,7 +73,6 @@ impl<Flags> Settings<Flags> {
window: default_settings.window,
default_font: default_settings.default_font,
default_text_size: default_settings.default_text_size,
- text_multithreading: default_settings.text_multithreading,
antialiasing: default_settings.antialiasing,
exit_on_close_request: default_settings.exit_on_close_request,
try_opengles_first: default_settings.try_opengles_first,
@@ -96,9 +89,8 @@ where
id: None,
window: Default::default(),
flags: Default::default(),
- default_font: Default::default(),
+ default_font: Font::SansSerif,
default_text_size: 16.0,
- text_multithreading: false,
antialiasing: false,
exit_on_close_request: true,
try_opengles_first: false,
diff --git a/graphics/fonts/Icons.ttf b/wgpu/fonts/Iced-Icons.ttf
index 5e455b69..7112f086 100644
--- a/graphics/fonts/Icons.ttf
+++ b/wgpu/fonts/Iced-Icons.ttf
Binary files differ
diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs
index 9bf464b3..874edb96 100644
--- a/wgpu/src/backend.rs
+++ b/wgpu/src/backend.rs
@@ -27,6 +27,7 @@ pub struct Backend {
#[cfg(any(feature = "image", feature = "svg"))]
image_pipeline: image::Pipeline,
+ default_font: Font,
default_text_size: f32,
}
@@ -38,14 +39,7 @@ impl Backend {
settings: Settings,
format: wgpu::TextureFormat,
) -> Self {
- let text_pipeline = text::Pipeline::new(
- device,
- queue,
- format,
- settings.default_font,
- settings.text_multithreading,
- );
-
+ let text_pipeline = text::Pipeline::new(device, queue, format);
let quad_pipeline = quad::Pipeline::new(device, format);
let triangle_pipeline =
triangle::Pipeline::new(device, format, settings.antialiasing);
@@ -61,6 +55,7 @@ impl Backend {
#[cfg(any(feature = "image", feature = "svg"))]
image_pipeline,
+ default_font: settings.default_font,
default_text_size: settings.default_text_size,
}
}
@@ -199,9 +194,13 @@ impl iced_graphics::Backend for Backend {
}
impl backend::Text for Backend {
- const ICON_FONT: Font = Font::Default; // TODO
- const CHECKMARK_ICON: char = '✓';
- const ARROW_DOWN_ICON: char = '▼';
+ const ICON_FONT: Font = Font::Name("Iced-Icons");
+ const CHECKMARK_ICON: char = '\u{e800}';
+ const ARROW_DOWN_ICON: char = '\u{f00c}';
+
+ fn default_font(&self) -> Font {
+ self.default_font
+ }
fn default_size(&self) -> f32 {
self.default_text_size
diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs
index 1a293681..6d6d3fd6 100644
--- a/wgpu/src/lib.rs
+++ b/wgpu/src/lib.rs
@@ -47,7 +47,9 @@ mod quad;
mod text;
mod triangle;
-pub use iced_graphics::{Antialiasing, Color, Error, Primitive, Viewport};
+pub use iced_graphics::{
+ Antialiasing, Color, Error, Font, Primitive, Viewport,
+};
pub use iced_native::Theme;
pub use wgpu;
diff --git a/wgpu/src/settings.rs b/wgpu/src/settings.rs
index 5ef79499..bd9cf473 100644
--- a/wgpu/src/settings.rs
+++ b/wgpu/src/settings.rs
@@ -1,12 +1,12 @@
//! Configure a renderer.
-use std::fmt;
-
pub use crate::Antialiasing;
+use crate::Font;
+
/// The settings of a [`Backend`].
///
/// [`Backend`]: crate::Backend
-#[derive(Clone, Copy, PartialEq)]
+#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Settings {
/// The present mode of the [`Backend`].
///
@@ -16,42 +16,20 @@ pub struct Settings {
/// The internal graphics backend to use.
pub internal_backend: wgpu::Backends,
- /// The bytes of the font that will be used by default.
- ///
- /// If `None` is provided, a default system font will be chosen.
- pub default_font: Option<&'static [u8]>,
+ /// The default [`Font`] to use.
+ pub default_font: Font,
/// The default size of text.
///
/// By default, it will be set to `16.0`.
pub default_text_size: f32,
- /// If enabled, spread text workload in multiple threads when multiple cores
- /// are available.
- ///
- /// By default, it is disabled.
- pub text_multithreading: bool,
-
/// The antialiasing strategy that will be used for triangle primitives.
///
/// By default, it is `None`.
pub antialiasing: Option<Antialiasing>,
}
-impl fmt::Debug for Settings {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("Settings")
- .field("present_mode", &self.present_mode)
- .field("internal_backend", &self.internal_backend)
- // Instead of printing the font bytes, we simply show a `bool` indicating if using a default font or not.
- .field("default_font", &self.default_font.is_some())
- .field("default_text_size", &self.default_text_size)
- .field("text_multithreading", &self.text_multithreading)
- .field("antialiasing", &self.antialiasing)
- .finish()
- }
-}
-
impl Settings {
/// Creates new [`Settings`] using environment configuration.
///
@@ -81,9 +59,8 @@ impl Default for Settings {
Settings {
present_mode: wgpu::PresentMode::AutoVsync,
internal_backend: wgpu::Backends::all(),
- default_font: None,
- default_text_size: 20.0,
- text_multithreading: false,
+ default_font: Font::SansSerif,
+ default_text_size: 16.0,
antialiasing: None,
}
}
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index fa7fd5df..083d9d2b 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -112,8 +112,6 @@ impl Pipeline {
device: &wgpu::Device,
queue: &wgpu::Queue,
format: wgpu::TextureFormat,
- _default_font: Option<&[u8]>,
- _multithreading: bool,
) -> Self {
Pipeline {
renderers: Vec::new(),
@@ -316,7 +314,11 @@ impl Pipeline {
fn to_family(font: Font) -> glyphon::Family<'static> {
match font {
- Font::Default => glyphon::Family::SansSerif,
- Font::External { name, .. } => glyphon::Family::Name(name),
+ Font::Name(name) => glyphon::Family::Name(name),
+ Font::SansSerif => glyphon::Family::SansSerif,
+ Font::Serif => glyphon::Family::Serif,
+ Font::Cursive => glyphon::Family::Cursive,
+ Font::Fantasy => glyphon::Family::Fantasy,
+ Font::Monospace => glyphon::Family::Monospace,
}
}