From bddbb502c2fed62c6d05f7ef2c9d0b76da493ab1 Mon Sep 17 00:00:00 2001 From: pml68 Date: Thu, 24 Oct 2024 20:48:21 +0200 Subject: feat(actions): refactor match statement, add special case for containers When a new element is dragged on top of a container that isn't the root element (i.e. has a parent) and said parent isn't a container either, the element is inserted into the container's parent element. s --- iced_builder/src/types/rendered_element.rs | 46 +++++++++++++++++++----------- 1 file changed, 30 insertions(+), 16 deletions(-) mode change 100644 => 100755 iced_builder/src/types/rendered_element.rs diff --git a/iced_builder/src/types/rendered_element.rs b/iced_builder/src/types/rendered_element.rs old mode 100644 new mode 100755 index 336f78f..8b9b222 --- a/iced_builder/src/types/rendered_element.rs +++ b/iced_builder/src/types/rendered_element.rs @@ -89,9 +89,12 @@ impl RenderedElement { self.child_elements.is_some() } + pub fn is_empty(&self) -> bool { + self.child_elements == Some(vec![]) + } + pub fn remove(&mut self, element: &RenderedElement) { - let parent = self.find_parent(element); - if let Some(child_elements) = parent.unwrap().child_elements.as_mut() { + if let Some(child_elements) = self.child_elements.as_mut() { if let Some(index) = child_elements.iter().position(|x| x == element) { child_elements.remove(index); } @@ -314,27 +317,38 @@ impl ActionKind { } _ => ids.last().cloned().unwrap(), }; - let element = element_tree.as_mut().unwrap().find_by_id(id.clone()); - - match element.as_ref().unwrap().is_parent() { - true => { - let element = &element.unwrap(); - if element.name == ElementName::Container - && element.child_elements != Some(vec![]) + let element = element_tree + .as_mut() + .unwrap() + .find_by_id(id.clone()) + .unwrap(); + + match ( + element.is_parent(), + element.name == ElementName::Container && !element.is_empty(), + ) { + (true, false) => { + action = Self::PushFront(id); + } + _ if ids.len() > 2 => { + let parent = element_tree + .as_mut() + .unwrap() + .find_by_id(ids[&ids.len() - 2].clone()) + .unwrap(); + + if parent.name == ElementName::Container + && parent.child_elements != Some(vec![]) { action = Self::Stop; } else { - action = Self::PushFront(id); - } - } - false => { - if ids.len() > 2 { action = Self::InsertAfter( - ids[ids.clone().len() - 2].clone(), - ids[ids.clone().len() - 1].clone(), + ids[&ids.len() - 2].clone(), + ids[&ids.len() - 1].clone(), ); } } + _ => {} } } action -- cgit v1.2.3