bevy_codex/widgets/button/
systems.rs

1use 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}