summaryrefslogtreecommitdiffstats
path: root/native
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 /native
parenta7580e0696a1a0ba76a89db3f78bc99ba3fbb361 (diff)
downloadiced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.tar.gz
iced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.tar.bz2
iced-b29de28d1f0f608f8029c93d154cfd1b0f8b8cbb.zip
Overhaul `Font` type to allow font family selection
Diffstat (limited to 'native')
-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
9 files changed, 83 insertions, 63 deletions
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,