fix(dnd_source): rely on current cursor position for hover state

This commit is contained in:
Ashley Wulber 2026-03-06 14:37:56 -05:00 committed by GitHub
parent 79f8337634
commit 3d2c018cd1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 22 additions and 31 deletions

2
iced

@ -1 +1 @@
Subproject commit 02149769ec61d485ddc0bf4f07e98f0ec700420f
Subproject commit ac24bbe80dd16ea586b8a0b5816066e3ba1b48fa

View file

@ -240,7 +240,7 @@ impl<Message: Clone + 'static, D: iced::clipboard::mime::AsMimeTypes + std::mark
Event::Mouse(mouse_event) => match mouse_event {
mouse::Event::ButtonPressed(mouse::Button::Left) => {
if let Some(position) = cursor.position() {
if !state.hovered {
if !cursor.is_over(layout.bounds()) {
return;
}
@ -256,16 +256,16 @@ impl<Message: Clone + 'static, D: iced::clipboard::mime::AsMimeTypes + std::mark
}
mouse::Event::CursorMoved { .. } => {
if let Some(position) = cursor.position() {
if state.hovered {
// We ignore motion if we do not possess drag content by now.
if self.drag_content.is_none() {
state.left_pressed_position = None;
return;
}
if let Some(left_pressed_position) = state.left_pressed_position {
if position.distance(left_pressed_position) > self.drag_threshold {
if let Some(left_pressed_position) = state.left_pressed_position
&& position.distance(left_pressed_position) > self.drag_threshold
{
if let Some(on_start) = self.on_start.as_ref() {
shell.publish(on_start.clone())
shell.publish(on_start.clone());
}
let offset = Vector::new(
left_pressed_position.x - layout.bounds().x,
@ -275,15 +275,9 @@ impl<Message: Clone + 'static, D: iced::clipboard::mime::AsMimeTypes + std::mark
state.is_dragging = true;
state.left_pressed_position = None;
}
}
if !cursor.is_over(layout.bounds()) {
state.hovered = false;
return;
}
} else if cursor.is_over(layout.bounds()) {
state.hovered = true;
}
shell.capture_event();
}
}
@ -296,7 +290,6 @@ impl<Message: Clone + 'static, D: iced::clipboard::mime::AsMimeTypes + std::mark
}
state.is_dragging = false;
shell.capture_event();
return;
}
}
Event::Dnd(DndEvent::Source(SourceEvent::Finished)) => {
@ -306,7 +299,6 @@ impl<Message: Clone + 'static, D: iced::clipboard::mime::AsMimeTypes + std::mark
}
state.is_dragging = false;
shell.capture_event();
return;
}
}
_ => (),
@ -422,7 +414,6 @@ impl<
/// Local state of the [`MouseListener`].
#[derive(Debug, Default)]
struct State {
hovered: bool,
left_pressed_position: Option<Point>,
is_dragging: bool,
cached_bounds: Rectangle,