Add some hooks

This commit is contained in:
JMS55 2023-12-05 21:58:45 -08:00
parent 19d0bff2bd
commit 73687a1c43
2 changed files with 42 additions and 6 deletions

View file

@ -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<VirtualDom>);
unsafe impl Send for VirtualDomUnsafe {}
pub fn use_world<'a>(cx: &'a ScopeState) -> &'a World {
cx.consume_context::<EcsContext>()
.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::<EcsContext>()
.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::<EcsContext>()
// .expect("Must be used from a dioxus component within a DioxusUiRoot bevy component")
// .world_read_only;
// world.query_filtered::<Q, F>().iter(&world)
// }
pub fn use_commands<'a>(cx: &'a ScopeState) -> Rc<RefCell<Commands<'a, 'a>>> {
unsafe {
transmute(Rc::clone(
&cx.consume_context::<EcsContext>()
.expect("Must be used from a dioxus component within a DioxusUiRoot bevy component")
.commands,
))
}
}

View file

@ -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 {