Skip to content
Snippets Groups Projects
panel.rs 1.7 KiB
Newer Older
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()}
			/>