From 745cba1c2cc4105e584c59e7b4a130303f7d4d2a Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Mon, 1 Apr 2024 16:12:45 -0400 Subject: [PATCH] feat: add drag_destinations for container widgets --- src/widget/flex_row/widget.rs | 17 +++++++++++++++++ src/widget/grid/widget.rs | 17 +++++++++++++++++ src/widget/header_bar.rs | 19 ++++++++++++++++++- src/widget/layer_container.rs | 10 ++++++++++ src/widget/rectangle_tracker/mod.rs | 10 ++++++++++ 5 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/widget/flex_row/widget.rs b/src/widget/flex_row/widget.rs index 97026232..02873e6e 100644 --- a/src/widget/flex_row/widget.rs +++ b/src/widget/flex_row/widget.rs @@ -198,6 +198,23 @@ impl<'a, Message: 'static + Clone> Widget .map(|((c, c_layout), state)| c.as_widget().a11y_nodes(c_layout, state, p)), ) } + + fn drag_destinations( + &self, + state: &Tree, + layout: Layout<'_>, + dnd_rectangles: &mut iced_style::core::clipboard::DndDestinationRectangles, + ) { + for ((e, layout), state) in self + .children + .iter() + .zip(layout.children()) + .zip(state.children.iter()) + { + e.as_widget() + .drag_destinations(state, layout, dnd_rectangles); + } + } } impl<'a, Message: 'static + Clone> From> for Element<'a, Message> { diff --git a/src/widget/grid/widget.rs b/src/widget/grid/widget.rs index b4743f31..6c16b79f 100644 --- a/src/widget/grid/widget.rs +++ b/src/widget/grid/widget.rs @@ -263,6 +263,23 @@ impl<'a, Message: 'static + Clone> Widget for G .map(|((c, c_layout), state)| c.as_widget().a11y_nodes(c_layout, state, p)), ) } + + fn drag_destinations( + &self, + state: &Tree, + layout: Layout<'_>, + dnd_rectangles: &mut iced_style::core::clipboard::DndDestinationRectangles, + ) { + for ((e, layout), state) in self + .children + .iter() + .zip(layout.children()) + .zip(state.children.iter()) + { + e.as_widget() + .drag_destinations(state, layout, dnd_rectangles); + } + } } impl<'a, Message: 'static + Clone> From> for Element<'a, Message> { diff --git a/src/widget/header_bar.rs b/src/widget/header_bar.rs index adf68b75..c30a7089 100644 --- a/src/widget/header_bar.rs +++ b/src/widget/header_bar.rs @@ -4,7 +4,7 @@ use crate::{ext::CollectionWidget, widget, Element}; use apply::Apply; use derive_setters::Setters; -use iced::{window, Length}; +use iced::Length; use iced_core::{widget::tree, Widget}; use std::borrow::Cow; @@ -232,6 +232,23 @@ impl<'a, Message: Clone + 'static> Widget, + dnd_rectangles: &mut iced_style::core::clipboard::DndDestinationRectangles, + ) { + if let Some((child_tree, child_layout)) = + state.children.iter().zip(layout.children()).next() + { + self.header_bar_inner.as_widget().drag_destinations( + child_tree, + child_layout, + dnd_rectangles, + ); + } + } } impl<'a, Message: Clone + 'static> HeaderBar<'a, Message> { diff --git a/src/widget/layer_container.rs b/src/widget/layer_container.rs index 9dcde438..599844b8 100644 --- a/src/widget/layer_container.rs +++ b/src/widget/layer_container.rs @@ -251,6 +251,16 @@ where ) -> Option> { self.container.overlay(tree, layout, renderer) } + + fn drag_destinations( + &self, + state: &Tree, + layout: Layout<'_>, + dnd_rectangles: &mut iced_style::core::clipboard::DndDestinationRectangles, + ) { + self.container + .drag_destinations(state, layout, dnd_rectangles); + } } impl<'a, Message, Theme, Renderer> From> diff --git a/src/widget/rectangle_tracker/mod.rs b/src/widget/rectangle_tracker/mod.rs index f4bc1241..7cc08e00 100644 --- a/src/widget/rectangle_tracker/mod.rs +++ b/src/widget/rectangle_tracker/mod.rs @@ -291,6 +291,16 @@ where ) -> Option> { self.container.overlay(tree, layout, renderer) } + + fn drag_destinations( + &self, + state: &Tree, + layout: Layout<'_>, + dnd_rectangles: &mut iced_style::core::clipboard::DndDestinationRectangles, + ) { + self.container + .drag_destinations(state, layout, dnd_rectangles); + } } impl<'a, Message, Renderer, I> From>