Merge pull request #1300 from zed-industries/gpui-changes

Mikayla Maki created

GPUI change proposals

Change summary

crates/gpui/src/elements/event_handler.rs       |  2 +-
crates/gpui/src/elements/mouse_event_handler.rs |  7 +++++--
crates/gpui/src/presenter.rs                    | 16 +++++++++++++---
crates/gpui/src/scene.rs                        |  2 +-
crates/workspace/src/sidebar.rs                 |  7 ++++---
styles/package-lock.json                        |  1 -
6 files changed, 24 insertions(+), 11 deletions(-)

Detailed changes

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

@@ -91,7 +91,7 @@ impl Element for EventHandler {
                 click: Some(Rc::new(|_, _, _| {})),
                 right_mouse_down: Some(Rc::new(|_, _| {})),
                 right_click: Some(Rc::new(|_, _, _| {})),
-                drag: Some(Rc::new(|_, _| {})),
+                drag: Some(Rc::new(|_, _, _| {})),
                 mouse_down_out: Some(Rc::new(|_, _| {})),
                 right_mouse_down_out: Some(Rc::new(|_, _| {})),
             });

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

@@ -24,7 +24,7 @@ pub struct MouseEventHandler {
     right_click: Option<Rc<dyn Fn(Vector2F, usize, &mut EventContext)>>,
     mouse_down_out: Option<Rc<dyn Fn(Vector2F, &mut EventContext)>>,
     right_mouse_down_out: Option<Rc<dyn Fn(Vector2F, &mut EventContext)>>,
-    drag: Option<Rc<dyn Fn(Vector2F, &mut EventContext)>>,
+    drag: Option<Rc<dyn Fn(Vector2F, Vector2F, &mut EventContext)>>,
     hover: Option<Rc<dyn Fn(Vector2F, bool, &mut EventContext)>>,
     padding: Padding,
 }
@@ -106,7 +106,10 @@ impl MouseEventHandler {
         self
     }
 
-    pub fn on_drag(mut self, handler: impl Fn(Vector2F, &mut EventContext) + 'static) -> Self {
+    pub fn on_drag(
+        mut self,
+        handler: impl Fn(Vector2F, Vector2F, &mut EventContext) + 'static,
+    ) -> Self {
         self.drag = Some(Rc::new(handler));
         self
     }

crates/gpui/src/presenter.rs 🔗

@@ -317,7 +317,7 @@ impl Presenter {
                             .zip(self.prev_drag_position.as_mut())
                         {
                             dragged_region =
-                                Some((clicked_region.clone(), position - *prev_drag_position));
+                                Some((clicked_region.clone(), *prev_drag_position, position));
                             *prev_drag_position = position;
                         }
 
@@ -379,11 +379,11 @@ impl Presenter {
                 }
             }
 
-            if let Some((dragged_region, delta)) = dragged_region {
+            if let Some((dragged_region, prev_position, position)) = dragged_region {
                 handled = true;
                 if let Some(drag_callback) = dragged_region.drag {
                     event_cx.with_current_view(dragged_region.view_id, |event_cx| {
-                        drag_callback(delta, event_cx);
+                        drag_callback(prev_position, position, event_cx);
                     })
                 }
             }
@@ -661,6 +661,16 @@ impl<'a> PaintContext<'a> {
         }
     }
 
+    #[inline]
+    pub fn paint_layer<F>(&mut self, clip_bounds: Option<RectF>, f: F)
+    where
+        F: FnOnce(&mut Self) -> (),
+    {
+        self.scene.push_layer(clip_bounds);
+        f(self);
+        self.scene.pop_layer();
+    }
+
     pub fn current_view_id(&self) -> usize {
         *self.view_stack.last().unwrap()
     }

crates/gpui/src/scene.rs 🔗

@@ -65,7 +65,7 @@ pub struct MouseRegion {
     pub click: Option<Rc<dyn Fn(Vector2F, usize, &mut EventContext)>>,
     pub right_mouse_down: Option<Rc<dyn Fn(Vector2F, &mut EventContext)>>,
     pub right_click: Option<Rc<dyn Fn(Vector2F, usize, &mut EventContext)>>,
-    pub drag: Option<Rc<dyn Fn(Vector2F, &mut EventContext)>>,
+    pub drag: Option<Rc<dyn Fn(Vector2F, Vector2F, &mut EventContext)>>,
     pub mouse_down_out: Option<Rc<dyn Fn(Vector2F, &mut EventContext)>>,
     pub right_mouse_down_out: Option<Rc<dyn Fn(Vector2F, &mut EventContext)>>,
 }

crates/workspace/src/sidebar.rs 🔗

@@ -188,12 +188,13 @@ impl Sidebar {
         })
         .with_cursor_style(CursorStyle::ResizeLeftRight)
         .on_mouse_down(|_, _| {}) // This prevents the mouse down event from being propagated elsewhere
-        .on_drag(move |delta, cx| {
+        .on_drag(move |old_position, new_position, cx| {
+            let delta = new_position.x() - old_position.x();
             let prev_width = *actual_width.borrow();
             *custom_width.borrow_mut() = 0f32
                 .max(match side {
-                    Side::Left => prev_width + delta.x(),
-                    Side::Right => prev_width - delta.x(),
+                    Side::Left => prev_width + delta,
+                    Side::Right => prev_width - delta,
                 })
                 .round();
 

styles/package-lock.json 🔗

@@ -5,7 +5,6 @@
     "requires": true,
     "packages": {
         "": {
-            "name": "styles",
             "version": "1.0.0",
             "license": "ISC",
             "dependencies": {