use super::Node; use crate::Rect; use bevy_core::transform::run_on_hierarchy_subworld_mut; use bevy_transform::prelude::{Children, Parent}; use bevy_window::Windows; use glam::Vec2; use legion::{prelude::*, systems::SubWorld}; pub fn ui_update_system() -> Box { SystemBuilder::new("ui_update") .read_resource::() .with_query(>::query().filter(!component::())) .write_component::() .write_component::() .read_component::() .build(move |_, world, windows, node_query| { if let Some(window) = windows.get_primary() { let parent_size = glam::vec2(window.width as f32, window.height as f32); let parent_position = glam::vec2(0.0, 0.0); for entity in node_query .iter_entities(world) .map(|(e, _)| e) .collect::>() { run_on_hierarchy_subworld_mut( world, entity, (parent_size, parent_position, 0.9999), &mut update_node_entity, ); } } }) } fn update_node_entity( world: &mut SubWorld, entity: Entity, parent_properties: (Vec2, Vec2, f32), ) -> Option<(Vec2, Vec2, f32)> { let (parent_size, parent_position, z_index) = parent_properties; // TODO: Somehow remove this unsafe unsafe { if let Some(mut node) = world.get_component_mut_unchecked::(entity) { if let Some(mut rect) = world.get_component_mut_unchecked::(entity) { node.update(&mut rect, parent_size, parent_position, z_index); return Some((rect.size, rect.position, z_index - 0.0001)); } } } None }