feat: configurable fonts

This commit is contained in:
Michael Aaron Murphy 2024-10-03 21:27:06 +02:00 committed by Michael Murphy
parent e645dee2f0
commit 9e064e7fa0
20 changed files with 143 additions and 124 deletions

View file

@ -145,10 +145,9 @@ impl<'a, Message: Clone + 'static> From<Button<'a, Message>> for Element<'a, Mes
crate::widget::text(builder.label)
.size(builder.font_size)
.line_height(LineHeight::Absolute(builder.line_height.into()))
.font({
let mut font = crate::font::DEFAULT;
font.weight = builder.font_weight;
font
.font(crate::font::Font {
weight: builder.font_weight,
..crate::font::default()
})
.into(),
);
@ -182,10 +181,9 @@ impl<'a, Message: Clone + 'static> From<Button<'a, Message>> for Element<'a, Mes
} else {
tooltip(button, builder.tooltip, tooltip::Position::Top)
.size(builder.font_size)
.font({
let mut font = crate::font::DEFAULT;
font.weight = builder.font_weight;
font
.font(crate::font::Font {
weight: builder.font_weight,
..crate::font::default()
})
.into()
}

View file

@ -63,14 +63,14 @@ impl<'a, Message: Clone + 'static> From<Button<'a, Message>> for Element<'a, Mes
fn from(mut builder: Button<'a, Message>) -> Element<'a, Message> {
let button: super::Button<'a, Message> = row::with_capacity(2)
.push({
let mut font = crate::font::DEFAULT;
font.weight = builder.font_weight;
// TODO: Avoid allocation
crate::widget::text(builder.label.to_string())
.size(builder.font_size)
.line_height(LineHeight::Absolute(builder.line_height.into()))
.font(font)
.font(crate::font::Font {
weight: builder.font_weight,
..crate::font::default()
})
})
.push_maybe(if builder.variant.trailing_icon {
Some(icon().icon().size(builder.icon_size))
@ -93,10 +93,9 @@ impl<'a, Message: Clone + 'static> From<Button<'a, Message>> for Element<'a, Mes
} else {
tooltip(button, builder.tooltip, tooltip::Position::Top)
.size(builder.font_size)
.font({
let mut font = crate::font::DEFAULT;
font.weight = builder.font_weight;
font
.font(crate::font::Font {
weight: builder.font_weight,
..crate::font::default()
})
.into()
}

View file

@ -101,8 +101,10 @@ impl<'a, Message: Clone + 'static> From<Button<'a, Message>> for Element<'a, Mes
});
let label: Option<Element<'_, _>> = (!builder.label.is_empty()).then(|| {
let mut font = crate::font::DEFAULT;
font.weight = builder.font_weight;
let font = crate::font::Font {
weight: builder.font_weight,
..crate::font::default()
};
// TODO: Avoid allocation
crate::widget::text(builder.label.to_string())
@ -135,10 +137,9 @@ impl<'a, Message: Clone + 'static> From<Button<'a, Message>> for Element<'a, Mes
} else {
tooltip(button, builder.tooltip, tooltip::Position::Top)
.size(builder.font_size)
.font({
let mut font = crate::font::DEFAULT;
font.weight = builder.font_weight;
font
.font(crate::font::Font {
weight: builder.font_weight,
..crate::font::default()
})
.into()
}

View file

@ -459,7 +459,7 @@ impl<'a, S: AsRef<str>, Message> Widget<Message, crate::Theme, crate::Renderer>
},
);
(appearance.selected_text_color, crate::font::FONT_SEMIBOLD)
(appearance.selected_text_color, crate::font::semibold())
} else if *self.hovered_option == Some(i) {
let item_x = bounds.x + appearance.border_width;
let item_width = appearance.border_width.mul_add(-2.0, bounds.width);
@ -480,9 +480,9 @@ impl<'a, S: AsRef<str>, Message> Widget<Message, crate::Theme, crate::Renderer>
appearance.hovered_background,
);
(appearance.hovered_text_color, crate::font::FONT)
(appearance.hovered_text_color, crate::font::default())
} else {
(appearance.text_color, crate::font::FONT)
(appearance.text_color, crate::font::default())
};
let bounds = Rectangle {

View file

@ -549,7 +549,7 @@ where
},
);
(appearance.selected_text_color, crate::font::FONT_SEMIBOLD)
(appearance.selected_text_color, crate::font::semibold())
} else if self.hovered_option.as_ref() == Some(item) {
let item_x = bounds.x + appearance.border_width;
let item_width = bounds.width - appearance.border_width * 2.0;
@ -572,9 +572,9 @@ where
appearance.hovered_background,
);
(appearance.hovered_text_color, crate::font::FONT)
(appearance.hovered_text_color, crate::font::default())
} else {
(appearance.text_color, crate::font::FONT)
(appearance.text_color, crate::font::default())
};
let bounds = Rectangle {
@ -640,7 +640,7 @@ where
bounds: bounds.size(),
size: iced::Pixels(text_size),
line_height: text::LineHeight::Absolute(Pixels(text_line_height + 4.0)),
font: crate::font::FONT,
font: crate::font::default(),
horizontal_alignment: alignment::Horizontal::Center,
vertical_alignment: alignment::Vertical::Center,
shaping: text::Shaping::Advanced,

View file

@ -156,9 +156,7 @@ impl<'a, S: AsRef<str>, Message: 'a, Item: Clone + PartialEq + 'static>
cursor: mouse::Cursor,
viewport: &Rectangle,
) {
let font = self
.font
.unwrap_or_else(|| text::Renderer::default_font(renderer));
let font = self.font.unwrap_or_else(|| crate::font::default());
draw(
renderer,
@ -275,7 +273,7 @@ pub fn layout(
bounds: Size::new(f32::MAX, f32::MAX),
size: iced::Pixels(text_size),
line_height: text_line_height,
font: font.unwrap_or_else(|| text::Renderer::default_font(renderer)),
font: font.unwrap_or_else(|| crate::font::default()),
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top,
shaping: text::Shaping::Advanced,
@ -418,7 +416,7 @@ pub fn overlay<'a, S: AsRef<str>, Message: 'a, Item: Clone + PartialEq + 'static
bounds: Size::new(f32::MAX, f32::MAX),
size: iced::Pixels(text_size),
line_height,
font: font.unwrap_or_else(|| text::Renderer::default_font(renderer)),
font: font.unwrap_or_else(|| crate::font::default()),
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top,
shaping: text::Shaping::Advanced,

View file

@ -76,7 +76,7 @@ impl<'a, S: AsRef<str>, Message> Dropdown<'a, S, Message> {
size: iced::Pixels(self.text_size.unwrap_or(14.0)),
line_height: self.text_line_height,
font: self.font.unwrap_or(crate::font::FONT),
font: self.font.unwrap_or_else(crate::font::default),
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top,
shaping: text::Shaping::Advanced,
@ -113,7 +113,7 @@ impl<'a, S: AsRef<str>, Message: 'a> Widget<Message, crate::Theme, crate::Render
size: iced::Pixels(self.text_size.unwrap_or(14.0)),
line_height: self.text_line_height,
font: self.font.unwrap_or(crate::font::FONT),
font: self.font.unwrap_or_else(crate::font::default),
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top,
shaping: text::Shaping::Advanced,
@ -194,9 +194,7 @@ impl<'a, S: AsRef<str>, Message: 'a> Widget<Message, crate::Theme, crate::Render
cursor: mouse::Cursor,
viewport: &Rectangle,
) {
let font = self
.font
.unwrap_or_else(|| text::Renderer::default_font(renderer));
let font = self.font.unwrap_or_else(|| crate::font::default());
draw(
renderer,
theme,
@ -308,7 +306,7 @@ pub fn layout(
bounds: Size::new(f32::MAX, f32::MAX),
size: iced::Pixels(text_size),
line_height: text_line_height,
font: font.unwrap_or_else(|| text::Renderer::default_font(renderer)),
font: font.unwrap_or_else(|| crate::font::default()),
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top,
shaping: text::Shaping::Advanced,

View file

@ -635,7 +635,7 @@ where
content: text,
size: iced::Pixels(self.font_size),
bounds: Size::INFINITY,
font: font.unwrap_or(crate::font::FONT),
font: font.unwrap_or_else(crate::font::default),
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Center,
shaping: Shaping::Advanced,

View file

@ -31,7 +31,7 @@ where
.button_padding([space_s, 0, space_s, 0])
.button_spacing(space_xxs)
.style(crate::theme::SegmentedButton::Control)
.font_active(Some(crate::font::FONT_SEMIBOLD))
.font_active(Some(crate::font::semibold()))
}
/// A selection of multiple choices appearing as a conjoined button.
@ -57,5 +57,5 @@ where
.button_padding([space_s, 0, space_s, 0])
.button_spacing(space_xxs)
.style(crate::theme::SegmentedButton::Control)
.font_active(Some(crate::font::FONT_SEMIBOLD))
.font_active(Some(crate::font::semibold()))
}

View file

@ -30,7 +30,7 @@ where
.button_height(44)
.button_padding([space_s, space_xs, space_s, space_xs])
.style(crate::theme::SegmentedButton::TabBar)
.font_active(Some(crate::font::FONT_SEMIBOLD))
.font_active(Some(crate::font::semibold()))
}
/// A collection of tabs for developing a tabbed interface.
@ -54,5 +54,5 @@ where
.button_height(44)
.button_padding([space_s, space_xs, space_s, space_xs])
.style(crate::theme::SegmentedButton::TabBar)
.font_active(Some(crate::font::FONT_SEMIBOLD))
.font_active(Some(crate::font::semibold()))
}

View file

@ -7,7 +7,7 @@ use std::borrow::Cow;
///
/// [`Text`]: widget::Text
pub fn text<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme, Renderer> {
Text::new(text)
Text::new(text).font(crate::font::default())
}
/// Available presets for text typography
@ -29,7 +29,7 @@ pub fn title1<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme,
Text::new(text)
.size(32.0)
.line_height(LineHeight::Absolute(44.0.into()))
.font(crate::font::FONT_LIGHT)
.font(crate::font::semibold())
}
/// [`Text`] widget with the Title 2 typography preset.
@ -37,6 +37,7 @@ pub fn title2<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme,
Text::new(text)
.size(28.0)
.line_height(LineHeight::Absolute(36.0.into()))
.font(crate::font::default())
}
/// [`Text`] widget with the Title 3 typography preset.
@ -44,6 +45,7 @@ pub fn title3<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme,
Text::new(text)
.size(24.0)
.line_height(LineHeight::Absolute(32.0.into()))
.font(crate::font::default())
}
/// [`Text`] widget with the Title 4 typography preset.
@ -51,6 +53,7 @@ pub fn title4<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme,
Text::new(text)
.size(20.0)
.line_height(LineHeight::Absolute(28.0.into()))
.font(crate::font::default())
}
/// [`Text`] widget with the Heading typography preset.
@ -58,7 +61,7 @@ pub fn heading<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme,
Text::new(text)
.size(14.0)
.line_height(LineHeight::Absolute(iced::Pixels(20.0)))
.font(crate::font::FONT_SEMIBOLD)
.font(crate::font::semibold())
}
/// [`Text`] widget with the Caption Heading typography preset.
@ -66,7 +69,7 @@ pub fn caption_heading<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate
Text::new(text)
.size(10.0)
.line_height(LineHeight::Absolute(iced::Pixels(14.0)))
.font(crate::font::FONT_SEMIBOLD)
.font(crate::font::semibold())
}
/// [`Text`] widget with the Body typography preset.
@ -74,6 +77,7 @@ pub fn body<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme, Re
Text::new(text)
.size(14.0)
.line_height(LineHeight::Absolute(20.0.into()))
.font(crate::font::default())
}
/// [`Text`] widget with the Caption typography preset.
@ -81,6 +85,7 @@ pub fn caption<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme,
Text::new(text)
.size(10.0)
.line_height(LineHeight::Absolute(14.0.into()))
.font(crate::font::default())
}
/// [`Text`] widget with the Monotext typography preset.
@ -88,5 +93,5 @@ pub fn monotext<'a>(text: impl Into<Cow<'a, str>> + 'a) -> Text<'a, crate::Theme
Text::new(text)
.size(14.0)
.line_height(LineHeight::Absolute(20.0.into()))
.font(crate::font::FONT_MONO_REGULAR)
.font(crate::font::mono())
}