diff --git a/examples/every_option.rs b/examples/every_option.rs index 1e1d6aa4e1428ba2673cf560e7322cb6b12b0a23..c64e133a1d8debda4edb13a9a155e71887a29d11 100644 --- a/examples/every_option.rs +++ b/examples/every_option.rs @@ -18,14 +18,14 @@ fn setup(mut commands: Commands, mut font_system: ResMut<CosmicFontSystem>) { ), cursor_color: CursorColor(Color::GREEN), selection_color: SelectionColor(Color::PINK), - fill_color: FillColor(Color::YELLOW_GREEN), + fill_color: CosmicBackgroundColor(Color::YELLOW_GREEN), x_offset: XOffset::default(), - text_position: CosmicTextPosition::default(), - background_image: CosmicBackground::default(), + text_position: CosmicTextAlign::default(), + background_image: CosmicBackgroundImage::default(), default_attrs: DefaultAttrs(AttrsOwned::new(attrs)), - max_chars: CosmicMaxChars(15), - max_lines: CosmicMaxLines(1), - mode: CosmicMode::Wrap, + max_chars: MaxChars(15), + max_lines: MaxLines(1), + mode: CosmicWrap::Wrap, // CosmicEdit draws to this spritebundle sprite_bundle: SpriteBundle { sprite: Sprite { diff --git a/examples/image_background.rs b/examples/image_background.rs index 48152788956371873d2c1501b42c343e26ce9259..c80bc8f29e294e970d3f6f688ec4fe8d1ab1cf57 100644 --- a/examples/image_background.rs +++ b/examples/image_background.rs @@ -11,7 +11,7 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) { default_attrs: DefaultAttrs(AttrsOwned::new( Attrs::new().color(bevy_color_to_cosmic(Color::GREEN)), )), - background_image: CosmicBackground(Some(bg_image_handle)), + background_image: CosmicBackgroundImage(Some(bg_image_handle)), ..default() }) .id(); diff --git a/examples/multiple_sprites.rs b/examples/multiple_sprites.rs index e5cdb5098ff9937382ec04625e808f01f10c0eb3..2bca069215945b0bd56b129c129e53c67a54f216 100644 --- a/examples/multiple_sprites.rs +++ b/examples/multiple_sprites.rs @@ -21,7 +21,7 @@ fn setup( attrs = attrs.color(bevy_color_to_cosmic(Color::PURPLE)); commands.spawn(CosmicEditBundle { - fill_color: FillColor(Color::ALICE_BLUE), + fill_color: CosmicBackgroundColor(Color::ALICE_BLUE), buffer: CosmicBuffer::new(&mut font_system, Metrics::new(14., 18.)).with_text( &mut font_system, "馃榾馃榾馃榾 x => y", @@ -42,7 +42,7 @@ fn setup( }); commands.spawn(CosmicEditBundle { - fill_color: FillColor(Color::GRAY.with_a(0.5)), + fill_color: CosmicBackgroundColor(Color::GRAY.with_a(0.5)), buffer: CosmicBuffer::new(&mut font_system, Metrics::new(14., 18.)).with_text( &mut font_system, "Widget_2. Click on me", diff --git a/examples/password.rs b/examples/password.rs index 4314c464ae098b9d823f36738c6f139f95b5a2a8..75bfac024f3cd96cd5f746e1ef203c6c817d0e1c 100644 --- a/examples/password.rs +++ b/examples/password.rs @@ -7,8 +7,8 @@ fn setup(mut commands: Commands) { // Sprite editor commands.spawn(( CosmicEditBundle { - max_lines: CosmicMaxLines(1), - mode: CosmicMode::InfiniteLine, + max_lines: MaxLines(1), + mode: CosmicWrap::InfiniteLine, sprite_bundle: SpriteBundle { // Sets size of text box sprite: Sprite { diff --git a/examples/sprite_and_ui_clickable.rs b/examples/sprite_and_ui_clickable.rs index 68d87e407c25fc7b6ec89f4d8ddd7ee5871da6be..1d1325387c93402057a03a7a327e3198cc47b594 100644 --- a/examples/sprite_and_ui_clickable.rs +++ b/examples/sprite_and_ui_clickable.rs @@ -10,9 +10,9 @@ fn setup(mut commands: Commands) { default_attrs: DefaultAttrs(AttrsOwned::new( Attrs::new().color(bevy_color_to_cosmic(Color::GREEN)), )), - max_lines: CosmicMaxLines(1), - mode: CosmicMode::InfiniteLine, - text_position: CosmicTextPosition::Left { padding: 5 }, + max_lines: MaxLines(1), + mode: CosmicWrap::InfiniteLine, + text_position: CosmicTextAlign::Left { padding: 5 }, ..default() }) .id(); @@ -33,8 +33,8 @@ fn setup(mut commands: Commands) { // Sprite editor commands.spawn((CosmicEditBundle { - max_lines: CosmicMaxLines(1), - mode: CosmicMode::InfiniteLine, + max_lines: MaxLines(1), + mode: CosmicWrap::InfiniteLine, sprite_bundle: SpriteBundle { // Sets size of text box sprite: Sprite { diff --git a/src/buffer.rs b/src/buffer.rs index 422c6050d047575da35068474728f86916350c7a..e38326d4dade2b481797d04e006f5951838b1b59 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -1,6 +1,7 @@ use crate::*; use bevy::{prelude::*, window::PrimaryWindow}; +/// Set of all buffer setup functions. Runs in `First` #[derive(SystemSet, Debug, Clone, PartialEq, Eq, Hash)] pub struct BufferSet; @@ -62,11 +63,13 @@ impl Default for CosmicBuffer { } impl<'s, 'r> CosmicBuffer { + /// Create a new buffer with a font system pub fn new(font_system: &mut FontSystem, metrics: Metrics) -> Self { Self(Buffer::new(font_system, metrics)) } // Das a lotta boilerplate just to hide the shaping argument + /// Add text to a newly created `CosmicBuffer` pub fn with_text( mut self, font_system: &mut FontSystem, @@ -77,6 +80,9 @@ impl<'s, 'r> CosmicBuffer { self } + /// Add rich text to a newly created `CosmicBuffer` + /// + /// Rich text is an iterable of `(&'s str, Attrs<'r>) pub fn with_rich_text<I>( mut self, font_system: &mut FontSystem, @@ -91,6 +97,7 @@ impl<'s, 'r> CosmicBuffer { self } + /// Replace buffer text pub fn set_text( &mut self, font_system: &mut FontSystem, @@ -102,6 +109,9 @@ impl<'s, 'r> CosmicBuffer { self } + /// Replace buffer text with rich text + /// + /// Rich text is an iterable of `(&'s str, Attrs<'r>) pub fn set_rich_text<I>( &mut self, font_system: &mut FontSystem, @@ -158,6 +168,7 @@ impl<'s, 'r> CosmicBuffer { } } +/// Adds a `FontSystem` to a newly created `CosmicBuffer` if one was not provided pub fn add_font_system( mut font_system: ResMut<CosmicFontSystem>, mut q: Query<&mut CosmicBuffer, Added<CosmicBuffer>>, @@ -171,6 +182,7 @@ pub fn add_font_system( } } +/// Initialises `CosmicBuffer` scale factor pub fn set_initial_scale( window_q: Query<&Window, With<PrimaryWindow>>, mut cosmic_query: Query<&mut CosmicBuffer, Added<CosmicBuffer>>, @@ -184,19 +196,22 @@ pub fn set_initial_scale( } } +/// Initialises new `CosmicBuffer` redraw flag to true pub fn set_redraw(mut q: Query<&mut CosmicBuffer, Added<CosmicBuffer>>) { for mut b in q.iter_mut() { b.set_redraw(true); } } +/// Initialises new `CosmicEditor` redraw flag to true pub fn set_editor_redraw(mut q: Query<&mut CosmicEditor, Added<CosmicEditor>>) { for mut b in q.iter_mut() { b.set_redraw(true); } } -pub(crate) fn swap_target_handle( +/// Sets image of UI elements to the `CosmicBuffer` output +pub fn swap_target_handle( source_q: Query<&Handle<Image>, With<CosmicBuffer>>, mut dest_q: Query< ( diff --git a/src/cosmic_edit.rs b/src/cosmic_edit.rs index ab13543341355ba1e778e7277f7509e68be6a6d1..3b8a085b069e9a37bbb0e511fa9b532be9e36227 100644 --- a/src/cosmic_edit.rs +++ b/src/cosmic_edit.rs @@ -1,36 +1,41 @@ use crate::*; use bevy::prelude::*; +/// Enum representing text wrapping in a cosmic `Buffer` #[derive(Clone, Component, PartialEq, Default)] -pub enum CosmicMode { +pub enum CosmicWrap { InfiniteLine, #[default] Wrap, } -/// Enum representing the position of the cosmic text. +/// Enum representing the text alignment in a cosmic `Buffer` #[derive(Clone, Component)] -pub enum CosmicTextPosition { +pub enum CosmicTextAlign { Center { padding: i32 }, TopLeft { padding: i32 }, Left { padding: i32 }, } -impl Default for CosmicTextPosition { +impl Default for CosmicTextAlign { fn default() -> Self { - CosmicTextPosition::Center { padding: 5 } + CosmicTextAlign::Center { padding: 5 } } } +/// Tag component to disable writing to a `CosmicBuffer` +// TODO: Code example #[derive(Component)] pub struct ReadOnly; // tag component +/// Internal value used to decide what section of a `Buffer` to render #[derive(Component, Debug, Default)] pub struct XOffset { pub left: f32, pub width: f32, } +/// Default text attributes to be used on a `CosmicBuffer` #[derive(Component, Deref, DerefMut)] pub struct DefaultAttrs(pub AttrsOwned); @@ -40,45 +45,70 @@ impl Default for DefaultAttrs { } } +/// Image to be used as a buffer's background #[derive(Component, Default)] -pub struct CosmicBackground(pub Option<Handle<Image>>); +pub struct CosmicBackgroundImage(pub Option<Handle<Image>>); +/// Color to be used as a buffer's background #[derive(Component, Default, Deref)] -pub struct FillColor(pub Color); +pub struct CosmicBackgroundColor(pub Color); +/// Color to be used for the text cursor #[derive(Component, Default, Deref)] pub struct CursorColor(pub Color); +/// Color to be used as the selected text background #[derive(Component, Default, Deref)] pub struct SelectionColor(pub Color); +/// Maximum number of lines allowed in a buffer #[derive(Component, Default)] -pub struct CosmicMaxLines(pub usize); +pub struct MaxLines(pub usize); +/// Maximum number of characters allowed in a buffer +// TODO: Check this functionality with widechars; Use graphemes to test? #[derive(Component, Default)] -pub struct CosmicMaxChars(pub usize); +pub struct MaxChars(pub usize); +/// A pointer to an entity with a `CosmicEditBundle`, used to apply cosmic rendering to a UI +/// element. +/// +/// TODO code example +/// #[derive(Component)] pub struct CosmicSource(pub Entity); +/// A bundle containing all the required components for `CosmicBuffer` functionality. +/// +/// Uses an invisible `SpriteBundle` for rendering by default, so should either be paired with another +/// entity with a `CosmicSource` pointing to it's entity, or have the sprite set. +/// +/// ### UI mode +/// +/// TODO code example +/// +/// ### Sprite mode +/// +/// TODO code example +/// #[derive(Bundle)] pub struct CosmicEditBundle { // cosmic bits pub buffer: CosmicBuffer, // render bits - pub fill_color: FillColor, + pub fill_color: CosmicBackgroundColor, pub cursor_color: CursorColor, pub selection_color: SelectionColor, pub default_attrs: DefaultAttrs, - pub background_image: CosmicBackground, + pub background_image: CosmicBackgroundImage, pub sprite_bundle: SpriteBundle, // restriction bits - pub max_lines: CosmicMaxLines, - pub max_chars: CosmicMaxChars, + pub max_lines: MaxLines, + pub max_chars: MaxChars, // layout bits pub x_offset: XOffset, - pub mode: CosmicMode, - pub text_position: CosmicTextPosition, + pub mode: CosmicWrap, + pub text_position: CosmicTextAlign, pub padding: CosmicPadding, pub widget_size: CosmicWidgetSize, } @@ -111,9 +141,11 @@ impl Default for CosmicEditBundle { } } +/// Holds the font system used internally by `cosmic_text` #[derive(Resource, Deref, DerefMut)] pub struct CosmicFontSystem(pub FontSystem); +/// Wrapper component for an `Editor` with a few helpful values for cursor blinking #[derive(Component, Deref, DerefMut)] pub struct CosmicEditor { #[deref] diff --git a/src/events.rs b/src/events.rs index 57aa2008ee256b13ccd5312dd1f337b206dfe296..90ee52b8a5fdce526d9e62409b43bcd25ec8946e 100644 --- a/src/events.rs +++ b/src/events.rs @@ -2,6 +2,7 @@ use bevy::prelude::*; +/// Registers internal events pub struct EventsPlugin; impl Plugin for EventsPlugin { @@ -10,5 +11,8 @@ impl Plugin for EventsPlugin { } } +/// Text change events +/// Sent when text is changed in a cosmic buffer +/// Contains the entity on which the text was changed, and the new text as a `String` #[derive(Event, Debug)] pub struct CosmicTextChanged(pub (Entity, String)); diff --git a/src/focus.rs b/src/focus.rs index 4f8d5f85347070a6a49b352f7cb984d33c84eb1e..615d2691d5b708be8b7db3278a60fb7ff6cdf4fc 100644 --- a/src/focus.rs +++ b/src/focus.rs @@ -2,6 +2,7 @@ use crate::*; use bevy::prelude::*; use cosmic_text::{Edit, Editor}; +/// System set for focus systems. Runs in `PostUpdate` #[derive(SystemSet, Debug, Clone, PartialEq, Eq, Hash)] pub struct FocusSet; diff --git a/src/input.rs b/src/input.rs index 6e7ad8f7307c24b65190af510f2b97e74722be9a..d1a738e9efcd41d4304a56379d66475592c9437d 100644 --- a/src/input.rs +++ b/src/input.rs @@ -61,7 +61,7 @@ pub(crate) fn input_mouse( mut editor_q: Query<( &mut CosmicEditor, &GlobalTransform, - &CosmicTextPosition, + &CosmicTextAlign, Entity, &XOffset, &mut Sprite, @@ -134,12 +134,12 @@ pub(crate) fn input_mouse( } let (padding_x, padding_y) = match text_position { - CosmicTextPosition::Center { padding: _ } => ( + CosmicTextAlign::Center { padding: _ } => ( get_x_offset_center(width * scale_factor, &buffer), get_y_offset_center(height * scale_factor, &buffer), ), - CosmicTextPosition::TopLeft { padding } => (*padding, *padding), - CosmicTextPosition::Left { padding } => ( + CosmicTextAlign::TopLeft { padding } => (*padding, *padding), + CosmicTextAlign::Left { padding } => ( *padding, get_y_offset_center(height * scale_factor, &buffer), ), @@ -392,8 +392,8 @@ pub(crate) fn kb_input_text( mut cosmic_edit_query: Query<( &mut CosmicEditor, &mut CosmicBuffer, - &CosmicMaxLines, - &CosmicMaxChars, + &MaxLines, + &MaxChars, Entity, Option<&ReadOnly>, )>, @@ -501,8 +501,8 @@ pub fn kb_clipboard( mut cosmic_edit_query: Query<( &mut CosmicEditor, &mut CosmicBuffer, - &CosmicMaxLines, - &CosmicMaxChars, + &MaxLines, + &MaxChars, Entity, Option<&ReadOnly>, )>, @@ -650,8 +650,8 @@ pub fn poll_wasm_paste( &mut CosmicEditor, &mut CosmicBuffer, &crate::DefaultAttrs, - &CosmicMaxChars, - &CosmicMaxChars, + &MaxChars, + &MaxChars, ), Without<ReadOnly>, >, diff --git a/src/render.rs b/src/render.rs index ef9d04d729f65caa90e34c754ae3a8637358200f..e9b9b64f6134497d64be71ea31abec54def054e1 100644 --- a/src/render.rs +++ b/src/render.rs @@ -81,8 +81,8 @@ fn render_texture( Option<&mut CosmicEditor>, &mut CosmicBuffer, &DefaultAttrs, - &CosmicBackground, - &FillColor, + &CosmicBackgroundImage, + &CosmicBackgroundColor, &CursorColor, &SelectionColor, &Handle<Image>, @@ -90,7 +90,7 @@ fn render_texture( &CosmicPadding, &XOffset, Option<&ReadOnly>, - &CosmicTextPosition, + &CosmicTextAlign, )>, mut font_system: ResMut<CosmicFontSystem>, mut images: ResMut<Assets<Image>>, @@ -149,9 +149,9 @@ fn render_texture( .unwrap_or(cosmic_text::Color::rgb(0, 0, 0)); let min_pad = match position { - CosmicTextPosition::Center { padding } => *padding as f32, - CosmicTextPosition::TopLeft { padding } => *padding as f32, - CosmicTextPosition::Left { padding } => *padding as f32, + CosmicTextAlign::Center { padding } => *padding as f32, + CosmicTextAlign::TopLeft { padding } => *padding as f32, + CosmicTextAlign::Left { padding } => *padding as f32, }; let draw_closure = |x, y, w, h, color| { diff --git a/src/widget.rs b/src/widget.rs index e79ac22f3ff7a01b9bc923592dfcf25899b1b400..3ef917af31d906c569620f4232d40c25038f5603 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -42,14 +42,14 @@ pub fn set_padding( mut query: Query< ( &mut CosmicPadding, - &CosmicTextPosition, + &CosmicTextAlign, &CosmicBuffer, &CosmicWidgetSize, Option<&CosmicEditor>, ), Or<( With<CosmicEditor>, - Changed<CosmicTextPosition>, + Changed<CosmicTextAlign>, Changed<CosmicBuffer>, Changed<CosmicWidgetSize>, )>, @@ -68,12 +68,12 @@ pub fn set_padding( } padding.0 = match position { - CosmicTextPosition::Center { padding: _ } => Vec2::new( + CosmicTextAlign::Center { padding: _ } => Vec2::new( get_x_offset_center(size.0.x, &buffer) as f32, get_y_offset_center(size.0.y, &buffer) as f32, ), - CosmicTextPosition::TopLeft { padding } => Vec2::new(*padding as f32, *padding as f32), - CosmicTextPosition::Left { padding } => Vec2::new( + CosmicTextAlign::TopLeft { padding } => Vec2::new(*padding as f32, *padding as f32), + CosmicTextAlign::Left { padding } => Vec2::new( *padding as f32, get_y_offset_center(size.0.y, &buffer) as f32, ), @@ -99,28 +99,28 @@ pub fn set_buffer_size( mut query: Query< ( &mut CosmicBuffer, - &CosmicMode, + &CosmicWrap, &CosmicWidgetSize, - &CosmicTextPosition, + &CosmicTextAlign, ), Or<( - Changed<CosmicMode>, + Changed<CosmicWrap>, Changed<CosmicWidgetSize>, - Changed<CosmicTextPosition>, + Changed<CosmicTextAlign>, )>, >, mut font_system: ResMut<CosmicFontSystem>, ) { for (mut buffer, mode, size, position) in query.iter_mut() { let padding_x = match position { - CosmicTextPosition::Center { padding: _ } => 0., - CosmicTextPosition::TopLeft { padding } => *padding as f32, - CosmicTextPosition::Left { padding } => *padding as f32, + CosmicTextAlign::Center { padding: _ } => 0., + CosmicTextAlign::TopLeft { padding } => *padding as f32, + CosmicTextAlign::Left { padding } => *padding as f32, }; let (buffer_width, buffer_height) = match mode { - CosmicMode::InfiniteLine => (f32::MAX, size.0.y), - CosmicMode::Wrap => (size.0.x - padding_x, size.0.y), + CosmicWrap::InfiniteLine => (f32::MAX, size.0.y), + CosmicWrap::Wrap => (size.0.x - padding_x, size.0.y), }; buffer.set_size(&mut font_system.0, buffer_width, buffer_height); @@ -139,14 +139,14 @@ pub fn new_image_from_default( pub fn set_x_offset( mut query: Query<( &mut XOffset, - &CosmicMode, + &CosmicWrap, &CosmicEditor, &CosmicWidgetSize, - &CosmicTextPosition, + &CosmicTextAlign, )>, ) { for (mut x_offset, mode, editor, size, position) in query.iter_mut() { - if mode != &CosmicMode::InfiniteLine { + if mode != &CosmicWrap::InfiniteLine { return; } @@ -170,9 +170,9 @@ pub fn set_x_offset( } let padding_x = match position { - CosmicTextPosition::Center { padding } => *padding as f32, - CosmicTextPosition::TopLeft { padding } => *padding as f32, - CosmicTextPosition::Left { padding } => *padding as f32, + CosmicTextAlign::Center { padding } => *padding as f32, + CosmicTextAlign::TopLeft { padding } => *padding as f32, + CosmicTextAlign::Left { padding } => *padding as f32, }; if x_offset.width == 0. {