summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpml68 <contact@pml68.me>2024-09-30 01:02:46 +0200
committerpml68 <contact@pml68.me>2024-09-30 01:02:46 +0200
commitf950f6357aea66962ea3a778501430205bf4d6c6 (patch)
tree0c302e9be66a854c2839e872d64b9265eced21c5
parentfeat: rework RenderedElement, prepare for JSON project format (diff)
downloadiced-builder-f950f6357aea66962ea3a778501430205bf4d6c6.tar.gz
feat: implement fmt::Display for RenderedElement, work on props
Diffstat (limited to '')
-rw-r--r--iced_builder/src/main.rs16
-rw-r--r--iced_builder/src/types/mod.rs1
-rw-r--r--iced_builder/src/types/rendered_element.rs68
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 {