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