Fix panel drag leaking through overlay (#10035)

Bennet Bo Fenner created

Closes #10017. While reworking the `overlay` element in #9911, I did not
realize that all overlay elements called `defer_draw` with a priority of
`1`.

/cc @as-cii 

Not including release notes, since it was only present in nightly.

Release Notes:

- N/A

Change summary

crates/collab_ui/src/collab_panel.rs               |  1 +
crates/collab_ui/src/collab_panel/channel_modal.rs | 13 ++++++++-----
crates/editor/src/element.rs                       |  1 +
crates/gpui/src/elements/deferred.rs               | 10 ++++++++++
crates/project_panel/src/project_panel.rs          |  1 +
crates/terminal_view/src/terminal_view.rs          |  1 +
crates/ui/src/components/popover_menu.rs           |  5 +++--
crates/ui/src/components/right_click_menu.rs       |  5 +++--
crates/workspace/src/pane.rs                       | 12 +++++-------
9 files changed, 33 insertions(+), 16 deletions(-)

Detailed changes

crates/collab_ui/src/collab_panel/channel_modal.rs 🔗

@@ -408,11 +408,14 @@ impl PickerDelegate for ChannelModalDelegate {
                             .when(is_me, |el| el.child(Label::new("You").color(Color::Muted)))
                             .children(
                                 if let (Some((menu, _)), true) = (&self.context_menu, selected) {
-                                    Some(deferred(
-                                        anchored()
-                                            .anchor(gpui::AnchorCorner::TopRight)
-                                            .child(menu.clone()),
-                                    ))
+                                    Some(
+                                        deferred(
+                                            anchored()
+                                                .anchor(gpui::AnchorCorner::TopRight)
+                                                .child(menu.clone()),
+                                        )
+                                        .with_priority(1),
+                                    )
                                 } else {
                                     None
                                 },

crates/editor/src/element.rs 🔗

@@ -1812,6 +1812,7 @@ impl EditorElement {
                 .anchor(AnchorCorner::TopLeft)
                 .snap_to_window(),
         )
+        .with_priority(1)
         .into_any();
 
         element.layout(gpui::Point::default(), AvailableSpace::min_size(), cx);

crates/gpui/src/elements/deferred.rs 🔗

@@ -15,6 +15,16 @@ pub struct Deferred {
     priority: usize,
 }
 
+impl Deferred {
+    /// Sets the `priority` value of the `deferred` element, which
+    /// determines the drawing order relative to other deferred elements,
+    /// with higher values being drawn on top.
+    pub fn with_priority(mut self, priority: usize) -> Self {
+        self.priority = priority;
+        self
+    }
+}
+
 impl Element for Deferred {
     type BeforeLayout = ();
     type AfterLayout = ();

crates/ui/src/components/popover_menu.rs 🔗

@@ -182,8 +182,9 @@ impl<M: ManagedView> Element for PopoverMenu<M> {
                         this.resolved_attach().corner(child_bounds) + this.resolved_offset(cx),
                     );
                 }
-                let mut element =
-                    deferred(anchored.child(div().occlude().child(menu.clone()))).into_any();
+                let mut element = deferred(anchored.child(div().occlude().child(menu.clone())))
+                    .with_priority(1)
+                    .into_any();
 
                 menu_layout_id = Some(element.before_layout(cx));
                 element

crates/ui/src/components/right_click_menu.rs 🔗

@@ -110,8 +110,9 @@ impl<M: ManagedView> Element for RightClickMenu<M> {
                 }
                 anchored = anchored.position(*element_state.position.borrow());
 
-                let mut element =
-                    deferred(anchored.child(div().occlude().child(menu.clone()))).into_any();
+                let mut element = deferred(anchored.child(div().occlude().child(menu.clone())))
+                    .with_priority(1)
+                    .into_any();
 
                 menu_layout_id = Some(element.before_layout(cx));
                 element

crates/workspace/src/pane.rs 🔗

@@ -1562,16 +1562,14 @@ impl Pane {
     }
 
     fn render_menu_overlay(menu: &View<ContextMenu>) -> Div {
-        div()
-            .absolute()
-            .bottom_0()
-            .right_0()
-            .size_0()
-            .child(deferred(
+        div().absolute().bottom_0().right_0().size_0().child(
+            deferred(
                 anchored()
                     .anchor(AnchorCorner::TopRight)
                     .child(menu.clone()),
-            ))
+            )
+            .with_priority(1),
+        )
     }
 
     pub fn set_zoomed(&mut self, zoomed: bool, cx: &mut ViewContext<Self>) {