From dca99f35e938bebdfdad16eaabd220b5d52c2375 Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Mon, 17 Oct 2022 14:38:24 -0700 Subject: [PATCH 1/4] Fix pane grid mouse interactions - Use `grabbing` interaction while dragging - Ignore grab interaction when dragging is disabled --- native/src/widget/pane_grid.rs | 3 ++- native/src/widget/pane_grid/content.rs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index d84fb7a0f9..8eadac48cd 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -341,6 +341,7 @@ where cursor_position, viewport, renderer, + self.on_drag.is_some(), ) }) .max() @@ -648,7 +649,7 @@ pub fn mouse_interaction( resize_leeway: Option, ) -> Option { if action.picked_pane().is_some() { - return Some(mouse::Interaction::Grab); + return Some(mouse::Interaction::Grabbing); } let resize_axis = diff --git a/native/src/widget/pane_grid/content.rs b/native/src/widget/pane_grid/content.rs index 8d26c3d871..c236d82085 100644 --- a/native/src/widget/pane_grid/content.rs +++ b/native/src/widget/pane_grid/content.rs @@ -238,6 +238,7 @@ where cursor_position: Point, viewport: &Rectangle, renderer: &Renderer, + drag_enabled: bool, ) -> mouse::Interaction { let (body_layout, title_bar_interaction) = if let Some(title_bar) = &self.title_bar { @@ -247,7 +248,7 @@ where let is_over_pick_area = title_bar .is_over_pick_area(title_bar_layout, cursor_position); - if is_over_pick_area { + if is_over_pick_area && drag_enabled { return mouse::Interaction::Grab; } From fb036529a222126da3f119da4d94d17776460421 Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Mon, 17 Oct 2022 14:56:06 -0700 Subject: [PATCH 2/4] Render picked pane last --- native/src/widget/pane_grid.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index 8eadac48cd..3ef578bfea 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -757,7 +757,12 @@ pub fn draw( cursor_position }; - for ((id, pane), layout) in elements.zip(layout.children()) { + // Render picked pane last + let mut elements = elements.zip(layout.children()).collect::>(); + elements + .sort_by_key(|((id, _), _)| picked_pane.map(|(id, _)| id) == Some(*id)); + + for ((id, pane), layout) in elements { match picked_pane { Some((dragging, origin)) if id == dragging => { let bounds = layout.bounds(); From 470723c232493282c513af47d19b3877066ceb2e Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Wed, 19 Oct 2022 13:05:56 -0700 Subject: [PATCH 3/4] Eliminate unnecessary allocation --- native/src/widget/pane_grid.rs | 46 +++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index 3ef578bfea..12ccbb41da 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -757,32 +757,12 @@ pub fn draw( cursor_position }; - // Render picked pane last - let mut elements = elements.zip(layout.children()).collect::>(); - elements - .sort_by_key(|((id, _), _)| picked_pane.map(|(id, _)| id) == Some(*id)); + let mut render_picked_pane = None; - for ((id, pane), layout) in elements { + for ((id, pane), layout) in elements.zip(layout.children()) { match picked_pane { Some((dragging, origin)) if id == dragging => { - let bounds = layout.bounds(); - - renderer.with_translation( - cursor_position - - Point::new(bounds.x + origin.x, bounds.y + origin.y), - |renderer| { - renderer.with_layer(bounds, |renderer| { - draw_pane( - pane, - renderer, - default_style, - layout, - pane_cursor_position, - viewport, - ); - }); - }, - ); + render_picked_pane = Some((pane, origin, layout.bounds())); } _ => { draw_pane( @@ -797,6 +777,26 @@ pub fn draw( } } + // Render picked pane last + if let Some((pane, origin, bounds)) = render_picked_pane { + renderer.with_translation( + cursor_position + - Point::new(bounds.x + origin.x, bounds.y + origin.y), + |renderer| { + renderer.with_layer(bounds, |renderer| { + draw_pane( + pane, + renderer, + default_style, + layout, + pane_cursor_position, + viewport, + ); + }); + }, + ); + }; + if let Some((axis, split_region, is_picked)) = picked_split { let highlight = if is_picked { theme.picked_split(style) From 069371c86b2eef62277462810fb5ac1852623bd9 Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Wed, 19 Oct 2022 13:21:46 -0700 Subject: [PATCH 4/4] Use child layout --- native/src/widget/pane_grid.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index 12ccbb41da..96cf78efa2 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -762,7 +762,7 @@ pub fn draw( for ((id, pane), layout) in elements.zip(layout.children()) { match picked_pane { Some((dragging, origin)) if id == dragging => { - render_picked_pane = Some((pane, origin, layout.bounds())); + render_picked_pane = Some((pane, origin, layout)); } _ => { draw_pane( @@ -778,7 +778,9 @@ pub fn draw( } // Render picked pane last - if let Some((pane, origin, bounds)) = render_picked_pane { + if let Some((pane, origin, layout)) = render_picked_pane { + let bounds = layout.bounds(); + renderer.with_translation( cursor_position - Point::new(bounds.x + origin.x, bounds.y + origin.y),