Skip to content

Commit

Permalink
masonry: fix updating Portal on scrollbar drag (#563)
Browse files Browse the repository at this point in the history
Fixes scrolling `Portal` on scrollbar drag by recomposing instead of
relayouting.

Regression probably caused in 59ee615
(#488) or
ff7635e
(#522).
  • Loading branch information
tomcur committed Sep 2, 2024
1 parent a1c7d74 commit e337cf7
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 4 deletions.
2 changes: 1 addition & 1 deletion masonry/src/widget/portal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ impl<W: Widget> Widget for Portal<W> {
}

if scrollbar_moved {
ctx.request_layout();
ctx.request_compose();
}
}

Expand Down
6 changes: 4 additions & 2 deletions masonry/src/widget/scroll_bar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,8 @@ impl Widget for ScrollBar {
let cursor_min_length = theme::SCROLLBAR_MIN_SIZE;
let cursor_rect = self.get_cursor_rect(ctx.size(), cursor_min_length);

let mouse_pos = Point::new(state.position.x, state.position.y);
let mouse_pos =
Point::new(state.position.x, state.position.y) - ctx.window_origin().to_vec2();
if cursor_rect.contains(mouse_pos) {
let (z0, z1) = self.axis.major_span(cursor_rect);
let mouse_major = self.axis.major_pos(mouse_pos);
Expand All @@ -147,7 +148,8 @@ impl Widget for ScrollBar {
ctx.request_paint();
}
PointerEvent::PointerMove(state) => {
let mouse_pos = Point::new(state.position.x, state.position.y);
let mouse_pos =
Point::new(state.position.x, state.position.y) - ctx.window_origin().to_vec2();
if let Some(grab_anchor) = self.grab_anchor {
let cursor_min_length = theme::SCROLLBAR_MIN_SIZE;
self.cursor_progress = self.progress_from_mouse_pos(
Expand Down
5 changes: 4 additions & 1 deletion masonry/src/widget/widget_ref.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@ impl<'w> WidgetRef<'w, dyn Widget> {

/// Recursively find innermost widget at given position.
///
/// If multiple overlapping children of a widget contain the given position in their layout
/// boxes, the last child as determined by [`Widget::children_ids`] is chosen.
///
/// **pos** - the position in local coordinates (zero being the top-left of the
/// inner widget).
pub fn find_widget_at_pos(&self, pos: Point) -> Option<WidgetRef<'w, dyn Widget>> {
Expand All @@ -190,7 +193,7 @@ impl<'w> WidgetRef<'w, dyn Widget> {
}
}
// TODO - Use Widget::get_child_at_pos method
if let Some(child) = innermost_widget.children().into_iter().find(|child| {
if let Some(child) = innermost_widget.children().into_iter().rev().find(|child| {
!child.widget.skip_pointer() && child.state().window_layout_rect().contains(pos)
}) {
innermost_widget = child;
Expand Down

0 comments on commit e337cf7

Please sign in to comment.