summaryrefslogtreecommitdiff
path: root/src/types
diff options
context:
space:
mode:
authorPolesznyák Márk <contact@pml68.dev>2025-11-15 12:33:22 +0100
committerPolesznyák Márk <contact@pml68.dev>2025-11-15 12:33:22 +0100
commite67680b0030a890d75ed35bc1144d1e8880dd3be (patch)
treec465299e27a7af8a6c53d435b8301100702ef3be /src/types
parentchore: update deps (diff)
downloadiced-builder-e67680b0030a890d75ed35bc1144d1e8880dd3be.tar.gz
feat: add `Grid` as a usable widget
Diffstat (limited to '')
-rw-r--r--src/types/element_name.rs9
-rwxr-xr-xsrc/types/rendered_element.rs36
2 files changed, 41 insertions, 4 deletions
diff --git a/src/types/element_name.rs b/src/types/element_name.rs
index c824fc5..8f8ab7e 100644
--- a/src/types/element_name.rs
+++ b/src/types/element_name.rs
@@ -1,7 +1,8 @@
use serde::{Deserialize, Serialize};
use super::rendered_element::{
- Action, RenderedElement, button, column, container, image, row, svg, text,
+ Action, RenderedElement, button, column, container, grid, image, row, svg,
+ text,
};
use crate::Error;
@@ -14,10 +15,11 @@ pub enum ElementName {
Container,
Row,
Column,
+ Grid,
}
impl ElementName {
- pub const ALL: &'static [Self; 7] = &[
+ pub const ALL: &'static [Self; 8] = &[
Self::Text(String::new()),
Self::Button(String::new()),
Self::Svg(String::new()),
@@ -25,6 +27,7 @@ impl ElementName {
Self::Container,
Self::Row,
Self::Column,
+ Self::Grid,
];
pub fn handle_action(
@@ -40,6 +43,7 @@ impl ElementName {
Self::Container => container(None),
Self::Row => row(vec![]),
Self::Column => column(vec![]),
+ Self::Grid => grid(vec![]),
};
match action {
Action::Stop | Action::Drop => Ok(None),
@@ -79,6 +83,7 @@ impl std::fmt::Display for ElementName {
Self::Container => "Container",
Self::Row => "Row",
Self::Column => "Column",
+ Self::Grid => "Grid",
}
)
}
diff --git a/src/types/rendered_element.rs b/src/types/rendered_element.rs
index 1ad7cdf..15e851c 100755
--- a/src/types/rendered_element.rs
+++ b/src/types/rendered_element.rs
@@ -1,9 +1,8 @@
use std::collections::BTreeMap;
-use iced::Element;
use iced::advanced::widget::Id;
use iced::widget::text::IntoFragment;
-use iced::widget::{self};
+use iced::{Element, widget};
use serde::{Deserialize, Serialize};
use crate::Error;
@@ -215,6 +214,12 @@ impl RenderedElement {
imports = format!("{imports}column,");
view = format!("{view}\ncolumn![{elements}]{options}");
}
+ ElementName::Grid => {
+ imports = format!("{imports}grid,");
+ view = format!(
+ "{view}\ngrid([{elements}].map(Into::into)){options}"
+ );
+ }
ElementName::Text(string) => {
imports = format!("{imports}text,");
view = format!(
@@ -389,6 +394,28 @@ impl<'a> From<RenderedElement> for Element<'a, Message> {
..Default::default()
})
.into(),
+ ElementName::Grid => widget::container(
+ if !child_elements.is_empty() {
+ widget::grid(child_elements.into_iter().map(Into::into))
+ } else {
+ widget::grid([text("New Column").into()])
+ }
+ .apply_options(copy.options),
+ )
+ .padding(20)
+ .style(|theme: &iced::Theme| widget::container::Style {
+ border: iced::Border {
+ color: theme.palette().warning.scale_alpha(0.6),
+
+ width: 2.0,
+ radius: 4.into(),
+ },
+ background: Some(
+ theme.palette().warning.scale_alpha(0.25).into(),
+ ),
+ ..Default::default()
+ })
+ .into(),
};
iced_drop::droppable(content)
@@ -546,3 +573,8 @@ pub fn column(child_elements: Vec<RenderedElement>) -> RenderedElement {
],
)
}
+
+pub fn grid(child_elements: Vec<RenderedElement>) -> RenderedElement {
+ RenderedElement::with(ElementName::Grid, child_elements)
+ .preset_options(&["spacing", "width", "height", "columns", "fluid"])
+}