From 71743cb18fbb69430d092df59a722f5995be31c3 Mon Sep 17 00:00:00 2001 From: pml68 Date: Thu, 19 Sep 2024 23:26:22 +0200 Subject: feat: rework props w --- src/codegen/mod.rs | 57 +++++++++++++++++++++++++------------------ src/types/mod.rs | 6 ++--- src/types/props.rs | 44 --------------------------------- src/types/rendered_element.rs | 17 ++++++++++--- 4 files changed, 49 insertions(+), 75 deletions(-) delete mode 100644 src/types/props.rs diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index c8b789b..d0d8ee8 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1,34 +1,22 @@ use rust_format::{Config, Edition, Formatter, RustFmt}; -use crate::types::{props::Props, rendered_element::RenderedElement, ElementName}; +use crate::types::{rendered_element::RenderedElement, ElementName}; -impl Props { - pub fn codegen(&self) -> String { +impl RenderedElement { + fn props_codegen(&self) -> String { let mut props_string = String::new(); - match self.spacing { - Some(s) => { - props_string = format!("{props_string}.spacing({s})"); - } - None => {} - } - - match self.max_height { - Some(h) => { - props_string = format!("{props_string}.max_height({h})"); - } - None => {} + for (k, v) in self.props.clone() { + props_string = format!("{props_string}.{k}({v})"); } props_string } -} -impl RenderedElement { fn codegen(&self) -> (String, String) { let mut imports = String::new(); let mut view = String::new(); - let props = self.props.codegen(); + let props = self.props_codegen(); let mut elements = String::new(); @@ -41,7 +29,7 @@ impl RenderedElement { match &self.name { ElementName::Container => { - imports = format!("{imports}widget::container,"); + imports = format!("{imports}container,"); view = if self.child_elements.len() < 2 { format!("{view}\ncontainer({elements}){props}") } else { @@ -49,12 +37,19 @@ impl RenderedElement { }; } ElementName::Row => { - imports = format!("{imports}widget::row,"); + imports = format!("{imports}row,"); view = format!("{view}\nrow![{elements}]{props}"); } ElementName::Text(string) => { - imports = format!("{imports}widget::text,"); - view = format!("{view}\ntext(\"{string}\"){props}"); + imports = format!("{imports}text,"); + view = format!( + "{view}\ntext(\"{}\"){props}", + if *string == String::new() { + "New Text" + } else { + string + } + ); } _ => {} } @@ -62,9 +57,9 @@ impl RenderedElement { (imports, view) } - pub fn app_code(&self, title: String) -> Result> { + pub fn app_code(&self, title: &str) -> Result> { let (imports, view) = self.codegen(); - let mut app_code = format!("use iced::{{{imports}Sandbox,Settings,Element}};"); + let mut app_code = format!("use iced::{{widget::{{{imports}}},Sandbox,Settings,Element}};"); app_code = format!( r#"{app_code} @@ -98,4 +93,18 @@ impl RenderedElement { Ok(RustFmt::default().format_str(app_code)?) } + + pub fn test() -> String { + let mut text1 = RenderedElement::new(ElementName::Text("wow")); + text1.set_property("padding", "[10, 20]"); + text1.set_property("spacing", "20.0"); + text1.set_property("max_height", "120.5"); + + let element = RenderedElement::new(ElementName::Container).push(RenderedElement::from_vec( + ElementName::Row, + vec![text1, RenderedElement::new(ElementName::Text("heh"))], + )); + + element.app_code("new app").unwrap() + } } diff --git a/src/types/mod.rs b/src/types/mod.rs index 1fa23d4..c837ee1 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -1,4 +1,3 @@ -pub mod props; pub mod rendered_element; use iced::widget::text_editor; @@ -10,9 +9,10 @@ pub struct DesignerState { pub designer_page: DesignerPage, } +#[derive(Debug)] pub enum ElementName { - Text(String), - Button(String), + Text(&'static str), + Button(&'static str), TextEditor(text_editor::Content), SVG(PathBuf), Image(PathBuf), diff --git a/src/types/props.rs b/src/types/props.rs deleted file mode 100644 index 6dbb0a4..0000000 --- a/src/types/props.rs +++ /dev/null @@ -1,44 +0,0 @@ -use core::f32; - -use iced::{ - alignment::{Horizontal, Vertical}, - widget::text::Shaping, - Alignment, ContentFit, Font, Length, Padding, -}; -pub struct Props { - pub align_items: Option, - pub align_x: Option, - pub align_y: Option, - pub horizontal_alignment: Option, - pub vertical_alignment: Option, - pub width: Option, - pub height: Option, - pub max_width: Option, - pub max_height: Option, - pub font: Option, - pub padding: Option, - pub spacing: Option, - pub content_fit: Option, - pub shaping: Option, -} - -impl Default for Props { - fn default() -> Self { - Self { - align_items: None, - align_x: None, - align_y: None, - horizontal_alignment: None, - vertical_alignment: None, - width: None, - height: None, - max_width: None, - max_height: None, - font: None, - padding: None, - spacing: None, - content_fit: None, - shaping: None, - } - } -} diff --git a/src/types/rendered_element.rs b/src/types/rendered_element.rs index e909ac5..cbc923d 100644 --- a/src/types/rendered_element.rs +++ b/src/types/rendered_element.rs @@ -1,11 +1,15 @@ +use std::collections::HashMap; + use unique_id::{string::StringGenerator, Generator}; -use super::{props::Props, ElementName}; +use super::ElementName; + +#[derive(Debug)] pub struct RenderedElement { pub id: String, pub child_elements: Vec, pub name: ElementName, - pub props: Props, + pub props: HashMap<&'static str, &'static str>, } impl RenderedElement { @@ -15,7 +19,7 @@ impl RenderedElement { id: gen.next_id(), child_elements: vec![], name, - props: Props::default(), + props: HashMap::new(), } } @@ -25,7 +29,7 @@ impl RenderedElement { id: gen.next_id(), child_elements, name, - props: Props::default(), + props: HashMap::new(), } } @@ -33,4 +37,9 @@ impl RenderedElement { self.child_elements.push(element); self } + + pub fn set_property(&mut self, prop: &'static str, value: &'static str) { + let prop_ref = self.props.entry(prop).or_insert(value); + *prop_ref = value; + } } -- cgit v1.2.3