From e8792ea151e0c26fd3497a09446f1b846df1c87c Mon Sep 17 00:00:00 2001 From: pml68 Date: Tue, 3 Sep 2024 21:55:34 +0200 Subject: feat: finish codegen for elements **without** props feat: wow --- src/types/rendered_element.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/types/rendered_element.rs (limited to 'src/types/rendered_element.rs') diff --git a/src/types/rendered_element.rs b/src/types/rendered_element.rs new file mode 100644 index 0000000..e909ac5 --- /dev/null +++ b/src/types/rendered_element.rs @@ -0,0 +1,36 @@ +use unique_id::{string::StringGenerator, Generator}; + +use super::{props::Props, ElementName}; +pub struct RenderedElement { + pub id: String, + pub child_elements: Vec, + pub name: ElementName, + pub props: Props, +} + +impl RenderedElement { + pub fn new(name: ElementName) -> Self { + let gen = StringGenerator::default(); + Self { + id: gen.next_id(), + child_elements: vec![], + name, + props: Props::default(), + } + } + + pub fn from_vec(name: ElementName, child_elements: Vec) -> Self { + let gen = StringGenerator::default(); + Self { + id: gen.next_id(), + child_elements, + name, + props: Props::default(), + } + } + + pub fn push(mut self, element: RenderedElement) -> Self { + self.child_elements.push(element); + self + } +} -- cgit v1.2.3 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 (limited to 'src/types/rendered_element.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 From 7a97a64faa983b1de64dedb49bdbf34582f1f4c8 Mon Sep 17 00:00:00 2001 From: pml68 Date: Sun, 22 Sep 2024 19:42:08 +0200 Subject: feat: finish codegen --- src/codegen/mod.rs | 59 ++++++++++++++++++++++++++++++++++++------- src/types/mod.rs | 2 -- src/types/rendered_element.rs | 8 +++--- 3 files changed, 55 insertions(+), 14 deletions(-) (limited to 'src/types/rendered_element.rs') diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index d0d8ee8..bc3c379 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -20,11 +20,16 @@ impl RenderedElement { let mut elements = String::new(); - for element in &self.child_elements { - let mut children = String::new(); - - (imports, children) = element.codegen(); - elements = format!("{elements}{},", children); + match self.name { + ElementName::Column | ElementName::Row | ElementName::Container => { + for element in &self.child_elements { + let mut children = String::new(); + + (imports, children) = element.codegen(); + elements = format!("{elements}{},", children); + } + } + _ => {} } match &self.name { @@ -40,6 +45,10 @@ impl RenderedElement { imports = format!("{imports}row,"); view = format!("{view}\nrow![{elements}]{props}"); } + ElementName::Column => { + imports = format!("{imports}column,"); + view = format!("{view}\ncolumn![{elements}]{props}"); + } ElementName::Text(string) => { imports = format!("{imports}text,"); view = format!( @@ -51,13 +60,35 @@ impl RenderedElement { } ); } - _ => {} + ElementName::Button(string) => { + imports = format!("{imports}button,"); + view = format!( + "{view}\nbutton(\"{}\"){props}", + if *string == String::new() { + "New Button" + } else { + string + } + ); + } + ElementName::Image(path) => { + imports = format!("{imports}image,"); + view = format!("{view}\nimage({}){props}", path.display().to_string()); + } + ElementName::SVG(path) => { + imports = format!("{imports}svg,"); + view = format!("{view}\nsvg({}){props}", path.display().to_string()); + } } (imports, view) } - pub fn app_code(&self, title: &str) -> Result> { + pub fn app_code( + &self, + title: &str, + theme: Option, + ) -> Result> { let (imports, view) = self.codegen(); let mut app_code = format!("use iced::{{widget::{{{imports}}},Sandbox,Settings,Element}};"); @@ -81,6 +112,10 @@ impl RenderedElement { "{title}".into() }} + fn theme(&self) -> iced::Theme {{ + iced::Theme::{} + }} + fn update(&mut self, message: Message) {{ }} @@ -88,7 +123,12 @@ impl RenderedElement { fn view(&self) -> Element {{ {view}.into() }} - }}"# + }}"#, + if let Some(c) = theme { + c.to_string().replace(' ', "") + } else { + "default()".to_owned() + } ); Ok(RustFmt::default().format_str(app_code)?) @@ -99,12 +139,13 @@ impl RenderedElement { text1.set_property("padding", "[10, 20]"); text1.set_property("spacing", "20.0"); text1.set_property("max_height", "120.5"); + text1.set_property("max_width", "230"); 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() + element.app_code("new app", None).unwrap() } } diff --git a/src/types/mod.rs b/src/types/mod.rs index c837ee1..7a04d79 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -1,6 +1,5 @@ pub mod rendered_element; -use iced::widget::text_editor; use rendered_element::RenderedElement; use std::path::PathBuf; @@ -13,7 +12,6 @@ pub struct DesignerState { pub enum ElementName { Text(&'static str), Button(&'static str), - TextEditor(text_editor::Content), SVG(PathBuf), Image(PathBuf), Container, diff --git a/src/types/rendered_element.rs b/src/types/rendered_element.rs index cbc923d..f05594d 100644 --- a/src/types/rendered_element.rs +++ b/src/types/rendered_element.rs @@ -2,11 +2,13 @@ use std::collections::HashMap; use unique_id::{string::StringGenerator, Generator}; +use iced::advanced::widget::Id; + use super::ElementName; #[derive(Debug)] pub struct RenderedElement { - pub id: String, + pub id: Id, pub child_elements: Vec, pub name: ElementName, pub props: HashMap<&'static str, &'static str>, @@ -16,7 +18,7 @@ impl RenderedElement { pub fn new(name: ElementName) -> Self { let gen = StringGenerator::default(); Self { - id: gen.next_id(), + id: Id::new(gen.next_id()), child_elements: vec![], name, props: HashMap::new(), @@ -26,7 +28,7 @@ impl RenderedElement { pub fn from_vec(name: ElementName, child_elements: Vec) -> Self { let gen = StringGenerator::default(); Self { - id: gen.next_id(), + id: Id::new(gen.next_id()), child_elements, name, props: HashMap::new(), -- cgit v1.2.3