Avoid double borrow of views on `up` and `up_out` in `DragAndDrop`

Antonio Scandurra and Nathan Sobo created

Co-Authored-By: Nathan Sobo <nathan@zed.dev>

Change summary

crates/drag_and_drop/src/drag_and_drop.rs | 8 ++++----
crates/gpui/src/app.rs                    | 4 ++++
crates/gpui/src/app/window.rs             | 2 +-
3 files changed, 9 insertions(+), 5 deletions(-)

Detailed changes

crates/drag_and_drop/src/drag_and_drop.rs 🔗

@@ -209,7 +209,7 @@ impl<V: View> DragAndDrop<V> {
                                 )
                                 .with_cursor_style(CursorStyle::Arrow)
                                 .on_up(MouseButton::Left, |_, _, cx| {
-                                    cx.defer(|_, cx| {
+                                    cx.window_context().defer(|cx| {
                                         cx.update_global::<Self, _, _>(|this, cx| {
                                             this.finish_dragging(cx)
                                         });
@@ -217,7 +217,7 @@ impl<V: View> DragAndDrop<V> {
                                     cx.propagate_event();
                                 })
                                 .on_up_out(MouseButton::Left, |_, _, cx| {
-                                    cx.defer(|_, cx| {
+                                    cx.window_context().defer(|cx| {
                                         cx.update_global::<Self, _, _>(|this, cx| {
                                             this.finish_dragging(cx)
                                         });
@@ -244,14 +244,14 @@ impl<V: View> DragAndDrop<V> {
                                 .boxed()
                         })
                         .on_up(MouseButton::Left, |_, _, cx| {
-                            cx.defer(|_, cx| {
+                            cx.window_context().defer(|cx| {
                                 cx.update_global::<Self, _, _>(|this, _| {
                                     this.currently_dragged = None;
                                 });
                             });
                         })
                         .on_up_out(MouseButton::Left, |_, _, cx| {
-                            cx.defer(|_, cx| {
+                            cx.window_context().defer(|cx| {
                                 cx.update_global::<Self, _, _>(|this, _| {
                                     this.currently_dragged = None;
                                 });

crates/gpui/src/app.rs 🔗

@@ -2954,6 +2954,10 @@ impl<'a, 'b, 'c, V: View> ViewContext<'a, 'b, 'c, V> {
         }
     }
 
+    pub fn window_context(&mut self) -> &mut WindowContext<'a, 'b> {
+        &mut self.window_context
+    }
+
     pub fn handle(&self) -> ViewHandle<V> {
         ViewHandle::new(
             self.window_id,

crates/gpui/src/app/window.rs 🔗

@@ -174,7 +174,7 @@ impl UpdateView for WindowContext<'_, '_> {
                 &mut cx,
             )
         })
-        .unwrap()
+        .expect("view is already on the stack")
     }
 }