// Common functions for examples use crate::*; use bevy::{prelude::*, window::PrimaryWindow}; pub fn deselect_editor_on_esc(i: Res<ButtonInput<KeyCode>>, mut focus: ResMut<FocusedWidget>) { if i.just_pressed(KeyCode::Escape) { focus.0 = None; } } pub fn get_node_cursor_pos( window: &Window, node_transform: &GlobalTransform, size: (f32, f32), is_ui_node: bool, camera: &Camera, camera_transform: &GlobalTransform, ) -> Option<(f32, f32)> { let (x_min, y_min, x_max, y_max) = ( node_transform.affine().translation.x - size.0 / 2., node_transform.affine().translation.y - size.1 / 2., node_transform.affine().translation.x + size.0 / 2., node_transform.affine().translation.y + size.1 / 2., ); window.cursor_position().and_then(|pos| { if is_ui_node { if x_min < pos.x && pos.x < x_max && y_min < pos.y && pos.y < y_max { Some((pos.x - x_min, pos.y - y_min)) } else { None } } else { camera .viewport_to_world_2d(camera_transform, pos) .and_then(|pos| { if x_min < pos.x && pos.x < x_max && y_min < pos.y && pos.y < y_max { Some((pos.x - x_min, y_max - pos.y)) } else { None } }) } }) } pub fn change_active_editor_sprite( mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>, buttons: Res<ButtonInput<MouseButton>>, mut cosmic_edit_query: Query< (&mut Sprite, &GlobalTransform, &Visibility, Entity), (With<CosmicBuffer>, Without<ReadOnly>), >, camera_q: Query<(&Camera, &GlobalTransform)>, ) { let window = windows.single(); let (camera, camera_transform) = camera_q.single(); if buttons.just_pressed(MouseButton::Left) { for (sprite, node_transform, visibility, entity) in &mut cosmic_edit_query.iter_mut() { if visibility == Visibility::Hidden { continue; } let size = sprite.custom_size.unwrap_or(Vec2::ONE); let x_min = node_transform.affine().translation.x - size.x / 2.; let y_min = node_transform.affine().translation.y - size.y / 2.; let x_max = node_transform.affine().translation.x + size.x / 2.; let y_max = node_transform.affine().translation.y + size.y / 2.; if let Some(pos) = window.cursor_position() { if let Some(pos) = camera.viewport_to_world_2d(camera_transform, pos) { if x_min < pos.x && pos.x < x_max && y_min < pos.y && pos.y < y_max { commands.insert_resource(FocusedWidget(Some(entity))) }; } }; } } } pub fn change_active_editor_ui( mut commands: Commands, mut interaction_query: Query< (&Interaction, &CosmicSource), (Changed<Interaction>, Without<ReadOnly>), >, ) { for (interaction, source) in interaction_query.iter_mut() { if let Interaction::Pressed = interaction { commands.insert_resource(FocusedWidget(Some(source.0))); } } } pub fn print_editor_text( text_inputs_q: Query<&CosmicEditor>, mut previous_value: Local<Vec<String>>, ) { for text_input in text_inputs_q.iter() { let current_text: Vec<String> = text_input.with_buffer(|buf| { buf.lines .iter() .map(|bl| bl.text().to_string()) .collect::<Vec<_>>() }); if current_text == *previous_value { return; } *previous_value = current_text.clone(); info!("Widget text: {:?}", current_text); } } pub fn bevy_color_to_cosmic(color: bevy::prelude::Color) -> CosmicColor { CosmicColor::rgba( (color.r() * 255.) as u8, (color.g() * 255.) as u8, (color.b() * 255.) as u8, (color.a() * 255.) as u8, ) } #[cfg(target_arch = "wasm32")] pub fn get_timestamp() -> f64 { js_sys::Date::now() } #[cfg(not(target_arch = "wasm32"))] pub fn get_timestamp() -> f64 { use std::time::SystemTime; use std::time::UNIX_EPOCH; let duration = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); duration.as_millis() as f64 }