Skip to content
Snippets Groups Projects
panel.rs 2.1 KiB
Newer Older
Louis's avatar
Louis committed
use bevy::prelude::*;
use kayak_ui::prelude::*;
use kayak_ui::widgets::NinePatchBundle;

use crate::parent_widget;
use crate::theme::tokens::THEME_NINEPATCH_PANEL_DEFAULT;
use crate::theme::ThemeProvider;
use crate::{px, value};

#[derive(Default, Copy, Clone, Eq, PartialEq)]
pub enum PanelVariant {
	#[default]
	Regular,
	Simple,
}

Louis's avatar
Louis committed
#[derive(Component, Default, Clone, PartialEq)]
Louis's avatar
Louis committed
pub struct PanelProps {
	pub background: Option<String>,
Louis's avatar
Louis committed
	pub inner_layout: StyleProp<LayoutType>,
Louis's avatar
Louis committed
}

impl Widget for PanelProps {}

parent_widget!(PanelProps => PanelWidget);

pub fn render_panel_widget(
Louis's avatar
Louis committed
	In((widget_context, entity)): In<(KayakWidgetContext, Entity)>,
Louis's avatar
Louis committed
	mut commands: Commands,
	mut query: Query<(&PanelProps, &KChildren, &mut ComputedStyles, &KStyle)>,
	theme_provider: ThemeProvider,
) -> bool {
	if let Ok((props, children, mut computed, style)) = query.get_mut(entity) {
		let parent_id = Some(entity);
		let patch = theme_provider
			.get_patch(
				props
					.background
					.clone()
					.unwrap_or_else(|| String::from(THEME_NINEPATCH_PANEL_DEFAULT)),
			)
			.unwrap();

		*computed = KStyle {
Louis's avatar
Louis committed
			render_command: value(RenderCommand::NinePatch {
				handle: patch.handle.clone_weak(),
				border: patch.border,
			}),
Louis's avatar
Louis committed
			min_height: px(patch.border.bottom + patch.border.top + 8.0),
			min_width: px(patch.border.left + patch.border.right + 8.0),
			..Default::default()
		}
		.with_style(style)
Louis's avatar
Louis committed
		.with_style(KStyle {
			padding: value(Edge::new(
				Units::Pixels(patch.border.top),
				Units::Pixels(patch.border.right),
				Units::Pixels(patch.border.bottom),
				Units::Pixels(patch.border.left),
			)),
			..Default::default()
		})
Louis's avatar
Louis committed
		.into();

		let inner_style = match &style.padding {
			StyleProp::Unset => KStyle {
Louis's avatar
Louis committed
				layout_type: props.inner_layout.clone(),
Louis's avatar
Louis committed
				..Default::default()
			},
			pad => KStyle {
Louis's avatar
Louis committed
				layout_type: props.inner_layout.clone(),
Louis's avatar
Louis committed
				padding: pad.clone(),
				..Default::default()
			},
		};

Louis's avatar
Louis committed
		children.process(&widget_context, Some(entity));

		// rsx! {
		// 	<NinePatchBundle
		// 		nine_patch={patch.clone()}
		// 		styles={inner_style}
		// 		children={children.clone()}
		// 	/>
		// };
Louis's avatar
Louis committed
	}
	true
}