From 6bbbcd605deaf93b1dabc69a13523c8962632e36 Mon Sep 17 00:00:00 2001
From: Louis Capitanchik <contact@louiscap.co>
Date: Sun, 22 Jan 2023 20:12:39 +0000
Subject: [PATCH] Fix macro exports and exportes utilities

---
 src/lib.rs       |  5 +--
 src/utilities.rs | 89 ++++++++++++++++++++++++++----------------------
 2 files changed, 52 insertions(+), 42 deletions(-)

diff --git a/src/lib.rs b/src/lib.rs
index f2c470d..599a663 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,7 +4,7 @@ mod theme;
 mod types;
 pub(crate) mod utilities;
 
-pub (crate) extern crate bevy;
+pub extern crate bevy;
 pub extern crate kayak_font;
 pub extern crate kayak_ui;
 
@@ -37,7 +37,8 @@ pub use styles::{edge_px, pct, px, stretch, val_auto, value};
 pub use theme::{tokens, ThemeMapping, ThemeProvider};
 pub use types::IconContent;
 pub use utilities::{
-	context, remove_root_ui, widget_update_with_resource, EmptyProps, StateUIRoot,
+	context, remove_root_ui, remove_tagged_root, widget_update_with_resource, EmptyProps,
+	StateUIRoot,
 };
 
 pub mod prelude {
diff --git a/src/utilities.rs b/src/utilities.rs
index 3beddcd..ae0653f 100644
--- a/src/utilities.rs
+++ b/src/utilities.rs
@@ -19,34 +19,34 @@ pub struct EmptyProps;
 #[macro_export]
 macro_rules! empty_props {
 	($name: ident) => {
-		#[derive(::bevy::prelude::Component, Clone, PartialEq, Default)]
+		#[derive($crate::bevy::prelude::Component, Clone, PartialEq, Default)]
 		#[repr(transparent)]
-		pub struct $name($crate::ui::utilities::EmptyProps);
-		impl kayak_ui::prelude::Widget for $name {}
+		pub struct $name($crate::EmptyProps);
+		impl $crate::kayak_ui::prelude::Widget for $name {}
 	};
 }
 
 #[macro_export]
 macro_rules! basic_widget {
 	($props: ident => $name: ident) => {
-		#[derive(bevy::prelude::Bundle)]
+		#[derive($crate::bevy::prelude::Bundle)]
 		pub struct $name {
 			pub props: $props,
-			pub name: ::kayak_ui::prelude::WidgetName,
-			pub styles: ::kayak_ui::prelude::KStyle,
-			pub computed_styles: ::kayak_ui::prelude::ComputedStyles,
-			pub on_event: ::kayak_ui::prelude::OnEvent,
+			pub name: $crate::kayak_ui::prelude::WidgetName,
+			pub styles: $crate::kayak_ui::prelude::KStyle,
+			pub computed_styles: $crate::kayak_ui::prelude::ComputedStyles,
+			pub on_event: $crate::kayak_ui::prelude::OnEvent,
 		}
 
 		impl std::default::Default for $name {
 			fn default() -> $name {
 				let props = $props::default();
 				$name {
-					name: kayak_ui::prelude::Widget::get_name(&props),
+					name: $crate::kayak_ui::prelude::Widget::get_name(&props),
 					props,
-					styles: ::kayak_ui::prelude::KStyle::default(),
-					computed_styles: ::kayak_ui::prelude::ComputedStyles::default(),
-					on_event: ::kayak_ui::prelude::OnEvent::default(),
+					styles: $crate::kayak_ui::prelude::KStyle::default(),
+					computed_styles: $crate::kayak_ui::prelude::ComputedStyles::default(),
+					on_event: $crate::kayak_ui::prelude::OnEvent::default(),
 				}
 			}
 		}
@@ -55,26 +55,26 @@ macro_rules! basic_widget {
 #[macro_export]
 macro_rules! parent_widget {
 	($props: ident => $name: ident) => {
-		#[derive(bevy::prelude::Bundle)]
+		#[derive($crate::bevy::prelude::Bundle)]
 		pub struct $name {
 			pub props: $props,
-			pub name: ::kayak_ui::prelude::WidgetName,
-			pub styles: ::kayak_ui::prelude::KStyle,
-			pub computed_styles: ::kayak_ui::prelude::ComputedStyles,
-			pub children: ::kayak_ui::prelude::KChildren,
-			pub on_event: ::kayak_ui::prelude::OnEvent,
+			pub name: $crate::kayak_ui::prelude::WidgetName,
+			pub styles: $crate::kayak_ui::prelude::KStyle,
+			pub computed_styles: $crate::kayak_ui::prelude::ComputedStyles,
+			pub children: $crate::kayak_ui::prelude::KChildren,
+			pub on_event: $crate::kayak_ui::prelude::OnEvent,
 		}
 
 		impl std::default::Default for $name {
 			fn default() -> $name {
 				let props = $props::default();
 				$name {
-					name: kayak_ui::prelude::Widget::get_name(&props),
+					name: $crate::kayak_ui::prelude::Widget::get_name(&props),
 					props,
-					styles: ::kayak_ui::prelude::KStyle::default(),
-					computed_styles: ::kayak_ui::prelude::ComputedStyles::default(),
-					children: ::kayak_ui::prelude::KChildren::default(),
-					on_event: ::kayak_ui::prelude::OnEvent::default(),
+					styles: $crate::kayak_ui::prelude::KStyle::default(),
+					computed_styles: $crate::kayak_ui::prelude::ComputedStyles::default(),
+					children: $crate::kayak_ui::prelude::KChildren::default(),
+					on_event: $crate::kayak_ui::prelude::OnEvent::default(),
 				}
 			}
 		}
@@ -86,8 +86,8 @@ macro_rules! register_widget {
 	($ctx: expr, $props: ident, $state: ident, $system: ident) => {{
 		$ctx.add_widget_data::<$props, $state>();
 		$ctx.add_widget_system(
-			::kayak_ui::prelude::Widget::get_name(&$props::default()),
-			::kayak_ui::prelude::widget_update::<$props, $state>,
+			$crate::kayak_ui::prelude::Widget::get_name(&$props::default()),
+			$crate::kayak_ui::prelude::widget_update::<$props, $state>,
 			$system,
 		);
 	}};
@@ -98,7 +98,7 @@ macro_rules! register_widget_with_update {
 	($ctx: expr, $props: ident, $state: ident, $system: ident, $update: expr) => {{
 		$ctx.add_widget_data::<$props, $state>();
 		$ctx.add_widget_system(
-			::kayak_ui::prelude::Widget::get_name(&$props::default()),
+			$crate::kayak_ui::prelude::Widget::get_name(&$props::default()),
 			$update,
 			$system,
 		);
@@ -110,8 +110,8 @@ macro_rules! register_widget_with_resource {
 	($ctx: expr, $props: ident, $state: ident, $resource: ident, $system: ident) => {{
 		$ctx.add_widget_data::<$props, $state>();
 		$ctx.add_widget_system(
-			::kayak_ui::prelude::Widget::get_name(&$props::default()),
-			$crate::ui::utilities::widget_update_with_resource::<$props, $state, $resource>,
+			$crate::kayak_ui::prelude::Widget::get_name(&$props::default()),
+			$crate::widget_update_with_resource::<$props, $state, $resource>,
 			$system,
 		);
 	}};
@@ -122,8 +122,8 @@ macro_rules! register_widget_with_context {
 	($ctx: expr, $props: ident, $state: path, $context: ident, $system: ident) => {{
 		$ctx.add_widget_data::<$props, $state>();
 		$ctx.add_widget_system(
-			::kayak_ui::prelude::Widget::get_name(&$props::default()),
-			::kayak_ui::prelude::widget_update_with_context::<$props, $state, $context>,
+			$crate::kayak_ui::prelude::Widget::get_name(&$props::default()),
+			$crate::kayak_ui::prelude::widget_update_with_context::<$props, $state, $context>,
 			$system,
 		);
 	}};
@@ -134,11 +134,11 @@ macro_rules! register_widget_with_many_resources {
 	($ctx: expr, $props: ident, $state: ident, $system: ident, $($name: ident: $resource: ident),+) => {{
 		$ctx.add_widget_data::<$props, $state>();
 		$ctx.add_widget_system(
-			::kayak_ui::prelude::Widget::get_name(&$props::default()),
+			$crate::kayak_ui::prelude::Widget::get_name(&$props::default()),
 			|
-				::bevy::prelude::In((widget_context, entity, previous_entity)): ::bevy::prelude::In<(::kayak_ui::prelude::KayakWidgetContext, ::bevy::prelude::Entity, ::bevy::prelude::Entity)>,
-				$( $name: ::bevy::prelude::Res<$resource> ),+,
-				widget_param: ::kayak_ui::prelude::WidgetParam<$props, $state>,
+				$crate::bevy::prelude::In((widget_context, entity, previous_entity)): $crate::bevy::prelude::In<($crate::kayak_ui::prelude::KayakWidgetContext, $crate::bevy::prelude::Entity, $crate::bevy::prelude::Entity)>,
+				$( $name: $crate::bevy::prelude::Res<$resource> ),+,
+				widget_param: $crate::kayak_ui::prelude::WidgetParam<$props, $state>,
 			| {
 				widget_param.has_changed(&widget_context, entity, previous_entity)
 					$( || $name.is_changed() )+
@@ -153,12 +153,12 @@ macro_rules! register_complex_widget {
 	($ctx: expr, $props: ident, $state: ident, $system: ident, R($($r_name: ident: $resource: ident),*), C($($c_name: ident: $context: ident),*)) => {{
 		$ctx.add_widget_data::<$props, $state>();
 		$ctx.add_widget_system(
-			::kayak_ui::prelude::Widget::get_name(&$props::default()),
+			$crate::kayak_ui::prelude::Widget::get_name(&$props::default()),
 			|
-				::bevy::prelude::In((widget_context, entity, previous_entity)): ::bevy::prelude::In<(::kayak_ui::prelude::KayakWidgetContext, ::bevy::prelude::Entity, ::bevy::prelude::Entity)>,
-				$( $r_name: ::bevy::prelude::Res<$resource> ),*,
-				$( $c_name: ::bevy::prelude::Query<::bevy::prelude::Entity, ::bevy::prelude::Changed<$context>> ),*,
-				widget_param: ::kayak_ui::prelude::WidgetParam<$props, $state>,
+				$crate::bevy::prelude::In((widget_context, entity, previous_entity)): $crate::bevy::prelude::In<($crate::kayak_ui::prelude::KayakWidgetContext, $crate::bevy::prelude::Entity, $crate::bevy::prelude::Entity)>,
+				$( $r_name: $crate::bevy::prelude::Res<$resource> ),*,
+				$( $c_name: $crate::bevy::prelude::Query<$crate::bevy::prelude::Entity, $crate::bevy::prelude::Changed<$context>> ),*,
+				widget_param: $crate::kayak_ui::prelude::WidgetParam<$props, $state>,
 			| {
 				$(
 					if let Some(context_entity) = widget_context.get_context_entity::<$context>(entity) {
@@ -200,6 +200,15 @@ pub fn remove_root_ui(
 	}
 }
 
+pub fn remove_tagged_root<T: Component>(
+	mut commands: Commands,
+	query: Query<Entity, (With<KayakRootContext>, With<T>)>,
+) {
+	for entity in &query {
+		commands.entity(entity).despawn_recursive();
+	}
+}
+
 pub mod context {
 	use kayak_ui::prelude::{EmptyState, KayakRootContext};
 	use kayak_ui::widgets::KayakWidgetsContextPlugin;
@@ -259,7 +268,7 @@ pub type OnEventParams = In<(EventDispatcherContext, WidgetState, Event, Entity)
 macro_rules! on_button_click {
 	($param_type: ty, $func_body: expr) => {
 		$crate::kayak_ui::prelude::OnEvent::new(
-			move |::bevy::prelude::In((
+			move |$crate::bevy::prelude::In((
 				event_dispatcher_context,
 				_widget_state,
 				event,
-- 
GitLab