Fix z-index targeting for drag and drop

Marshall Bowers created

Change summary

crates/gpui2/src/interactive.rs         |  4 ++--
crates/gpui2/src/platform/mac/window.rs |  6 +++---
crates/gpui2/src/window.rs              |  4 ++--
crates/ui2/src/components/panes.rs      | 20 +++++++++++++-------
4 files changed, 20 insertions(+), 14 deletions(-)

Detailed changes

crates/gpui2/src/interactive.rs 🔗

@@ -1033,13 +1033,13 @@ impl Deref for MouseExitEvent {
 }
 
 #[derive(Debug, Clone, Default)]
-pub struct DroppedFiles(pub(crate) SmallVec<[PathBuf; 2]>);
+pub struct ExternalPaths(pub(crate) SmallVec<[PathBuf; 2]>);
 
 #[derive(Debug, Clone)]
 pub enum FileDropEvent {
     Entered {
         position: Point<Pixels>,
-        files: DroppedFiles,
+        files: ExternalPaths,
     },
     Pending {
         position: Point<Pixels>,

crates/gpui2/src/platform/mac/window.rs 🔗

@@ -1,6 +1,6 @@
 use super::{display_bounds_from_native, ns_string, MacDisplay, MetalRenderer, NSRange};
 use crate::{
-    display_bounds_to_native, point, px, size, AnyWindowHandle, Bounds, DroppedFiles, Executor,
+    display_bounds_to_native, point, px, size, AnyWindowHandle, Bounds, ExternalPaths, Executor,
     FileDropEvent, GlobalPixels, InputEvent, KeyDownEvent, Keystroke, Modifiers,
     ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels,
     PlatformAtlas, PlatformDisplay, PlatformInputHandler, PlatformWindow, Point, Scene, Size,
@@ -1679,7 +1679,7 @@ extern "C" fn perform_drag_operation(this: &Object, _: Sel, dragging_info: id) -
     }
 }
 
-fn external_paths_from_event(dragging_info: *mut Object) -> DroppedFiles {
+fn external_paths_from_event(dragging_info: *mut Object) -> ExternalPaths {
     let mut paths = SmallVec::new();
     let pasteboard: id = unsafe { msg_send![dragging_info, draggingPasteboard] };
     let filenames = unsafe { NSPasteboard::propertyListForType(pasteboard, NSFilenamesPboardType) };
@@ -1690,7 +1690,7 @@ fn external_paths_from_event(dragging_info: *mut Object) -> DroppedFiles {
         };
         paths.push(PathBuf::from(path))
     }
-    DroppedFiles(paths)
+    ExternalPaths(paths)
 }
 
 extern "C" fn conclude_drag_operation(this: &Object, _: Sel, _: id) {

crates/gpui2/src/window.rs 🔗

@@ -1,6 +1,6 @@
 use crate::{
     px, size, Action, AnyBox, AnyDrag, AnyView, AppContext, AsyncWindowContext, AvailableSpace,
-    Bounds, BoxShadow, Context, Corners, DevicePixels, DispatchContext, DisplayId, DroppedFiles,
+    Bounds, BoxShadow, Context, Corners, DevicePixels, DispatchContext, DisplayId, ExternalPaths,
     Edges, Effect, Element, EntityId, EventEmitter, FileDropEvent, FocusEvent, FontId,
     GlobalElementId, GlyphId, Handle, Hsla, ImageData, InputEvent, IsZero, KeyListener, KeyMatch,
     KeyMatcher, Keystroke, LayoutId, MainThread, MainThreadOnly, Modifiers, MonochromeSprite,
@@ -903,7 +903,7 @@ impl<'a, 'w> WindowContext<'a, 'w> {
                         drag_handle_view: None,
                         cursor_offset: position,
                         state: Box::new(files),
-                        state_type: TypeId::of::<DroppedFiles>(),
+                        state_type: TypeId::of::<ExternalPaths>(),
                     });
                     InputEvent::MouseDown(MouseDownEvent {
                         position,

crates/ui2/src/components/panes.rs 🔗

@@ -1,6 +1,6 @@
 use std::marker::PhantomData;
 
-use gpui2::{hsla, red, AnyElement, DroppedFiles, ElementId, Hsla, Length, Size};
+use gpui2::{hsla, red, AnyElement, ElementId, ExternalPaths, Hsla, Length, Size};
 use smallvec::SmallVec;
 
 use crate::prelude::*;
@@ -49,18 +49,24 @@ impl<S: 'static + Send + Sync> Pane<S> {
             .w(self.size.width)
             .h(self.size.height)
             .relative()
-            .children(cx.stack(0, |_| self.children.drain(..)))
-            .child(cx.stack(1, |_| {
+            .child(
+                div()
+                    .z_index(0)
+                    .size_full()
+                    .children(self.children.drain(..)),
+            )
+            .child(
                 // TODO kb! Figure out why we can't we see the red background when we drag a file over this div.
                 div()
+                    .z_index(1)
                     .id("drag-target")
-                    .drag_over::<DroppedFiles>(|d| d.bg(red()))
-                    .on_drop(|_, files: DroppedFiles, _| {
+                    .drag_over::<ExternalPaths>(|d| d.bg(red()))
+                    .on_drop(|_, files: ExternalPaths, _| {
                         dbg!("dropped files!", files);
                     })
                     .absolute()
-                    .inset_0()
-            }))
+                    .inset_0(),
+            )
     }
 }