diff --git a/TODO b/TODO new file mode 100644 index 0000000000000000000000000000000000000000..81c02c59672c0219423fd9f654a8e3fad11c09b7 --- /dev/null +++ b/TODO @@ -0,0 +1,8 @@ + +[ ] Friendly get/set text fns on CosmicEditor impl + +BUGS INTRODUCED: + +[ ] Font size has been changed somehow +[ ] No cursor on readonly +[ ] Window resizing broken \ No newline at end of file diff --git a/examples/readonly.rs b/examples/readonly.rs index 7a9a79a40a55aa0a28ebec14165035dc5114471a..0840ef85bdb8536ff0ce0b28a2053d8ef8f86ae7 100644 --- a/examples/readonly.rs +++ b/examples/readonly.rs @@ -1,14 +1,14 @@ use bevy::{prelude::*, window::PrimaryWindow}; use bevy_cosmic_edit::{ - create_cosmic_font_system, spawn_cosmic_edit, ActiveEditor, CosmicEditMeta, CosmicEditPlugin, - CosmicFont, CosmicFontConfig, CosmicMetrics, CosmicNode, CosmicText, CosmicTextPos, + cosmic_edit_set_text, ActiveEditor, CosmicAttrs, CosmicEditPlugin, CosmicEditUiBundle, + CosmicFontConfig, CosmicFontSystem, CosmicMetrics, CosmicText, CosmicTextPosition, ReadOnly, }; 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()); @@ -23,45 +23,56 @@ fn setup( ..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 font_system = create_cosmic_font_system(cosmic_font_config); - let font_system_handle = 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 cosmic_edit_meta = CosmicEditMeta { - text: CosmicText::OneStyle("馃榾馃榾馃榾 x => y\nRead only widget".to_string()), - attrs: AttrsOwned::new(attrs), - text_pos: CosmicTextPos::Center, - bg: Color::WHITE, - metrics: CosmicMetrics { + + // + let mut cosmic_edit = CosmicEditUiBundle { + style: Style { + width: Val::Percent(100.), + height: Val::Percent(100.), + ..default() + }, + cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs)), + text_position: CosmicTextPosition::Center, + background_color: BackgroundColor(Color::WHITE), + cosmic_metrics: CosmicMetrics { font_size: 14., line_height: 18., scale_factor: primary_window.scale_factor() as f32, }, - font_system_handle, - node: CosmicNode::Ui, - size: None, - readonly: true, - bg_image: None, + ..default() }; - let cosmic_edit = spawn_cosmic_edit(&mut commands, &mut cosmic_fonts, cosmic_edit_meta); - commands.entity(root).add_child(cosmic_edit); - commands.insert_resource(ActiveEditor { - entity: Some(cosmic_edit), + + cosmic_edit_set_text( + CosmicText::OneStyle("馃榾馃榾馃榾 x => y\nRead only widget".to_string()), + AttrsOwned::new(attrs), + &mut cosmic_edit.editor.0, + &mut font_system.0, + ); + + // + let mut id = None; + commands.entity(root).with_children(|parent| { + id = Some(parent.spawn(cosmic_edit).insert(ReadOnly).id()); }); + + commands.insert_resource(ActiveEditor { entity: id }); } 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/src/lib.rs b/src/lib.rs index 0c5fd7ce6bc5a7a91f401493045d13510632aed0..fa35403eca6d5fdbddc8e28cc86165be3b6133a8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,20 +19,6 @@ use cosmic_text::{ }; use image::{imageops::FilterType, GenericImageView}; -#[derive(Clone)] -pub struct CosmicEditUi; - -#[derive(Clone)] -pub struct CosmicEditSprite { - pub transform: Transform, -} - -#[derive(Clone)] -pub enum CosmicNode { - Ui, - Sprite(CosmicEditSprite), -} - #[derive(Clone)] pub enum CosmicText { OneStyle(String), @@ -66,7 +52,7 @@ impl Default for CosmicMetrics { } #[derive(Resource)] -pub struct CosmicFontSystem(FontSystem); +pub struct CosmicFontSystem(pub FontSystem); #[derive(Component)] pub struct ReadOnly; // tag component @@ -85,18 +71,27 @@ impl Default for CosmicEditor { /// Adds the font system to each editor when added fn cosmic_editor_builder( - mut added_editors: Query<&mut CosmicEditor, Added<CosmicEditor>>, + mut added_editors: Query<(&mut CosmicEditor, &CosmicAttrs), Added<CosmicEditor>>, mut font_system: ResMut<CosmicFontSystem>, ) { - for mut editor in added_editors.iter_mut() { - editor - .0 - .buffer_mut() - .set_text(&mut font_system.0, "", Attrs::new(), Shaping::Advanced); + for (mut editor, attrs) in added_editors.iter_mut() { + // keep old text if set + let mut text = get_cosmic_text(editor.0.buffer()); + + if text.is_empty() { + text = "".into(); + } + + editor.0.buffer_mut().set_text( + &mut font_system.0, + text.as_str(), + attrs.0.as_attrs(), + Shaping::Advanced, + ); editor .0 - .buffer_mut() + .buffer_mut() // TODO size here???? .set_size(&mut font_system.0, 100., 100.) } } @@ -410,9 +405,12 @@ pub fn cosmic_edit_set_text( editor: &mut Editor, font_system: &mut FontSystem, ) { + println!("SETTING TEXT"); editor.buffer_mut().lines.clear(); match text { CosmicText::OneStyle(text) => { + println!("ONESTYLE {:?}, {:?}", text, attrs); + editor.buffer_mut().set_text( font_system, text.as_str(), @@ -421,6 +419,8 @@ pub fn cosmic_edit_set_text( ); } CosmicText::MultiStyle(lines) => { + println!("M-M-M-M-MULTI-STYLE"); + for line in lines { let mut line_text = String::new(); let mut attrs_list = AttrsList::new(attrs.as_attrs());