bevy_codex/widgets/button/
systems.rs1use bevy::{prelude::*, sprite::Anchor};
2use bevy_lunex::prelude::*;
3
4use crate::resources::CodexSettings;
5
6use super::{
7 components::{CustomButton, CustomButtonUi},
8 styles::get_button_text_styles,
9};
10
11pub fn build_button(
12 mut commands: Commands,
13 assets: Res<AssetServer>,
14 codex_settings: Res<CodexSettings>,
15 query: Query<(Entity, &CustomButton), Added<CustomButton>>,
16) {
17 for (entity, button) in &query {
18 commands
19 .entity(entity)
20 .insert(UiTreeBundle::<CustomButtonUi>::from(UiTree::new2d(
21 "Button",
22 )))
23 .with_children(|ui| {
24 let image = ui
25 .spawn((
26 UiLink::<CustomButtonUi>::path("Control/Image"),
27 UiImage2dBundle {
28 texture: button.texture.clone(),
29 sprite: Sprite {
30 color: Color::Srgba(button.color.into()),
31 ..default()
32 },
33 ..default()
34 },
35 Pickable::IGNORE,
36 UiLayout::window_full().pack::<Base>(),
37 ImageScaleMode::Sliced(TextureSlicer {
38 border: BorderRect::rectangle(10.0, 10.0),
39 ..default()
40 }),
41 ))
42 .id();
43 let text = ui
44 .spawn((
45 UiLink::<CustomButtonUi>::path("Control/Image/Text"),
46 UiLayout::window()
47 .size(Rl(50.0))
48 .pos(Rl(50.0))
49 .anchor(Anchor::Center)
50 .pack::<Base>(),
51 UiText2dBundle {
52 text: Text::from_section(
53 button.text.to_string(),
54 get_button_text_styles(&assets, &codex_settings),
55 ),
56 ..default()
57 },
58 Pickable::IGNORE,
59 ))
60 .id();
61 ui.spawn((
62 UiLink::<CustomButtonUi>::path("Control"),
63 UiLayout::window_full().pack::<Base>(),
64 UiZoneBundle::default(),
65 UiAnimator::<Hover>::new()
66 .forward_speed(5.0)
67 .backward_speed(1.0),
68 UiAnimatorPipe::<Hover>::new(vec![text, image]),
69 UiColor::<Base>::new(button.color),
70 UiColor::<Hover>::new(button.color.lighter(0.5)),
71 OnHoverSetCursor::new(CursorIcon::Pointer),
72 UiClickEmitter {
73 target: Some(entity),
74 },
75 ));
76 });
77 }
78}