From d29af9f99042642a5842bbb5ea696327b6ddb834 Mon Sep 17 00:00:00 2001 From: Louis Capitanchik <contact@louiscap.co> Date: Sat, 18 May 2024 04:45:19 +0100 Subject: [PATCH] Include panel component --- src/components.rs | 2 + src/components/panel.rs | 81 +++++++++++++++++++++++++++++++++++++++++ src/utilities.rs | 2 +- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/components/panel.rs diff --git a/src/components.rs b/src/components.rs index 0db7ad1..f86d07f 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 0000000..1acf9fc --- /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 1ff2e83..0048b6d 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, -- GitLab