From 606afa592b42017df0b27503707db984efde4f60 Mon Sep 17 00:00:00 2001 From: sam edelsten <samedelsten1@gmail.com> Date: Thu, 10 Aug 2023 15:52:05 +0100 Subject: [PATCH] move click handlers to utils --- TODO | 5 +-- examples/bevy_api_testing.rs | 5 ++- examples/font_per_widget.rs | 4 +++ examples/multiple_sprites.rs | 4 +++ src/lib.rs | 59 +----------------------------------- src/utils.rs | 56 ++++++++++++++++++++++++++++++++++ 6 files changed, 72 insertions(+), 61 deletions(-) diff --git a/TODO b/TODO index 1d4f2d7..795e37b 100644 --- a/TODO +++ b/TODO @@ -3,8 +3,6 @@ BUGS INTRODUCED: -[ ] Not all text boxes want to be click-selectable - Make utils.rs in examples; move click functions there. BUGS SQUASHED: @@ -20,3 +18,6 @@ BUGS SQUASHED: Used to redraw on click, now redraws on scroll or drag? Now drag doesn't work either (tested on readonly, might be that) fixed by percentage-select fix + +[x] Not all text boxes want to be click-selectable + Make utils.rs in examples; move click functions there. diff --git a/examples/bevy_api_testing.rs b/examples/bevy_api_testing.rs index c2677d1..fcb9bc8 100644 --- a/examples/bevy_api_testing.rs +++ b/examples/bevy_api_testing.rs @@ -1,6 +1,7 @@ use bevy::prelude::*; use bevy_cosmic_edit::{ - ActiveEditor, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicEditUiBundle, + change_active_editor_sprite, change_active_editor_ui, ActiveEditor, CosmicEditPlugin, + CosmicEditSpriteBundle, CosmicEditUiBundle, }; fn setup(mut commands: Commands) { @@ -42,5 +43,7 @@ fn main() { .add_plugins(DefaultPlugins) .add_plugins(CosmicEditPlugin::default()) .add_systems(Startup, setup) + .add_systems(Update, change_active_editor_ui) + .add_systems(Update, change_active_editor_sprite) .run(); } diff --git a/examples/font_per_widget.rs b/examples/font_per_widget.rs index 59687bb..50d0843 100644 --- a/examples/font_per_widget.rs +++ b/examples/font_per_widget.rs @@ -1,6 +1,8 @@ #![allow(clippy::type_complexity)] use bevy::{prelude::*, window::PrimaryWindow}; +use bevy_cosmic_edit::change_active_editor_sprite; +use bevy_cosmic_edit::change_active_editor_ui; use bevy_cosmic_edit::{ ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicFontConfig, CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition, @@ -292,5 +294,7 @@ fn main() { .add_plugins(DefaultPlugins) .add_plugins(CosmicEditPlugin { font_config }) .add_systems(Startup, setup) + .add_systems(Update, change_active_editor_ui) + .add_systems(Update, change_active_editor_sprite) .run(); } diff --git a/examples/multiple_sprites.rs b/examples/multiple_sprites.rs index cd54dad..d71e6b5 100644 --- a/examples/multiple_sprites.rs +++ b/examples/multiple_sprites.rs @@ -1,4 +1,6 @@ use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow}; +use bevy_cosmic_edit::change_active_editor_sprite; +use bevy_cosmic_edit::change_active_editor_ui; use bevy_cosmic_edit::{ ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig, CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition, @@ -93,5 +95,7 @@ fn main() { .add_plugins(DefaultPlugins) .add_plugins(CosmicEditPlugin { font_config }) .add_systems(Startup, setup) + .add_systems(Update, change_active_editor_ui) + .add_systems(Update, change_active_editor_sprite) .run(); } diff --git a/src/lib.rs b/src/lib.rs index 80c95e6..8dcf611 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -368,8 +368,6 @@ impl Plugin for CosmicEditPlugin { .add_systems( Update, ( - change_active_editor_ui, - change_active_editor_sprite, cosmic_edit_bevy_events, cosmic_edit_set_redraw, on_scale_factor_change, @@ -394,57 +392,6 @@ pub struct ActiveEditor { pub entity: Option<Entity>, } -fn change_active_editor_ui( - mut commands: Commands, - mut interaction_query: Query< - (&Interaction, Entity), - ( - Changed<Interaction>, - (With<CosmicEditor>, Without<ReadOnly>), - ), - >, -) { - for (interaction, entity) in interaction_query.iter_mut() { - if let Interaction::Pressed = interaction { - commands.insert_resource(ActiveEditor { - entity: Some(entity), - }); - } - } -} - -fn change_active_editor_sprite( - mut commands: Commands, - windows: Query<&Window, With<PrimaryWindow>>, - buttons: Res<Input<MouseButton>>, - mut cosmic_edit_query: Query< - (&mut Sprite, &GlobalTransform, Entity), - (With<CosmicEditor>, 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, entity) in &mut cosmic_edit_query.iter_mut() { - let size = sprite.custom_size.unwrap_or(Vec2::new(1., 1.)); - 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(ActiveEditor { - entity: Some(entity), - }); - }; - } - }; - } - } -} - /// Resource struct that holds configuration options for cosmic fonts. #[derive(Resource, Clone)] pub struct CosmicFontConfig { @@ -965,11 +912,7 @@ pub fn cosmic_edit_bevy_events( if let Some(node_cursor_pos) = get_node_cursor_pos( primary_window, node_transform, - ( - // TODO this does not work with percent sizes - // well like I haven't tested it so it might - width, height, - ), + (width, height), is_ui_node, camera, camera_transform, diff --git a/src/utils.rs b/src/utils.rs index 8728dda..b3d72d9 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -10,3 +10,59 @@ pub fn get_timestamp() -> f64 { let duration = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); duration.as_millis() as f64 } + +use crate::{ActiveEditor, CosmicEditor, ReadOnly}; +use bevy::{prelude::*, ui::Interaction, window::PrimaryWindow}; + +// util fns for examples +// +pub fn change_active_editor_ui( + mut commands: Commands, + mut interaction_query: Query< + (&Interaction, Entity), + ( + Changed<Interaction>, + (With<CosmicEditor>, Without<ReadOnly>), + ), + >, +) { + for (interaction, entity) in interaction_query.iter_mut() { + if let Interaction::Pressed = interaction { + commands.insert_resource(ActiveEditor { + entity: Some(entity), + }); + } + } +} + +pub fn change_active_editor_sprite( + mut commands: Commands, + windows: Query<&Window, With<PrimaryWindow>>, + buttons: Res<Input<MouseButton>>, + mut cosmic_edit_query: Query< + (&mut Sprite, &GlobalTransform, Entity), + (With<CosmicEditor>, 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, entity) in &mut cosmic_edit_query.iter_mut() { + let size = sprite.custom_size.unwrap_or(Vec2::new(1., 1.)); + 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(ActiveEditor { + entity: Some(entity), + }); + }; + } + }; + } + } +} -- GitLab