Overhaul Font type to allow font family selection

This commit is contained in:
Héctor Ramón Jiménez 2023-02-04 07:33:33 +01:00
parent a7580e0696
commit b29de28d1f
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
25 changed files with 147 additions and 256 deletions

View file

@ -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,
},

View file

@ -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 {

View file

@ -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,
},

View file

@ -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,
}
}

View file

@ -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(

View file

@ -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,