bevy_codex/widgets/panel/
systems.rs

1use bevy::prelude::*;
2use bevy_lunex::prelude::*;
3
4use crate::widgets::{
5    button::components::CustomButtonRef, list::components::List, status_bar::components::StatusBar,
6};
7
8use super::{
9    components::{Panel, PanelUi},
10    styles::get_panel_text_styles,
11};
12
13pub fn build_button_panel(
14    mut commands: Commands,
15    assets: Res<AssetServer>,
16    query: Query<(Entity, &Panel<CustomButtonRef>), Added<Panel<CustomButtonRef>>>,
17) {
18    for (entity, panel) in &query {
19        let panel_ent = build_panel::<CustomButtonRef>(&mut commands, &assets, entity, panel);
20        commands.entity(panel_ent).with_children(|ui| {
21            let mut buttons = vec![];
22            for btn in &panel.content {
23                buttons.push(btn.link.to_string())
24            }
25            ui.spawn((
26                UiLink::<PanelUi>::path("Panel/List"),
27                UiLayout::window()
28                    .size(Rl((80.0, 87.0)))
29                    .pos(Rl((10.0, 13.0)))
30                    .pack::<Base>(),
31                List {
32                    items: buttons.to_vec(),
33                    ..default()
34                },
35            ));
36        });
37    }
38}
39
40pub fn build_status_bar_panel(
41    mut commands: Commands,
42    assets: Res<AssetServer>,
43    query: Query<(Entity, &Panel<StatusBar>), Added<Panel<StatusBar>>>,
44) {
45    for (entity, panel) in &query {
46        let panel_ent = build_panel::<StatusBar>(&mut commands, &assets, entity, panel);
47        commands.entity(panel_ent).with_children(|ui| {
48            for bar in panel.content.clone() {
49                ui.spawn((
50                    UiLink::<PanelUi>::path("Panel/Statusbar-".to_string() + &bar.label),
51                    UiLayout::solid().size((1920.0,1080.0)).scaling(Scaling::Fit).pack::<Base>(),
52                    bar,
53                ));
54            }
55        });
56    }
57}
58
59fn build_panel<T>(
60    commands: &mut Commands,
61    assets: &Res<AssetServer>,
62    entity: Entity,
63    panel: &Panel<T>,
64) -> Entity {
65    commands
66        .entity(entity)
67        .insert((UiTreeBundle::<PanelUi>::from(UiTree::new2d("Panel")),))
68        .with_children(|ui| {
69            let panel_link = UiLink::<PanelUi>::path("Panel");
70            let mut panel_bundle = ui.spawn((
71                panel_link.clone(),
72                UiLayout::window_full().pack::<Base>(),
73                Pickable::IGNORE,
74                UiColor::<Base>::new(panel.color),
75            ));
76            if panel.texture.is_some() {
77                panel_bundle.insert((
78                    ImageScaleMode::Sliced(TextureSlicer {
79                        border: BorderRect::rectangle(10.0, 10.0),
80                        ..default()
81                    }),
82                    UiImage2dBundle {
83                        texture: panel.texture.as_ref().unwrap().clone(),
84                        sprite: Sprite {
85                            color: Color::Srgba(panel.color.into()),
86                            ..default()
87                        },
88                        ..default()
89                    },
90                ));
91            }
92            if panel.text.is_some() {
93                ui.spawn((
94                    panel_link.add("Heading"),
95                    UiLayout::window().pack::<Base>(),
96                    UiTextSize::new().size(Rh(13.0)),
97                    UiText2dBundle {
98                        text: Text::from_section(
99                            panel.text.clone().unwrap(),
100                            get_panel_text_styles(assets),
101                        ),
102                        ..default()
103                    },
104                    Pickable::IGNORE,
105                ));
106            }
107        })
108        .id()
109}