Fix event capturing order in pane_grid

This commit is contained in:
Héctor Ramón Jiménez 2024-11-06 22:03:00 +01:00
parent e5f1e31a5c
commit 9511bfb971
No known key found for this signature in database
GPG key ID: 4C07CEC81AFA161F

View file

@ -491,6 +491,36 @@ where
&None &None
}; };
let picked_pane = action.picked_pane().map(|(pane, _)| pane);
for (((pane, content), tree), layout) in self
.panes
.iter()
.copied()
.zip(&mut self.contents)
.zip(&mut tree.children)
.zip(layout.children())
.filter(|(((pane, _), _), _)| {
self.internal
.maximized()
.map_or(true, |maximized| *pane == maximized)
})
{
let is_picked = picked_pane == Some(pane);
content.update(
tree,
event.clone(),
layout,
cursor,
renderer,
clipboard,
shell,
viewport,
is_picked,
);
}
match event { match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
| Event::Touch(touch::Event::FingerPressed { .. }) => { | Event::Touch(touch::Event::FingerPressed { .. }) => {
@ -601,10 +631,6 @@ where
} }
} }
} }
shell.capture_event();
} else if action.picked_split().is_some() {
shell.capture_event();
} }
*action = state::Action::Idle; *action = state::Action::Idle;
@ -657,49 +683,26 @@ where
_ => {} _ => {}
} }
let picked_pane = action.picked_pane().map(|(pane, _)| pane);
for (((pane, content), tree), layout) in self
.panes
.iter()
.copied()
.zip(&mut self.contents)
.zip(&mut tree.children)
.zip(layout.children())
.filter(|(((pane, _), _), _)| {
self.internal
.maximized()
.map_or(true, |maximized| *pane == maximized)
})
{
let is_picked = picked_pane == Some(pane);
content.update(
tree,
event.clone(),
layout,
cursor,
renderer,
clipboard,
shell,
viewport,
is_picked,
);
}
if shell.redraw_request() != Some(window::RedrawRequest::NextFrame) { if shell.redraw_request() != Some(window::RedrawRequest::NextFrame) {
let interaction = self let interaction = self
.grid_interaction(action, layout, cursor) .grid_interaction(action, layout, cursor)
.or_else(|| { .or_else(|| {
self.contents.iter().zip(layout.children()).find_map( self.panes
|(content, layout)| { .iter()
.zip(&self.contents)
.zip(layout.children())
.filter(|((&pane, _content), _layout)| {
self.internal
.maximized()
.map_or(true, |maximized| pane == maximized)
})
.find_map(|((_pane, content), layout)| {
content.grid_interaction( content.grid_interaction(
layout, layout,
cursor, cursor,
on_drag.is_some(), on_drag.is_some(),
) )
}, })
)
}) })
.unwrap_or(mouse::Interaction::None); .unwrap_or(mouse::Interaction::None);