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()} /> }; } true }