bevy_codex/widgets/panel/
systems.rs1use 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}