diff --git a/src/lib.rs b/src/lib.rs index f2c470d1eaf360b49112a2d60663557bec2cf5b5..599a66307d06fc8a7c2e730a9c60d1723da78392 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 3beddcd0d3b615099f1b3acbd32125461987eee0..ae0653fc0b4712a92fdf5e774738c5d3be624f13 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,