mirror of
https://github.com/bevyengine/bevy
synced 2024-11-26 22:50:19 +00:00
9f906fdc8b
# Objective
Creating UI elements is very boilerplate-y with lots of indentation.
This PR aims to reduce boilerplate around creating text elements.
## Changelog
* Renamed `Text::with_section` to `from_section`.
It no longer takes a `TextAlignment` as argument, as the vast majority of cases left it `Default::default()`.
* Added `Text::from_sections` which creates a `Text` from a list of `TextSections`.
Reduces line-count and reduces indentation by one level.
* Added `Text::with_alignment`.
A builder style method for setting the `TextAlignment` of a `Text`.
* Added `TextSection::new`.
Does not reduce line count, but reduces character count and made it easier to read. No more `.to_string()` calls!
* Added `TextSection::from_style` which creates an empty `TextSection` with a style.
No more empty strings! Reduces indentation.
* Added `TextAlignment::CENTER` and friends.
* Added methods to `TextBundle`. `from_section`, `from_sections`, `with_text_alignment` and `with_style`.
## Note for reviewers.
Because of the nature of these changes I recommend setting diff view to 'split'.
~~Look for the book icon~~ cog in the top-left of the Files changed tab.
Have fun reviewing ❤️
<sup> >:D </sup>
## Migration Guide
`Text::with_section` was renamed to `from_section` and no longer takes a `TextAlignment` as argument.
Use `with_alignment` to set the alignment instead.
Co-authored-by: devil-ira <justthecooldude@gmail.com>
74 lines
2.5 KiB
Rust
74 lines
2.5 KiB
Rust
//! This example illustrates how to create a button that changes color and text based on its
|
|
//! interaction state.
|
|
|
|
use bevy::{prelude::*, winit::WinitSettings};
|
|
|
|
fn main() {
|
|
App::new()
|
|
.add_plugins(DefaultPlugins)
|
|
// Only run the app when there is user input. This will significantly reduce CPU/GPU use.
|
|
.insert_resource(WinitSettings::desktop_app())
|
|
.add_startup_system(setup)
|
|
.add_system(button_system)
|
|
.run();
|
|
}
|
|
|
|
const NORMAL_BUTTON: Color = Color::rgb(0.15, 0.15, 0.15);
|
|
const HOVERED_BUTTON: Color = Color::rgb(0.25, 0.25, 0.25);
|
|
const PRESSED_BUTTON: Color = Color::rgb(0.35, 0.75, 0.35);
|
|
|
|
fn button_system(
|
|
mut interaction_query: Query<
|
|
(&Interaction, &mut UiColor, &Children),
|
|
(Changed<Interaction>, With<Button>),
|
|
>,
|
|
mut text_query: Query<&mut Text>,
|
|
) {
|
|
for (interaction, mut color, children) in &mut interaction_query {
|
|
let mut text = text_query.get_mut(children[0]).unwrap();
|
|
match *interaction {
|
|
Interaction::Clicked => {
|
|
text.sections[0].value = "Press".to_string();
|
|
*color = PRESSED_BUTTON.into();
|
|
}
|
|
Interaction::Hovered => {
|
|
text.sections[0].value = "Hover".to_string();
|
|
*color = HOVERED_BUTTON.into();
|
|
}
|
|
Interaction::None => {
|
|
text.sections[0].value = "Button".to_string();
|
|
*color = NORMAL_BUTTON.into();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
|
// ui camera
|
|
commands.spawn_bundle(Camera2dBundle::default());
|
|
commands
|
|
.spawn_bundle(ButtonBundle {
|
|
style: Style {
|
|
size: Size::new(Val::Px(150.0), Val::Px(65.0)),
|
|
// center button
|
|
margin: UiRect::all(Val::Auto),
|
|
// horizontally center child text
|
|
justify_content: JustifyContent::Center,
|
|
// vertically center child text
|
|
align_items: AlignItems::Center,
|
|
..default()
|
|
},
|
|
color: NORMAL_BUTTON.into(),
|
|
..default()
|
|
})
|
|
.with_children(|parent| {
|
|
parent.spawn_bundle(TextBundle::from_section(
|
|
"Button",
|
|
TextStyle {
|
|
font: asset_server.load("fonts/FiraSans-Bold.ttf"),
|
|
font_size: 40.0,
|
|
color: Color::rgb(0.9, 0.9, 0.9),
|
|
},
|
|
));
|
|
});
|
|
}
|