From 73687a1c43cd6cd35391fc6b4ac1e6b6dc98f658 Mon Sep 17 00:00:00 2001 From: JMS55 <47158642+JMS55@users.noreply.github.com> Date: Tue, 5 Dec 2023 21:58:45 -0800 Subject: [PATCH] Add some hooks --- src/implementation.rs | 46 +++++++++++++++++++++++++++++++++++++------ src/lib.rs | 2 ++ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/implementation.rs b/src/implementation.rs index cc18884..4824222 100644 --- a/src/implementation.rs +++ b/src/implementation.rs @@ -2,14 +2,14 @@ use super::DioxusUiRoot; use bevy::{ ecs::{ entity::Entity, - system::{CommandQueue, Commands}, + system::{CommandQueue, Commands, Resource}, world::World, }, prelude::{Deref, DerefMut}, utils::synccell::SyncCell, }; -use dioxus_core::{Mutations, VirtualDom}; -use std::{cell::RefCell, rc::Rc}; +use dioxus_core::{Mutations, ScopeState, VirtualDom}; +use std::{cell::RefCell, mem::transmute, rc::Rc}; pub fn tick_dioxus_ui(world: &mut World) { unsafe { @@ -31,10 +31,10 @@ pub fn tick_dioxus_ui(world: &mut World) { .get() .base_scope() .provide_context(EcsContext { - world_read_only: std::mem::transmute(world_cell.world()), + world_read_only: transmute(world_cell.world()), commands: Rc::new(RefCell::new(Commands::new( - std::mem::transmute(&mut command_queue), - std::mem::transmute(world_cell.world()), + transmute(&mut command_queue), + transmute(world_cell.world()), ))), }); @@ -70,3 +70,37 @@ struct EcsContext { #[derive(Deref, DerefMut)] pub struct VirtualDomUnsafe(pub SyncCell); unsafe impl Send for VirtualDomUnsafe {} + +pub fn use_world<'a>(cx: &'a ScopeState) -> &'a World { + cx.consume_context::() + .expect("Must be used from a dioxus component within a DioxusUiRoot bevy component") + .world_read_only +} + +pub fn use_res<'a, T: Resource>(cx: &'a ScopeState) -> &'a T { + cx.consume_context::() + .expect("Must be used from a dioxus component within a DioxusUiRoot bevy component") + .world_read_only + .resource() +} + +// TODO +// pub fn use_query<'a, Q: ReadOnlyWorldQuery, F: ReadOnlyWorldQuery>( +// cx: &'a ScopeState, +// ) -> QueryIter<'a, '_, Q, F> { +// let world = &mut cx +// .consume_context::() +// .expect("Must be used from a dioxus component within a DioxusUiRoot bevy component") +// .world_read_only; +// world.query_filtered::().iter(&world) +// } + +pub fn use_commands<'a>(cx: &'a ScopeState) -> Rc>> { + unsafe { + transmute(Rc::clone( + &cx.consume_context::() + .expect("Must be used from a dioxus component within a DioxusUiRoot bevy component") + .commands, + )) + } +} diff --git a/src/lib.rs b/src/lib.rs index a2b1a0e..85e61e2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,8 @@ use bevy::{ }; use dioxus_core::{Element, Scope, VirtualDom}; +pub use self::implementation::{use_commands, use_res, use_world}; + pub struct DioxusUiPlugin; impl Plugin for DioxusUiPlugin {