diff options
| author | pml68 <contact@pml68.me> | 2024-10-24 23:17:42 +0200 |
|---|---|---|
| committer | pml68 <contact@pml68.me> | 2024-10-24 23:17:42 +0200 |
| commit | f04dc01bf5400faa6876b402100037501e374807 (patch) | |
| tree | d2f24b449c3f82a9f844ce35198bad351c2ca8af /iced_builder/src/types | |
| parent | feat(actions): refactor match statement, add special case for containers (diff) | |
| download | iced-builder-f04dc01bf5400faa6876b402100037501e374807.tar.gz | |
feat: implement d&d for existing elements
Diffstat (limited to 'iced_builder/src/types')
| -rw-r--r-- | iced_builder/src/types/element_name.rs | 12 | ||||
| -rwxr-xr-x | iced_builder/src/types/rendered_element.rs | 42 |
2 files changed, 41 insertions, 13 deletions
diff --git a/iced_builder/src/types/element_name.rs b/iced_builder/src/types/element_name.rs index c30d6e3..8d00814 100644 --- a/iced_builder/src/types/element_name.rs +++ b/iced_builder/src/types/element_name.rs @@ -47,10 +47,7 @@ impl ElementName { ActionKind::AddNew => Ok(Some(element)), ActionKind::PushFront(id) => { element_tree - .ok_or(Error::String( - "The action was of kind `PushFront`, but no element tree was provided." - .to_owned(), - ))? + .ok_or("The action was of kind `PushFront`, but no element tree was provided.")? .find_by_id(id) .ok_or(Error::NonExistentElement)? .push_front(&element); @@ -58,10 +55,9 @@ impl ElementName { } ActionKind::InsertAfter(parent_id, child_id) => { element_tree - .ok_or(Error::String( - "The action was of kind `InsertAfter`, but no element tree was provided." - .to_owned(), - ))? + .ok_or( + "The action was of kind `InsertAfter`, but no element tree was provided.", + )? .find_by_id(parent_id) .ok_or(Error::NonExistentElement)? .insert_after(child_id, &element); diff --git a/iced_builder/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs index 8b9b222..e2bebfa 100755 --- a/iced_builder/src/types/rendered_element.rs +++ b/iced_builder/src/types/rendered_element.rs @@ -5,7 +5,7 @@ use iced::{widget, Element, Length}; use serde::{Deserialize, Serialize}; use unique_id::{string::StringGenerator, Generator}; -use crate::Message; +use crate::{Error, Message}; use super::element_name::ElementName; @@ -120,6 +120,39 @@ impl RenderedElement { } } + pub fn handle_action( + &self, + element_tree: Option<&mut RenderedElement>, + action: ActionKind, + ) -> Result<(), Error> { + let element_tree = element_tree.unwrap(); + + match action { + ActionKind::Stop => Ok(()), + ActionKind::AddNew => Err( + "The action was of kind `AddNew`, but invoking it on an existing element tree is not possible.".into(), + ), + ActionKind::PushFront(id) => { + let old_parent = element_tree.find_parent(self).unwrap(); + old_parent.remove(self); + + let new_parent = element_tree.find_by_id(id).unwrap(); + new_parent.push_front(self); + + Ok(()) + } + ActionKind::InsertAfter(parent_id, target_id) => { + let old_parent = element_tree.find_parent(self).unwrap(); + old_parent.remove(self); + + let new_parent = element_tree.find_by_id(parent_id).unwrap(); + new_parent.insert_after(target_id, self); + + Ok(()) + } + } + } + fn preset_options(mut self, options: Vec<&str>) -> Self { for opt in options { self.options.insert(opt.to_owned(), None); @@ -127,10 +160,11 @@ impl RenderedElement { self } - pub fn option<'a>(&mut self, option: &'a str, value: &'a str) { + pub fn option<'a>(&mut self, option: &'a str, value: &'a str) -> Self { self.options .entry(option.to_owned()) .and_modify(|opt| *opt = Some(value.to_owned())); + self.clone() } pub fn as_element<'a>(self) -> Element<'a, Message> { @@ -231,9 +265,7 @@ impl RenderedElement { } pub fn test() -> RenderedElement { - let mut text1 = text("wow"); - text1.option("height", "120.5"); - text1.option("width", "230"); + let text1 = text("wow").option("height", "120.5").option("width", "230"); let element = container(Some(row(Some(vec