From fa31f42cd8e3a055b25e654ed51fb6bc732a18aa Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 4 Apr 2024 19:56:24 -0400 Subject: [PATCH] fix: dnd --- iced | 2 +- src/widget/context_drawer/widget.rs | 29 ++++++++++++++++++++++++++++- src/widget/layer_container.rs | 8 ++++++++ src/widget/popover.rs | 11 +++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/iced b/iced index 745d8467..52187b68 160000 --- a/iced +++ b/iced @@ -1 +1 @@ -Subproject commit 745d8467647209a9929fe631b2ba784d9cd39832 +Subproject commit 52187b687876d17fe95441cc27ff42af0a7e70b4 diff --git a/src/widget/context_drawer/widget.rs b/src/widget/context_drawer/widget.rs index 1db42b07..eb72b550 100644 --- a/src/widget/context_drawer/widget.rs +++ b/src/widget/context_drawer/widget.rs @@ -12,7 +12,7 @@ use iced_core::alignment; use iced_core::event::{self, Event}; use iced_core::widget::{Operation, Tree}; use iced_core::{ - layout, mouse, overlay as iced_overlay, renderer, Clipboard, Color, Layout, Length, Padding, + layout, mouse, overlay as iced_overlay, renderer, Clipboard, Layout, Length, Padding, Rectangle, Shell, Widget, }; @@ -20,6 +20,7 @@ use iced_renderer::core::widget::OperationOutputWrapper; #[must_use] pub struct ContextDrawer<'a, Message> { + id: Option, content: Element<'a, Message>, drawer: Element<'a, Message>, on_close: Option, @@ -80,6 +81,7 @@ impl<'a, Message: Clone + 'static> ContextDrawer<'a, Message> { ); ContextDrawer { + id: None, content: content.into(), // XXX new limits do not exactly handle the max width well for containers // XXX this is a hack to get around that @@ -99,6 +101,12 @@ impl<'a, Message: Clone + 'static> ContextDrawer<'a, Message> { } } + /// Sets the [`Id`] of the [`ContextDrawer`]. + pub fn id(mut self, id: iced_core::widget::Id) -> Self { + self.id = Some(id); + self + } + // Optionally assigns message to `on_close` event. pub fn on_close_maybe(mut self, message: Option) -> Self { self.on_close = message; @@ -233,6 +241,25 @@ impl<'a, Message: Clone> Widget for ContextDraw let c_state = &state.children[0]; self.content.as_widget().a11y_nodes(c_layout, c_state, p) } + + fn drag_destinations( + &self, + state: &Tree, + layout: Layout<'_>, + dnd_rectangles: &mut iced_core::clipboard::DndDestinationRectangles, + ) { + self.content + .as_widget() + .drag_destinations(&state.children[0], layout, dnd_rectangles); + } + + fn id(&self) -> Option { + self.id.clone() + } + + fn set_id(&mut self, id: iced_core::widget::Id) { + self.id = Some(id); + } } impl<'a, Message: 'a + Clone> From> for Element<'a, Message> { diff --git a/src/widget/layer_container.rs b/src/widget/layer_container.rs index 599844b8..eb7ea531 100644 --- a/src/widget/layer_container.rs +++ b/src/widget/layer_container.rs @@ -261,6 +261,14 @@ where self.container .drag_destinations(state, layout, dnd_rectangles); } + + fn id(&self) -> Option { + Widget::id(&self.container) + } + + fn set_id(&mut self, id: crate::widget::Id) { + self.container.set_id(id); + } } impl<'a, Message, Theme, Renderer> From> diff --git a/src/widget/popover.rs b/src/widget/popover.rs index a02280bf..f6a73155 100644 --- a/src/widget/popover.rs +++ b/src/widget/popover.rs @@ -209,6 +209,17 @@ where .overlay(&mut tree.children[0], layout, renderer) } } + + fn drag_destinations( + &self, + tree: &Tree, + layout: Layout<'_>, + dnd_rectangles: &mut iced_core::clipboard::DndDestinationRectangles, + ) { + self.content + .as_widget() + .drag_destinations(&tree.children[0], layout, dnd_rectangles); + } } impl<'a, Message, Renderer> From>