diff --git a/src/components.rs b/src/components.rs index 0db7ad1308d375944f7ac9f526735782fafaacad..f86d07f0e4dc6a8bc66173f25eb6e71bb5fb2630 100644 --- a/src/components.rs +++ b/src/components.rs @@ -1,7 +1,9 @@ mod button; mod inset_icon; +mod panel; pub use button::{ button_props, render_button_widget, ButtonWidget, ButtonWidgetProps, ButtonWidgetState, }; pub use inset_icon::{render_inset_icon_widget, InsetIconProps, InsetIconWidget}; +pub use panel::{render_panel_widget, PanelProps, PanelWidget, PanelVariant}; \ No newline at end of file diff --git a/src/components/panel.rs b/src/components/panel.rs new file mode 100644 index 0000000000000000000000000000000000000000..1acf9fcc401fa7a9620c36f1e609e2bc7b1451b3 --- /dev/null +++ b/src/components/panel.rs @@ -0,0 +1,81 @@ +use bevy::prelude::*; +use kayak_ui::prelude::*; + +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, +} + +#[derive(Component, Default, Clone, PartialEq)] +pub struct PanelProps { + pub background: Option<String>, + pub inner_layout: StyleProp<LayoutType>, +} + +impl Widget for PanelProps {} + +parent_widget!(PanelProps => PanelWidget); + +pub fn render_panel_widget( + In(entity): In<Entity>, + widget_context: Res<KayakWidgetContext>, + 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 { + render_command: value(RenderCommand::NinePatch { + handle: patch.handle.clone_weak(), + border: patch.border, + scale: 1.0, + }), + 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) + .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() + }) + .into(); + + let inner_style = match &style.padding { + StyleProp::Unset => KStyle { + layout_type: props.inner_layout.clone(), + ..Default::default() + }, + pad => KStyle { + layout_type: props.inner_layout.clone(), + padding: pad.clone(), + ..Default::default() + }, + }; + + children.process(&widget_context, &mut commands, Some(entity)); + } + true +} diff --git a/src/utilities.rs b/src/utilities.rs index 1ff2e8345378df7d08835b56eccae77d64c70721..0048b6d34f33884f000d8371bacf407379b5c1fa 100644 --- a/src/utilities.rs +++ b/src/utilities.rs @@ -230,7 +230,7 @@ pub mod context { pub struct CresthollowBaseComponentsPlugin; impl KayakUIPlugin for CresthollowBaseComponentsPlugin { fn build(&self, widget_context: &mut KayakRootContext) { - // register_widget!(widget_context, PanelProps, EmptyState, render_panel_widget); + register_widget!(widget_context, PanelProps, EmptyState, render_panel_widget); register_widget!( widget_context, ButtonWidgetProps,