mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 06:40:06 -04:00
Add control of line height and letter spacing (#3302)
* Add `TextFormat::extra_letter_spacing` * Add control of line height * Add to text layout demo * Move the text layout demo to its own window in the demo app * Fix doclink * Better document points vs pixels * Better documentation and code cleanup
This commit is contained in:
@@ -92,14 +92,16 @@
|
||||
//! # });
|
||||
//! ```
|
||||
//!
|
||||
//! ## Conventions
|
||||
//! ## Coordinate system
|
||||
//! The left-top corner of the screen is `(0.0, 0.0)`,
|
||||
//! with X increasing to the right and Y increasing downwards.
|
||||
//!
|
||||
//! Conventions unless otherwise specified:
|
||||
//! `egui` uses logical _points_ as its coordinate system.
|
||||
//! Those related to physical _pixels_ by the `pixels_per_point` scale factor.
|
||||
//! For example, a high-dpi screeen can have `pixels_per_point = 2.0`,
|
||||
//! meaning there are two physical screen pixels for each logical point.
|
||||
//!
|
||||
//! * angles are in radians
|
||||
//! * `Vec2::X` is right and `Vec2::Y` is down.
|
||||
//! * `Pos2::ZERO` is left top.
|
||||
//! * Positions and sizes are measured in _points_. Each point may consist of many physical pixels.
|
||||
//! Angles are in radians, and are measured clockwise from the X-axis, which has angle=0.
|
||||
//!
|
||||
//! # Integrating with egui
|
||||
//!
|
||||
@@ -352,7 +354,7 @@ pub mod text {
|
||||
pub use crate::text_edit::CCursorRange;
|
||||
pub use epaint::text::{
|
||||
cursor::CCursor, FontData, FontDefinitions, FontFamily, Fonts, Galley, LayoutJob,
|
||||
LayoutSection, TextFormat, TAB_SIZE,
|
||||
LayoutSection, TextFormat, TextWrapping, TAB_SIZE,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use std::borrow::Cow;
|
||||
use std::sync::Arc;
|
||||
use std::{borrow::Cow, sync::Arc};
|
||||
|
||||
use crate::{
|
||||
style::WidgetVisuals, text::LayoutJob, Align, Color32, FontFamily, FontSelection, Galley, Pos2,
|
||||
@@ -25,6 +24,8 @@ use crate::{
|
||||
pub struct RichText {
|
||||
text: String,
|
||||
size: Option<f32>,
|
||||
extra_letter_spacing: f32,
|
||||
line_height: Option<f32>,
|
||||
family: Option<FontFamily>,
|
||||
text_style: Option<TextStyle>,
|
||||
background_color: Color32,
|
||||
@@ -100,6 +101,32 @@ impl RichText {
|
||||
self
|
||||
}
|
||||
|
||||
/// Extra spacing between letters, in points.
|
||||
///
|
||||
/// Default: 0.0.
|
||||
///
|
||||
/// For even text it is recommended you round this to an even number of _pixels_,
|
||||
/// e.g. using [`crate::Painter::round_to_pixel`].
|
||||
#[inline]
|
||||
pub fn extra_letter_spacing(mut self, extra_letter_spacing: f32) -> Self {
|
||||
self.extra_letter_spacing = extra_letter_spacing;
|
||||
self
|
||||
}
|
||||
|
||||
/// Explicit line height of the text in points.
|
||||
///
|
||||
/// This is the distance between the bottom row of two subsequent lines of text.
|
||||
///
|
||||
/// If `None` (the default), the line height is determined by the font.
|
||||
///
|
||||
/// For even text it is recommended you round this to an even number of _pixels_,
|
||||
/// e.g. using [`crate::Painter::round_to_pixel`].
|
||||
#[inline]
|
||||
pub fn line_height(mut self, line_height: Option<f32>) -> Self {
|
||||
self.line_height = line_height;
|
||||
self
|
||||
}
|
||||
|
||||
/// Select the font family.
|
||||
///
|
||||
/// This overrides the value from [`Self::text_style`].
|
||||
@@ -253,6 +280,8 @@ impl RichText {
|
||||
let Self {
|
||||
text,
|
||||
size,
|
||||
extra_letter_spacing,
|
||||
line_height,
|
||||
family,
|
||||
text_style,
|
||||
background_color,
|
||||
@@ -309,6 +338,8 @@ impl RichText {
|
||||
|
||||
let text_format = crate::text::TextFormat {
|
||||
font_id,
|
||||
extra_letter_spacing,
|
||||
line_height,
|
||||
color: text_color,
|
||||
background: background_color,
|
||||
italics,
|
||||
|
||||
Reference in New Issue
Block a user