Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use bevy::prelude::*;
use kayak_ui::prelude::*;
use kayak_ui::widgets::{NinePatch, NinePatchBundle};
use crate::assets::AssetHandles;
use crate::ui::prelude::{edge_px, px, stretch, value};
use crate::{basic_widget, empty_props, parent_widget};
#[derive(Default, Copy, Clone, Eq, PartialEq)]
pub enum PanelVariant {
#[default]
Regular,
Simple,
}
#[derive(Component, Default, Clone, PartialEq, Eq)]
pub struct PanelProps {
pub variant: PanelVariant,
}
impl Widget for PanelProps {}
parent_widget!(PanelProps => PanelWidget);
pub fn render_panel_widget(
In((mut widget_context, entity)): In<(KayakWidgetContext, Entity)>,
mut commands: Commands,
mut query: Query<(&PanelProps, &KChildren, &mut ComputedStyles, &KStyle)>,
assets: Res<AssetHandles>,
) -> bool {
if let Ok((props, children, mut computed, style)) = query.get_mut(entity) {
let parent_id = Some(entity);
let (handle, edge_size) = match props.variant {
PanelVariant::Regular => (assets.image("panel"), 16.0),
PanelVariant::Simple => (assets.image("scroll_panel"), 44.0),
};
*computed = KStyle {
render_command: value(RenderCommand::Quad),
min_height: px(edge_size * 2.0 + 8.0),
min_width: px(edge_size * 2.0 + 8.0),
padding: value(Edge::all(Units::Stretch(0.0))),
..Default::default()
}
.with_style(style)
.into();
let inner_style = match &style.padding {
StyleProp::Unset => KStyle {
padding: edge_px(edge_size),
..Default::default()
},
pad => KStyle {
padding: pad.clone(),
..Default::default()
},
};
rsx! {
<NinePatchBundle
nine_patch={NinePatch {
handle,
border: Edge::all(edge_size),
}}
styles={inner_style}
children={children.clone()}
/>