diff --git a/TODO b/TODO index 39f53d7e7bf5448c4c5a824bdaaf49e6634013e3..e386cf1ffece8ab58c4e07d8195a3192d974709a 100644 --- a/TODO +++ b/TODO @@ -3,6 +3,13 @@ BUGS INTRODUCED: +[ ] MultiStyle text is fully dead. Idk what I did to it :( + +[ ] Cannot select text on Ui bundles sized by percentage + Maybe intercept percentages and set as px on instantiation? + Replace evaluate() with custom percent to px fn? + Read into how evaluate() works + [ ] Window resizing broken Used to redraw on click, now redraws on scroll or drag? Now drag doesn't work either (tested on readonly, might be that) diff --git a/examples/basic_button.rs b/examples/basic_button.rs index 9f355754c3ca76f4aab8a7e1081b0a6207781a1a..943700dd1abca1bc417a3f021c13d958160ef09c 100644 --- a/examples/basic_button.rs +++ b/examples/basic_button.rs @@ -1,67 +1,69 @@ -use bevy::{prelude::*, window::PrimaryWindow}; +use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow}; use bevy_cosmic_edit::{ - create_cosmic_font_system, spawn_cosmic_edit, ActiveEditor, CosmicEditMeta, CosmicEditPlugin, - CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode, CosmicText, CosmicTextPos, + ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicFontConfig, + CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition, }; use cosmic_text::AttrsOwned; fn setup( mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>, - mut cosmic_fonts: ResMut<Assets<CosmicFont>>, + mut font_system: ResMut<CosmicFontSystem>, ) { let primary_window = windows.single(); - commands.spawn(Camera2dBundle::default()); - let root = commands - .spawn(NodeBundle { - style: Style { - display: Display::Flex, - width: Val::Percent(100.), - height: Val::Percent(100.), - ..default() - }, - ..default() - }) - .id(); - - let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf"); - let cosmic_font_config = CosmicFontConfig { - fonts_dir_path: None, - font_bytes: Some(vec![font_bytes]), - load_system_fonts: true, + let camera_bundle = Camera2dBundle { + camera_2d: Camera2d { + clear_color: ClearColorConfig::Custom(Color::WHITE), + }, + ..default() }; - let font_system = create_cosmic_font_system(cosmic_font_config); - let font_system_handle: Handle<CosmicFont> = cosmic_fonts.add(CosmicFont(font_system)); + commands.spawn(camera_bundle); + let mut attrs = cosmic_text::Attrs::new(); attrs = attrs.family(cosmic_text::Family::Name("Victor Mono")); attrs = attrs.color(cosmic_text::Color::rgb(0x94, 0x00, 0xD3)); - let cosmic_edit_meta = CosmicEditMeta { - text: CosmicText::OneStyle("😀😀😀 x => y".to_string()), - attrs: AttrsOwned::new(attrs), - text_pos: CosmicTextPos::Center, - bg: Color::WHITE, - metrics: CosmicMetrics { + + let scale_factor = primary_window.scale_factor() as f32; + + let cosmic_edit = CosmicEditUiBundle { + style: Style { + width: Val::Percent(100.), + height: Val::Percent(100.), + ..default() + }, + cosmic_metrics: CosmicMetrics { font_size: 14., line_height: 18., - scale_factor: primary_window.scale_factor() as f32, + scale_factor, }, - font_system_handle, - node: CosmicNode::Ui, - size: None, - readonly: false, - bg_image: None, - }; - let cosmic_edit = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta); - commands.entity(root).add_child(cosmic_edit); + text_position: CosmicTextPosition::Center, + cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)), + ..default() + } + .set_text( + CosmicText::OneStyle("😀😀😀 x => y".to_string()), + AttrsOwned::new(attrs), + &mut font_system.0, + ); + + let cosmic_edit = commands.spawn(cosmic_edit).id(); + commands.insert_resource(ActiveEditor { entity: Some(cosmic_edit), }); } fn main() { + let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf"); + let font_config = CosmicFontConfig { + fonts_dir_path: None, + font_bytes: Some(vec![font_bytes]), + load_system_fonts: true, + }; + App::new() .add_plugins(DefaultPlugins) - .add_plugins(CosmicEditPlugin) + .add_plugins(CosmicEditPlugin { font_config }) .add_systems(Startup, setup) .run(); } diff --git a/examples/basic_sprite.rs b/examples/basic_sprite.rs index 696d26c810385be49ade2148d75ff3506e419ad6..ef0b9e3ca5113029f525bd62995bf7bc12c05e5d 100644 --- a/examples/basic_sprite.rs +++ b/examples/basic_sprite.rs @@ -1,15 +1,14 @@ use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow}; use bevy_cosmic_edit::{ - create_cosmic_font_system, spawn_cosmic_edit, ActiveEditor, CosmicEditMeta, CosmicEditPlugin, - CosmicEditSprite, CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode, CosmicText, - CosmicTextPos, + ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig, + CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition, }; use cosmic_text::AttrsOwned; fn setup( mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>, - mut cosmic_fonts: ResMut<Assets<CosmicFont>>, + mut font_system: ResMut<CosmicFontSystem>, ) { let primary_window = windows.single(); let camera_bundle = Camera2dBundle { @@ -19,49 +18,51 @@ fn setup( ..default() }; commands.spawn(camera_bundle); - let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf"); - let cosmic_font_config = CosmicFontConfig { - fonts_dir_path: None, - font_bytes: Some(vec![font_bytes]), - load_system_fonts: true, - }; - let font_system = create_cosmic_font_system(cosmic_font_config); - let font_system_handle: Handle<CosmicFont> = cosmic_fonts.add(CosmicFont(font_system)); + let mut attrs = cosmic_text::Attrs::new(); attrs = attrs.family(cosmic_text::Family::Name("Victor Mono")); attrs = attrs.color(cosmic_text::Color::rgb(0x94, 0x00, 0xD3)); + let scale_factor = primary_window.scale_factor() as f32; - let cosmic_edit_meta = CosmicEditMeta { - text: CosmicText::OneStyle("😀😀😀 x => y".to_string()), - attrs: AttrsOwned::new(attrs), - text_pos: CosmicTextPos::Center, - bg: Color::WHITE, - metrics: CosmicMetrics { + + let cosmic_edit = CosmicEditSpriteBundle { + sprite: Sprite { + custom_size: Some(Vec2::new(primary_window.width(), primary_window.height())), + ..default() + }, + cosmic_metrics: CosmicMetrics { font_size: 14., line_height: 18., scale_factor, }, - font_system_handle, - node: CosmicNode::Sprite(CosmicEditSprite { - transform: Transform { - translation: Vec3::new(0., 0., 1.), - ..default() - }, - }), - size: Some((primary_window.width(), primary_window.height())), - readonly: false, - bg_image: None, - }; - let cosmic_edit = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta); + text_position: CosmicTextPosition::Center, + cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)), + ..default() + } + .set_text( + CosmicText::OneStyle("😀😀😀 x => y".to_string()), + AttrsOwned::new(attrs), + &mut font_system.0, + ); + + let cosmic_edit = commands.spawn(cosmic_edit).id(); + commands.insert_resource(ActiveEditor { entity: Some(cosmic_edit), }); } fn main() { + let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf"); + let font_config = CosmicFontConfig { + fonts_dir_path: None, + font_bytes: Some(vec![font_bytes]), + load_system_fonts: true, + }; + App::new() .add_plugins(DefaultPlugins) - .add_plugins(CosmicEditPlugin) + .add_plugins(CosmicEditPlugin { font_config }) .add_systems(Startup, setup) .run(); } diff --git a/examples/font_per_widget.rs b/examples/font_per_widget.rs index 8cfd85eb5b4e907c792e8488b8f49ae55d53c9f6..59687bb43a21a8dee00204ddbe1164a9d0dd5113 100644 --- a/examples/font_per_widget.rs +++ b/examples/font_per_widget.rs @@ -1,15 +1,16 @@ +#![allow(clippy::type_complexity)] + use bevy::{prelude::*, window::PrimaryWindow}; use bevy_cosmic_edit::{ - create_cosmic_font_system, get_cosmic_text, spawn_cosmic_edit, ActiveEditor, CosmicEdit, - CosmicEditMeta, CosmicEditPlugin, CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode, - CosmicText, CosmicTextPos, + ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, CosmicFontConfig, + CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition, }; -use cosmic_text::*; +use cosmic_text::{Attrs, AttrsOwned, Family}; fn setup( mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>, - mut cosmic_fonts: ResMut<Assets<CosmicFont>>, + mut font_system: ResMut<CosmicFontSystem>, ) { commands.spawn(Camera2dBundle::default()); let root = commands @@ -24,13 +25,6 @@ fn setup( }) .id(); let primary_window = windows.single(); - let cosmic_font_config = CosmicFontConfig { - fonts_dir_path: None, - font_bytes: None, - load_system_fonts: true, - }; - let font_system = create_cosmic_font_system(cosmic_font_config); - let font_system_handle = cosmic_fonts.add(CosmicFont(font_system)); let attrs = Attrs::new(); let serif_attrs = attrs.family(Family::Serif); @@ -229,77 +223,74 @@ fn setup( )], ]; - let cosmic_edit_meta_1 = CosmicEditMeta { - text: CosmicText::MultiStyle(lines), - attrs: AttrsOwned::new(attrs), - text_pos: CosmicTextPos::Center, - metrics: CosmicMetrics { + let cosmic_edit_1 = CosmicEditUiBundle { + text_position: bevy_cosmic_edit::CosmicTextPosition::Center, + cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)), + cosmic_metrics: CosmicMetrics { font_size: 18., line_height: 22., scale_factor: primary_window.scale_factor() as f32, }, - font_system_handle: font_system_handle.clone(), - node: CosmicNode::Ui, - size: None, - bg: bevy::prelude::Color::WHITE, - readonly: false, - bg_image: None, - }; - let cosmic_edit_1 = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta_1); + style: Style { + width: Val::Percent(50.), + height: Val::Percent(100.), + ..default() + }, + background_color: BackgroundColor(Color::WHITE), + ..default() + } + .set_text( + CosmicText::MultiStyle(lines), + AttrsOwned::new(attrs), + &mut font_system.0, + ); let mut attrs_2 = cosmic_text::Attrs::new(); attrs_2 = attrs_2.family(cosmic_text::Family::Name("Times New Roman")); - let cosmic_edit_meta_2 = CosmicEditMeta { - text: CosmicText::OneStyle("Widget 2.\nClick on me =>".to_string()), - attrs: AttrsOwned::new(attrs_2), - metrics: CosmicMetrics { + + let cosmic_edit_2 = CosmicEditUiBundle { + cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs_2)), + cosmic_metrics: CosmicMetrics { font_size: 14., line_height: 18., scale_factor: primary_window.scale_factor() as f32, }, - font_system_handle: font_system_handle.clone(), - node: CosmicNode::Ui, - text_pos: CosmicTextPos::Center, - size: None, - bg: bevy::prelude::Color::WHITE.with_a(0.8), - readonly: false, - bg_image: None, - }; - let cosmic_edit_2 = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta_2); - - commands.entity(root).add_child(cosmic_edit_1); - commands.entity(root).add_child(cosmic_edit_2); + text_position: CosmicTextPosition::Center, + background_color: BackgroundColor(Color::WHITE.with_a(0.8)), + style: Style { + width: Val::Percent(50.), + height: Val::Percent(100.), + ..default() + }, + ..default() + } + .set_text( + CosmicText::OneStyle("Widget 2.\nClick on me =>".to_string()), + AttrsOwned::new(attrs_2), + &mut font_system.0, + ); - commands.insert_resource(ActiveEditor { - entity: Some(cosmic_edit_1), + let mut id = None; + // Spawn the CosmicEditUiBundles as children of root + commands.entity(root).with_children(|parent| { + id = Some(parent.spawn(cosmic_edit_1).id()); + parent.spawn(cosmic_edit_2); }); -} -fn change_active_editor( - mut commands: Commands, - mut interaction_query: Query< - (&Interaction, &mut CosmicEdit, Entity), - (Changed<Interaction>, With<CosmicEdit>), - >, -) { - for (interaction, cosmic_edit, entity) in interaction_query.iter_mut() { - if let Interaction::Pressed = interaction { - commands.insert_resource(ActiveEditor { - entity: Some(entity), - }); - info!( - "Widget text: {}", - get_cosmic_text(&cosmic_edit.editor.buffer()) - ); - } - } + // Set active editor + commands.insert_resource(ActiveEditor { entity: id }); } fn main() { + let font_config = CosmicFontConfig { + fonts_dir_path: None, + font_bytes: None, + load_system_fonts: true, + }; + App::new() .add_plugins(DefaultPlugins) - .add_plugins(CosmicEditPlugin) + .add_plugins(CosmicEditPlugin { font_config }) .add_systems(Startup, setup) - .add_systems(Update, change_active_editor) .run(); } diff --git a/examples/multiple_sprites.rs b/examples/multiple_sprites.rs index e89bd86255da132a08f9942adefef741cf97c588..cd54dad9b36ae3e45bc6ecd43e6919609a93a8fb 100644 --- a/examples/multiple_sprites.rs +++ b/examples/multiple_sprites.rs @@ -1,18 +1,14 @@ use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*, window::PrimaryWindow}; use bevy_cosmic_edit::{ - create_cosmic_font_system, spawn_cosmic_edit, ActiveEditor, CosmicEdit, CosmicEditMeta, - CosmicEditPlugin, CosmicEditSprite, CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode, - CosmicText, CosmicTextPos, + ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditSpriteBundle, CosmicFontConfig, + CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition, }; use cosmic_text::AttrsOwned; -#[derive(Component)] -pub struct MainCamera; - fn setup( mut commands: Commands, windows: Query<&Window, With<PrimaryWindow>>, - mut cosmic_fonts: ResMut<Assets<CosmicFont>>, + mut font_system: ResMut<CosmicFontSystem>, ) { let primary_window = windows.single(); let camera_bundle = Camera2dBundle { @@ -21,15 +17,8 @@ fn setup( }, ..default() }; - commands.spawn((camera_bundle, MainCamera)); - let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf"); - let cosmic_font_config = CosmicFontConfig { - fonts_dir_path: None, - font_bytes: Some(vec![font_bytes]), - load_system_fonts: true, - }; - let font_system = create_cosmic_font_system(cosmic_font_config); - let font_system_handle = cosmic_fonts.add(CosmicFont(font_system)); + commands.spawn(camera_bundle); + let mut attrs = cosmic_text::Attrs::new(); attrs = attrs.family(cosmic_text::Family::Name("Victor Mono")); attrs = attrs.color(cosmic_text::Color::rgb(0x94, 0x00, 0xD3)); @@ -38,111 +27,71 @@ fn setup( line_height: 18., scale_factor: primary_window.scale_factor() as f32, }; - let cosmic_edit_meta = CosmicEditMeta { - text: CosmicText::OneStyle("😀😀😀 x => y".to_string()), - attrs: AttrsOwned::new(attrs), - text_pos: CosmicTextPos::Center, - metrics: metrics.clone(), - font_system_handle: font_system_handle.clone(), - node: CosmicNode::Sprite(CosmicEditSprite { - transform: Transform { - translation: Vec3::new(-primary_window.width() / 4., 0., 1.), - ..default() - }, - }), - size: Some((primary_window.width() / 2., primary_window.height())), - bg: Color::WHITE, - readonly: false, - bg_image: None, - }; - let cosmic_edit_1 = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta); - let cosmic_edit_meta = CosmicEditMeta { - text: CosmicText::OneStyle("Widget_2. Click on me".to_string()), - attrs: AttrsOwned::new(attrs), - text_pos: CosmicTextPos::Center, - metrics: metrics.clone(), - font_system_handle: font_system_handle.clone(), - node: CosmicNode::Sprite(CosmicEditSprite { - transform: Transform { - translation: Vec3::new( - primary_window.width() / 4., - -primary_window.height() / 4., - 1., - ), - ..default() - }, - }), - size: Some((primary_window.width() / 2., primary_window.height() / 2.)), - bg: Color::GRAY.with_a(0.5), - readonly: false, - bg_image: None, - }; - let _ = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta); - let cosmic_edit_meta = CosmicEditMeta { - text: CosmicText::OneStyle("Widget_3. Click on me".to_string()), - attrs: AttrsOwned::new(attrs), - text_pos: CosmicTextPos::Center, - metrics: metrics.clone(), - font_system_handle: font_system_handle.clone(), - node: CosmicNode::Sprite(CosmicEditSprite { - transform: Transform { - translation: Vec3::new( - primary_window.width() / 4., - primary_window.height() / 4., - 1., - ), - ..default() - }, - }), - size: Some((primary_window.width() / 2., primary_window.height() / 2.)), - bg: Color::GRAY.with_a(0.8), - readonly: false, - bg_image: None, - }; - let _ = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta); - commands.insert_resource(ActiveEditor { - entity: Some(cosmic_edit_1), - }); -} -fn change_active_editor( - mut commands: Commands, - windows: Query<&Window, With<PrimaryWindow>>, - buttons: Res<Input<MouseButton>>, - mut cosmic_edit_query: Query<(&mut CosmicEdit, &GlobalTransform, Entity), With<CosmicEdit>>, - camera_q: Query<(&Camera, &GlobalTransform), With<MainCamera>>, -) { - let window = windows.single(); - let (camera, camera_transform) = camera_q.single(); - if buttons.just_pressed(MouseButton::Left) { - for (cosmic_edit, node_transform, entity) in &mut cosmic_edit_query.iter_mut() { - let size = (cosmic_edit.width, cosmic_edit.height); - let x_min = node_transform.affine().translation.x - size.0 / 2.; - let y_min = node_transform.affine().translation.y - size.1 / 2.; - let x_max = node_transform.affine().translation.x + size.0 / 2.; - let y_max = node_transform.affine().translation.y + size.1 / 2.; - window.cursor_position().and_then(|pos| { - if let Some(pos) = camera.viewport_to_world_2d(camera_transform, pos) { - Some({ - if x_min < pos.x && pos.x < x_max && y_min < pos.y && pos.y < y_max { - commands.insert_resource(ActiveEditor { - entity: Some(entity), - }); - }; - }) - } else { - None - } - }); - } + let cosmic_edit_1 = CosmicEditSpriteBundle { + cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)), + cosmic_metrics: metrics.clone(), + sprite: Sprite { + custom_size: Some(Vec2 { + x: primary_window.width() / 2., + y: primary_window.height(), + }), + ..default() + }, + transform: Transform::from_translation(Vec3::new(-primary_window.width() / 4., 0., 1.)), + text_position: CosmicTextPosition::Center, + background_color: BackgroundColor(Color::ALICE_BLUE), + ..default() } + .set_text( + CosmicText::OneStyle("😀😀😀 x => y".to_string()), + AttrsOwned::new(attrs), + &mut font_system.0, + ); + + let cosmic_edit_2 = CosmicEditSpriteBundle { + cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)), + cosmic_metrics: metrics, + sprite: Sprite { + custom_size: Some(Vec2 { + x: primary_window.width() / 2., + y: primary_window.height() / 2., + }), + ..default() + }, + transform: Transform::from_translation(Vec3::new( + primary_window.width() / 4., + -primary_window.height() / 4., + 1., + )), + text_position: CosmicTextPosition::Center, + background_color: BackgroundColor(Color::GRAY.with_a(0.5)), + ..default() + } + .set_text( + CosmicText::OneStyle("Widget_2. Click on me".to_string()), + AttrsOwned::new(attrs), + &mut font_system.0, + ); + + let id = commands.spawn(cosmic_edit_1).id(); + + commands.insert_resource(ActiveEditor { entity: Some(id) }); + + commands.spawn(cosmic_edit_2); } fn main() { + let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf"); + let font_config = CosmicFontConfig { + fonts_dir_path: None, + font_bytes: Some(vec![font_bytes]), + load_system_fonts: true, + }; + App::new() .add_plugins(DefaultPlugins) - .add_plugins(CosmicEditPlugin) + .add_plugins(CosmicEditPlugin { font_config }) .add_systems(Startup, setup) - .add_systems(Update, change_active_editor) .run(); } diff --git a/src/lib.rs b/src/lib.rs index 6339a5b32df396bd28592449ba51b27caab517db..3f72a301ba6d56f6bdb5b1534f3cae52f58c04f7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,7 +22,7 @@ use image::{imageops::FilterType, GenericImageView}; #[derive(Clone)] pub enum CosmicText { OneStyle(String), - MultiStyle(Vec<Vec<(String, cosmic_text::AttrsOwned)>>), + MultiStyle(Vec<Vec<(String, AttrsOwned)>>), } /// Enum representing the position of the cosmic text. @@ -57,9 +57,6 @@ pub struct CosmicFontSystem(pub FontSystem); #[derive(Component)] pub struct ReadOnly; // tag component -#[derive(Component)] -pub struct CosmicUiNode; // tag component - #[derive(Component)] pub struct CosmicEditor(pub Editor); @@ -74,7 +71,7 @@ impl CosmicEditor { &mut self, text: CosmicText, attrs: AttrsOwned, - // i'd like to get this automagically but i'm too 3head -bytemunch + // i'd like to get the font system automagically but i'm too 3head -bytemunch font_system: &mut FontSystem, ) -> &mut Self { let editor = &mut self.0; @@ -88,7 +85,7 @@ impl CosmicEditor { Shaping::Advanced, ); } - // TODO test + // TODO why not working? CosmicText::MultiStyle(lines) => { for line in lines { let mut line_text = String::new(); @@ -313,6 +310,18 @@ pub struct CosmicEditSpriteBundle { pub background_image: CosmicBackground, } +impl CosmicEditSpriteBundle { + pub fn set_text( + mut self, + text: CosmicText, + attrs: AttrsOwned, + font_system: &mut FontSystem, + ) -> Self { + self.editor.set_text(text, attrs, font_system); + self + } +} + impl Default for CosmicEditSpriteBundle { fn default() -> Self { Self { @@ -361,7 +370,8 @@ impl Plugin for CosmicEditPlugin { .add_systems( Update, ( - change_active_editor, + change_active_editor_ui, + change_active_editor_sprite, cosmic_edit_bevy_events, cosmic_edit_set_redraw, on_scale_factor_change, @@ -386,20 +396,53 @@ pub struct ActiveEditor { pub entity: Option<Entity>, } -fn change_active_editor( +fn change_active_editor_ui( mut commands: Commands, mut interaction_query: Query< - (&Interaction, &mut CosmicEditor, Entity), - (Changed<Interaction>, With<CosmicEditor>), + (&Interaction, Entity), + ( + Changed<Interaction>, + (With<CosmicEditor>, Without<ReadOnly>), + ), >, ) { - for (interaction, editor, entity) in interaction_query.iter_mut() { + for (interaction, entity) in interaction_query.iter_mut() { if let Interaction::Pressed = interaction { - info!("PRESSED"); commands.insert_resource(ActiveEditor { entity: Some(entity), }); - info!("Widget text: {}", editor.get_text()); + } + } +} + +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), + }); + }; + } + }; } } } @@ -630,8 +673,8 @@ pub fn cosmic_edit_bevy_events( let (width, height, is_ui_node) = match style_query.get(entity) { Ok(style) => ( - style.width.evaluate(1.).unwrap(), - style.height.evaluate(1.).unwrap(), + style.width.evaluate(1.).unwrap_or(1.), + style.height.evaluate(1.).unwrap_or(1.), true, ), Err(_) => { @@ -1054,8 +1097,6 @@ fn redraw_buffer_common( let swash_cache = &mut swash_cache_state.swash_cache; editor.shape_as_needed(&mut font_system.0); if editor.buffer().redraw() { - println!("REDRAW"); - editor .buffer_mut() .set_size(&mut font_system.0, width, height); @@ -1116,10 +1157,8 @@ fn redraw_buffer_common( ); editor.buffer_mut().set_redraw(false); - println!("TRY CLEAR"); if let Some(prev_image) = images.get_mut(cosmic_canvas_img_handle) { if *cosmic_canvas_img_handle == bevy::render::texture::DEFAULT_IMAGE_HANDLE.typed() { - println!("SWAP HANDLE"); let mut prev_image = prev_image.clone(); prev_image.data.clear(); prev_image.data.extend_from_slice(pixels.as_slice()); @@ -1133,7 +1172,6 @@ fn redraw_buffer_common( let new_handle = images.set(new_handle, prev_image); *cosmic_canvas_img_handle = new_handle; } else { - println!("CLEAR CANVAS"); prev_image.data.clear(); prev_image.data.extend_from_slice(pixels.as_slice()); prev_image.resize(Extent3d {