Implement Widget::mouse_interaction for PaneGrid

... and fix rendering of drag interaction in `PaneGrid` by
introducing an explicit `with_translation` method to `Renderer`
and simplifying the `with_layer` and `Clip` primitive.
This commit is contained in:
Héctor Ramón Jiménez 2021-10-25 16:16:35 +07:00
parent 41394b4e90
commit 4a11cbd994
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
11 changed files with 167 additions and 66 deletions

View file

@ -471,6 +471,33 @@ where
.fold(event_status, event::Status::merge)
}
fn mouse_interaction(
&self,
layout: Layout<'_>,
viewport: &Rectangle,
cursor_position: Point,
) -> mouse::Interaction {
if self.state.picked_pane().is_some() {
return mouse::Interaction::Grab;
}
if let Some((_, axis)) = self.state.picked_split() {
return match axis {
Axis::Horizontal => mouse::Interaction::ResizingHorizontally,
Axis::Vertical => mouse::Interaction::ResizingVertically,
};
}
self.elements
.iter()
.zip(layout.children())
.map(|((_pane, content), layout)| {
content.mouse_interaction(layout, viewport, cursor_position)
})
.max()
.unwrap_or_default()
}
fn draw(
&self,
renderer: &mut Renderer,
@ -543,22 +570,22 @@ where
Some((dragging, origin)) if *id == dragging => {
let bounds = layout.bounds();
renderer.with_layer(
Rectangle {
x: cursor_position.x - origin.x,
y: cursor_position.y - origin.y,
width: bounds.width + 0.5,
height: bounds.height + 0.5,
},
Vector::new(0, 0),
renderer.with_translation(
cursor_position
- Point::new(
bounds.x + origin.x,
bounds.y + origin.y,
),
|renderer| {
pane.draw(
renderer,
style,
layout,
pane_cursor_position,
viewport,
);
renderer.with_layer(bounds, |renderer| {
pane.draw(
renderer,
style,
layout,
pane_cursor_position,
viewport,
);
});
},
);
}