mirror of
https://github.com/bevyengine/bevy
synced 2024-12-01 17:09:12 +00:00
aeea4b0344
# Objective In Bevy 10.1 and before, the only way to enable text wrapping was to set a local `Val::Px` width constraint on the text node itself. `Val::Percent` constraints and constraints on the text node's ancestors did nothing. #7779 fixed those problems. But perversely displaying unwrapped text is really difficult now, and requires users to nest each `TextBundle` in a `NodeBundle` and apply `min_width` and `max_width` constraints. Some constructions may even need more than one layer of nesting. I've seen several people already who have really struggled with this when porting their projects to main in advance of 0.11. ## Solution Add a `NoWrap` variant to the `BreakLineOn` enum. If `NoWrap` is set, ignore any constraints on the width for the text and call `TextPipeline::queue_text` with a width bound of `f32::INFINITY`. --- ## Changelog * Added a `NoWrap` variant to the `BreakLineOn` enum. * If `NoWrap` is set, any constraints on the width for the text are ignored and `TextPipeline::queue_text` is called with a width bound of `f32::INFINITY`. * Changed the `size` field of `FixedMeasure` to `pub`. This shouldn't have been private, it was always intended to have `pub` visibility. * Added a `with_no_wrap` method to `TextBundle`. ## Migration Guide `bevy_text::text::BreakLineOn` has a new variant `NoWrap` that disables text wrapping for the `Text`. Text wrapping can also be disabled using the `with_no_wrap` method of `TextBundle`.
110 lines
3.7 KiB
Rust
110 lines
3.7 KiB
Rust
//! This example demonstrates text wrapping and use of the `LineBreakOn` property.
|
|
|
|
use bevy::prelude::*;
|
|
use bevy::text::BreakLineOn;
|
|
use bevy::winit::WinitSettings;
|
|
|
|
fn main() {
|
|
App::new()
|
|
.add_plugins(DefaultPlugins)
|
|
.insert_resource(WinitSettings::desktop_app())
|
|
.add_systems(Startup, spawn)
|
|
.run();
|
|
}
|
|
|
|
fn spawn(mut commands: Commands, asset_server: Res<AssetServer>) {
|
|
commands.spawn(Camera2dBundle::default());
|
|
|
|
let text_style = TextStyle {
|
|
font: asset_server.load("fonts/FiraSans-Bold.ttf"),
|
|
font_size: 14.0,
|
|
color: Color::WHITE,
|
|
};
|
|
|
|
let root = commands
|
|
.spawn(NodeBundle {
|
|
style: Style {
|
|
flex_direction: FlexDirection::Column,
|
|
width: Val::Percent(100.),
|
|
..Default::default()
|
|
},
|
|
background_color: Color::BLACK.into(),
|
|
..Default::default()
|
|
})
|
|
.id();
|
|
|
|
for linebreak_behavior in [
|
|
BreakLineOn::AnyCharacter,
|
|
BreakLineOn::WordBoundary,
|
|
BreakLineOn::NoWrap,
|
|
] {
|
|
let row_id = commands
|
|
.spawn(NodeBundle {
|
|
style: Style {
|
|
flex_direction: FlexDirection::Row,
|
|
justify_content: JustifyContent::SpaceAround,
|
|
align_items: AlignItems::Center,
|
|
width: Val::Percent(100.),
|
|
height: Val::Percent(50.),
|
|
..Default::default()
|
|
},
|
|
..Default::default()
|
|
})
|
|
.id();
|
|
|
|
let justifications = vec![
|
|
JustifyContent::Center,
|
|
JustifyContent::FlexStart,
|
|
JustifyContent::FlexEnd,
|
|
JustifyContent::SpaceAround,
|
|
JustifyContent::SpaceBetween,
|
|
JustifyContent::SpaceEvenly,
|
|
];
|
|
|
|
for (i, justification) in justifications.into_iter().enumerate() {
|
|
let c = 0.3 + i as f32 * 0.1;
|
|
let column_id = commands
|
|
.spawn(NodeBundle {
|
|
style: Style {
|
|
justify_content: justification,
|
|
flex_direction: FlexDirection::Column,
|
|
width: Val::Percent(16.),
|
|
height: Val::Percent(95.),
|
|
overflow: Overflow::clip_x(),
|
|
..Default::default()
|
|
},
|
|
background_color: Color::rgb(0.5, c, 1.0 - c).into(),
|
|
..Default::default()
|
|
})
|
|
.id();
|
|
|
|
let messages = [
|
|
format!("JustifyContent::{justification:?}"),
|
|
format!("LineBreakOn::{linebreak_behavior:?}"),
|
|
"Line 1\nLine 2\nLine 3".to_string(),
|
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas auctor, nunc ac faucibus fringilla.".to_string(),
|
|
];
|
|
|
|
for (j, message) in messages.into_iter().enumerate() {
|
|
let text = Text {
|
|
sections: vec![TextSection {
|
|
value: message.clone(),
|
|
style: text_style.clone(),
|
|
}],
|
|
alignment: TextAlignment::Left,
|
|
linebreak_behavior,
|
|
};
|
|
let text_id = commands
|
|
.spawn(TextBundle {
|
|
text,
|
|
background_color: Color::rgb(0.8 - j as f32 * 0.2, 0., 0.).into(),
|
|
..Default::default()
|
|
})
|
|
.id();
|
|
commands.entity(column_id).add_child(text_id);
|
|
}
|
|
commands.entity(row_id).add_child(column_id);
|
|
}
|
|
commands.entity(root).add_child(row_id);
|
|
}
|
|
}
|