Newer
Older
use bevy::prelude::*;
use kayak_font::Alignment;
use crate::{
prelude::KayakWidgetContext,
styles::{ComputedStyles, KCursorIcon, KStyle, RenderCommand, StyleProp},
#[derive(Component, Debug, PartialEq, Clone)]
/// The name of the font to use
///
/// The given font must already be loaded into the [`KayakContext`](kayak_core::KayakContext)
/// The height of a line of text (currently in pixels)
/// If true, displays the default text cursor when hovered.
///
/// Basic word wrapping.
/// Defautls to true
pub word_wrap: bool,
/// Enables subpixel rendering of text. This is useful on smaller low-dpi screens.
pub subpixel: bool,
impl Default for TextProps {
fn default() -> Self {
/// A widget that renders text
///
#[derive(Bundle)]
pub struct TextWidgetBundle {
pub text: TextProps,
pub styles: KStyle,
pub computed_styles: ComputedStyles,
pub widget_name: WidgetName,
}
impl Default for TextWidgetBundle {
fn default() -> Self {
Self {
text: Default::default(),
styles: KStyle::default(),
computed_styles: ComputedStyles::default(),
In((_widget_context, entity)): In<(KayakWidgetContext, Entity)>,
mut query: Query<(&KStyle, &mut ComputedStyles, &TextProps)>,
if let Ok((styles, mut computed_styles, text)) = query.get_mut(entity) {
*computed_styles = KStyle::default()
.with_style(styles)
.with_style(KStyle {
render_command: StyleProp::Value(RenderCommand::Text {
content: text.content.clone(),
alignment: text.alignment,
word_wrap: text.word_wrap,
subpixel: text.subpixel,
}),
font: if let Some(ref font) = text.font {
StyleProp::Value(font.clone())
} else {
StyleProp::default()
},
cursor: if text.show_cursor {
StyleProp::Value(KCursorIcon(CursorIcon::Text))
} else {
StyleProp::default()
},
font_size: if text.size >= 0.0 {
StyleProp::Value(text.size)
} else {
StyleProp::default()
},
line_height: if let Some(line_height) = text.line_height {
StyleProp::Value(line_height)
} else {
StyleProp::default()
},
..Default::default()
// style.cursor = StyleProp::Value(KCursorIcon(CursorIcon::Hand));