diff --git a/src/apply_mutations.rs b/src/apply_mutations.rs index e8a5926..a03e8d3 100644 --- a/src/apply_mutations.rs +++ b/src/apply_mutations.rs @@ -1,10 +1,10 @@ -use crate::{events::is_supported_event, tick::IntrinsicTextNode}; +use crate::{events::is_supported_event, parse_attributes::set_attribute, tick::IntrinsicTextNode}; use bevy::{ ecs::{entity::Entity, system::Command, world::World}, hierarchy::{BuildWorldChildren, Children, DespawnRecursive, Parent}, prelude::default, render::color::Color, - text::{Text, TextAlignment, TextLayoutInfo, TextStyle}, + text::{Text, TextLayoutInfo, TextStyle}, ui::{ node_bundles::{NodeBundle, TextBundle}, widget::TextFlags, @@ -357,113 +357,3 @@ fn parse_template_attributes(attributes: &[TemplateAttribute]) -> (Style, Backgr } (style, background_color, text) } - -fn set_attribute( - name: &str, - value: &str, - style: &mut Style, - background_color: &mut BackgroundColor, - text: Option<&mut Text>, -) { - match (name, value) { - ("display", "flex") => style.display = Display::Flex, - ("display", "grid") => style.display = Display::Grid, - ("display", "none") => style.display = Display::None, - ("position", "relative") => style.position_type = PositionType::Relative, - ("position", "absolute") => style.position_type = PositionType::Absolute, - ("overflow", "visible") => style.overflow = Overflow::visible(), - ("overflow", "clip") => style.overflow = Overflow::clip(), - ("overflow_x", "visible") => style.overflow.x = OverflowAxis::Visible, - ("overflow_x", "clip") => style.overflow.x = OverflowAxis::Clip, - ("overflow_y", "visible") => style.overflow.y = OverflowAxis::Visible, - ("overflow_y", "clip") => style.overflow.y = OverflowAxis::Clip, - ("left", val) => style.left = parse_val(val), - ("right", val) => style.right = parse_val(val), - ("top", val) => style.top = parse_val(val), - ("bottom", val) => style.bottom = parse_val(val), - ("width", val) => style.width = parse_val(val), - ("height", val) => style.height = parse_val(val), - ("min_width", val) => style.min_width = parse_val(val), - ("min_height", val) => style.min_height = parse_val(val), - ("max_width", val) => style.max_width = parse_val(val), - ("max_height", val) => style.max_height = parse_val(val), - ("aspect_ratio", "none") => style.aspect_ratio = None, - ("aspect_ratio", float) => { - style.aspect_ratio = Some( - float - .parse::() - .unwrap_or_else(|val| panic!("Encountered invalid bevy_dioxus f32 `{val}`.")), - ); - } - ("align_items", "default") => style.align_items = AlignItems::Default, - ("align_items", "start") => style.align_items = AlignItems::Start, - ("align_items", "end") => style.align_items = AlignItems::End, - ("align_items", "flex_start") => style.align_items = AlignItems::FlexStart, - ("align_items", "flex_end") => style.align_items = AlignItems::FlexEnd, - ("align_items", "center") => style.align_items = AlignItems::Center, - ("align_items", "baseline") => style.align_items = AlignItems::Baseline, - ("align_items", "stretch") => style.align_items = AlignItems::Stretch, - // TODO: The rest of the attributes from here on out - ("flex_direction", "column") => style.flex_direction = FlexDirection::Column, - ("background_color", hex) => { - background_color.0 = Color::hex(hex).expect(&format!( - "Encountered invalid bevy_dioxus Color hex `{hex}`." - )); - } - ("padding", val) => style.padding = UiRect::all(parse_val(val)), - ("justify_content", "space_between") => { - style.justify_content = JustifyContent::SpaceBetween; - } - ("align_content", "space_between") => style.align_content = AlignContent::SpaceBetween, - ("text", new_text) if text.is_some() => text.unwrap().sections[0] = new_text.into(), - ("text_direction", "inherit") if text.is_some() => style.direction = Direction::Inherit, - ("text_direction", "left_to_right") if text.is_some() => { - style.direction = Direction::LeftToRight; - } - ("text_direction", "right_to_left") if text.is_some() => { - style.direction = Direction::RightToLeft; - } - ("text_alignment", "left") if text.is_some() => { - text.unwrap().alignment = TextAlignment::Left; - } - ("text_alignment", "center") if text.is_some() => { - text.unwrap().alignment = TextAlignment::Center; - } - ("text_alignment", "right") if text.is_some() => { - text.unwrap().alignment = TextAlignment::Right; - } - ("text_size", val) if text.is_some() => { - text.unwrap().sections[0].style.font_size = val - .parse::() - .unwrap_or_else(|val| panic!("Encountered invalid bevy_dioxus f32 `{val}`.")); - } - ("text_color", hex) if text.is_some() => { - text.unwrap().sections[0].style.color = Color::hex(hex).expect(&format!( - "Encountered invalid bevy_dioxus Color hex `{hex}`." - )); - } - _ => panic!("Encountered unsupported bevy_dioxus attribute `{name}: {value}`."), - } -} - -fn parse_val(val: &str) -> Val { - if let Ok(val) = val.parse::() { - return Val::Px(val); - } - if let Some((val, "")) = val.split_once("px") { - if let Ok(val) = val.parse::() { - return Val::Px(val); - } - } - if let Some((val, "")) = val.split_once("vw") { - if let Ok(val) = val.parse::() { - return Val::Vw(val); - } - } - if let Some((val, "")) = val.split_once("vh") { - if let Ok(val) = val.parse::() { - return Val::Vh(val); - } - } - panic!("Encountered invalid bevy_dioxus Val `{val}`."); -} diff --git a/src/lib.rs b/src/lib.rs index 175f04a..a97c31c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,7 @@ mod elements; #[macro_use] mod events; mod hooks; +mod parse_attributes; mod tick; use self::{ diff --git a/src/parse_attributes.rs b/src/parse_attributes.rs new file mode 100644 index 0000000..25e0b06 --- /dev/null +++ b/src/parse_attributes.rs @@ -0,0 +1,115 @@ +use bevy::{ + render::color::Color, + text::{Text, TextAlignment}, + ui::*, +}; + +pub fn set_attribute( + name: &str, + value: &str, + style: &mut Style, + background_color: &mut BackgroundColor, + text: Option<&mut Text>, +) { + match (name, value) { + ("display", "flex") => style.display = Display::Flex, + ("display", "grid") => style.display = Display::Grid, + ("display", "none") => style.display = Display::None, + ("position", "relative") => style.position_type = PositionType::Relative, + ("position", "absolute") => style.position_type = PositionType::Absolute, + ("overflow", "visible") => style.overflow = Overflow::visible(), + ("overflow", "clip") => style.overflow = Overflow::clip(), + ("overflow_x", "visible") => style.overflow.x = OverflowAxis::Visible, + ("overflow_x", "clip") => style.overflow.x = OverflowAxis::Clip, + ("overflow_y", "visible") => style.overflow.y = OverflowAxis::Visible, + ("overflow_y", "clip") => style.overflow.y = OverflowAxis::Clip, + ("left", val) => style.left = parse_val(val), + ("right", val) => style.right = parse_val(val), + ("top", val) => style.top = parse_val(val), + ("bottom", val) => style.bottom = parse_val(val), + ("width", val) => style.width = parse_val(val), + ("height", val) => style.height = parse_val(val), + ("min_width", val) => style.min_width = parse_val(val), + ("min_height", val) => style.min_height = parse_val(val), + ("max_width", val) => style.max_width = parse_val(val), + ("max_height", val) => style.max_height = parse_val(val), + ("aspect_ratio", "none") => style.aspect_ratio = None, + ("aspect_ratio", float) => { + style.aspect_ratio = Some( + float + .parse::() + .unwrap_or_else(|val| panic!("Encountered invalid bevy_dioxus f32 `{val}`.")), + ); + } + ("align_items", "default") => style.align_items = AlignItems::Default, + ("align_items", "start") => style.align_items = AlignItems::Start, + ("align_items", "end") => style.align_items = AlignItems::End, + ("align_items", "flex_start") => style.align_items = AlignItems::FlexStart, + ("align_items", "flex_end") => style.align_items = AlignItems::FlexEnd, + ("align_items", "center") => style.align_items = AlignItems::Center, + ("align_items", "baseline") => style.align_items = AlignItems::Baseline, + ("align_items", "stretch") => style.align_items = AlignItems::Stretch, + // TODO: The rest of the attributes from here on out + ("flex_direction", "column") => style.flex_direction = FlexDirection::Column, + ("background_color", hex) => { + background_color.0 = Color::hex(hex).expect(&format!( + "Encountered invalid bevy_dioxus Color hex `{hex}`." + )); + } + ("padding", val) => style.padding = UiRect::all(parse_val(val)), + ("justify_content", "space_between") => { + style.justify_content = JustifyContent::SpaceBetween; + } + ("align_content", "space_between") => style.align_content = AlignContent::SpaceBetween, + ("text", new_text) if text.is_some() => text.unwrap().sections[0] = new_text.into(), + ("text_direction", "inherit") if text.is_some() => style.direction = Direction::Inherit, + ("text_direction", "left_to_right") if text.is_some() => { + style.direction = Direction::LeftToRight; + } + ("text_direction", "right_to_left") if text.is_some() => { + style.direction = Direction::RightToLeft; + } + ("text_alignment", "left") if text.is_some() => { + text.unwrap().alignment = TextAlignment::Left; + } + ("text_alignment", "center") if text.is_some() => { + text.unwrap().alignment = TextAlignment::Center; + } + ("text_alignment", "right") if text.is_some() => { + text.unwrap().alignment = TextAlignment::Right; + } + ("text_size", val) if text.is_some() => { + text.unwrap().sections[0].style.font_size = val + .parse::() + .unwrap_or_else(|val| panic!("Encountered invalid bevy_dioxus f32 `{val}`.")); + } + ("text_color", hex) if text.is_some() => { + text.unwrap().sections[0].style.color = Color::hex(hex).expect(&format!( + "Encountered invalid bevy_dioxus Color hex `{hex}`." + )); + } + _ => panic!("Encountered unsupported bevy_dioxus attribute `{name}: {value}`."), + } +} + +fn parse_val(val: &str) -> Val { + if let Ok(val) = val.parse::() { + return Val::Px(val); + } + if let Some((val, "")) = val.split_once("px") { + if let Ok(val) = val.parse::() { + return Val::Px(val); + } + } + if let Some((val, "")) = val.split_once("vw") { + if let Ok(val) = val.parse::() { + return Val::Vw(val); + } + } + if let Some((val, "")) = val.split_once("vh") { + if let Ok(val) = val.parse::() { + return Val::Vh(val); + } + } + panic!("Encountered invalid bevy_dioxus Val `{val}`."); +}