diff options
| -rw-r--r-- | iced_builder/src/main.rs | 16 | ||||
| -rw-r--r-- | iced_builder/src/types/mod.rs | 1 | ||||
| -rw-r--r-- | iced_builder/src/types/rendered_element.rs | 68 |
3 files changed, 72 insertions, 13 deletions
diff --git a/iced_builder/src/main.rs b/iced_builder/src/main.rs index 971adce..f0f58cc 100644 --- a/iced_builder/src/main.rs +++ b/iced_builder/src/main.rs @@ -172,12 +172,18 @@ impl Application for App { let pane_grid = PaneGrid::new(&self.pane_state, |id, pane, _is_maximized| { let is_focused = Some(id) == self.focus; match pane { - Panes::Designer => match self.designer_state.designer_page { + Panes::Designer => match &self.designer_state.designer_page { DesignerPage::Designer => { - let content = container("") - .id(iced::widget::container::Id::new("drop_zone")) - .height(Length::Fill) - .width(Length::Fill); + let content = container(text(format!( + "{:0.4}", + self.designer_state + .designer_content + .clone() + .expect("Designer content hasn't been set yet."), + ))) + .id(iced::widget::container::Id::new("drop_zone")) + .height(Length::Fill) + .width(Length::Fill); let title = row![ text("Designer").style(if is_focused { PANE_ID_COLOR_FOCUSED diff --git a/iced_builder/src/types/mod.rs b/iced_builder/src/types/mod.rs index def04cf..344f543 100644 --- a/iced_builder/src/types/mod.rs +++ b/iced_builder/src/types/mod.rs @@ -3,6 +3,7 @@ pub mod rendered_element; use rendered_element::RenderedElement; use serde::{Deserialize, Serialize}; +#[derive(Clone)] pub struct DesignerState { pub designer_content: Option<RenderedElement>, pub designer_page: DesignerPage, diff --git a/iced_builder/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs index 1938aa0..2d5c81a 100644 --- a/iced_builder/src/types/rendered_element.rs +++ b/iced_builder/src/types/rendered_element.rs @@ -5,7 +5,7 @@ use unique_id::{string::StringGenerator, Generator}; use super::ElementName; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct RenderedElement { pub id: String, pub child_elements: Option<Vec<RenderedElement>>, @@ -34,6 +34,13 @@ impl RenderedElement { } } + fn preset_options(mut self, options: Vec<&str>) -> Self { + for opt in options { + self.props.insert(opt.to_owned(), None); + } + self + } + pub fn push(mut self, element: RenderedElement) -> Self { if let Some(els) = self.child_elements.as_mut() { els.push(element); @@ -43,18 +50,63 @@ impl RenderedElement { self } - pub fn option(mut self, prop: &'static str, value: &'static str) -> Self { - let prop_ref = self - .props - .entry(prop.to_owned()) - .or_insert(Some(value.to_owned())); - *prop_ref = Some(value.to_owned()); + pub fn option(mut self, option: &'static str, value: &'static str) -> Self { + self.props + .entry(option.to_owned()) + .and_modify(|opt| *opt = Some(value.to_owned())); self } } +impl std::fmt::Display for RenderedElement { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut has_props = false; + f.pad("")?; + f.write_fmt(format_args!("{:?}\n", self.name))?; + f.pad("")?; + f.write_str("Options: (")?; + for (k, v) in &self.props { + if let Some(value) = v { + has_props = true; + f.write_fmt(format_args!( + "\n{:width$.precision$}{}: {}", + "", + k, + value, + width = f.width().unwrap_or(0) + f.precision().unwrap_or(0), + precision = f.precision().unwrap_or(0) + ))?; + } + } + if has_props { + f.write_str("\n")?; + f.pad("")?; + } + f.write_str(")")?; + if let Some(els) = &self.child_elements { + f.write_str(" {\n")?; + for el in els { + f.write_fmt(format_args!( + "\n{:width$.precision$}\n", + el, + width = f.width().unwrap_or(0) + f.precision().unwrap_or(0), + precision = f.precision().unwrap_or(0) + ))?; + } + f.pad("")?; + f.write_str("}")?; + } + Ok(()) + } +} + pub fn text(text: &str) -> RenderedElement { - RenderedElement::new(ElementName::Text(text.to_owned())) + RenderedElement::new(ElementName::Text(text.to_owned())).preset_options(vec![ + "size", + "line_height", + "width", + "height", + ]) } pub fn button(text: &str) -> RenderedElement { |
