//! Selection delete/duplicate and camera focus helpers. use bevy::prelude::*; use bevy_inspector_egui::bevy_inspector::hierarchy::SelectedEntities; use shared::LevelObject; use crate::camera::EditorCamera; use crate::history::{ delete_entities_with_history, duplicate_entities_with_history, set_transform_group_with_history, }; use crate::selection::SelectedEntity; use crate::ui::UiState; pub fn focus_editor_camera_on_selection(world: &mut World) { let Some(entity) = world.resource::().0 else { return; }; let Some(target) = world.get::(entity) else { return; }; let center = target.translation(); let mut cameras = world.query_filtered::<&mut Transform, With>(); for mut transform in cameras.iter_mut(world) { let offset = transform.translation - center; let distance = offset.length().max(8.0); transform.translation = center - transform.forward().as_vec3() * distance; transform.look_at(center, Vec3::Y); } } pub fn selected_level_entities(world: &World, selected: &SelectedEntities) -> Vec { selected .iter() .filter(|entity| { world .get_entity(*entity) .is_ok_and(|entity_ref| entity_ref.contains::()) }) .collect() } pub fn entity_name(world: &World, entity: Entity) -> String { world .get::(entity) .map(|name| name.as_str().to_string()) .unwrap_or_else(|| format!("{entity:?}")) } pub fn is_level_object(world: &World, entity: Entity) -> bool { world .get_entity(entity) .is_ok_and(|entity_ref| entity_ref.contains::()) } pub fn delete_selection(world: &mut World, selected: &SelectedEntities) { let entities = selected_level_entities(world, selected); delete_entities_with_history(world, &entities); } pub fn duplicate_selection(world: &mut World, selected: &SelectedEntities) { let entities = selected_level_entities(world, selected); duplicate_entities_with_history(world, &entities); } pub fn reset_selected_transforms(world: &mut World) { let changes: Vec<_> = world .resource::() .selected_entities .iter() .filter(|entity| is_level_object(world, *entity)) .filter_map(|entity| { world .get::(entity) .copied() .map(|old| (entity, old, Transform::default())) }) .collect(); set_transform_group_with_history(world, changes); }