GPUI change proposals

Mikayla Maki created

Change summary

crates/gpui/src/elements/event_handler.rs       |  2 
crates/gpui/src/elements/mouse_event_handler.rs |  7 ++++-
crates/gpui/src/presenter.rs                    | 20 +++++++++++++++---
crates/gpui/src/scene.rs                        |  2 
crates/workspace/src/sidebar.rs                 |  2 
5 files changed, 24 insertions(+), 9 deletions(-)

Detailed changes

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

@@ -90,7 +90,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 🔗

@@ -306,8 +306,11 @@ impl Presenter {
                         .as_ref()
                         .zip(self.prev_drag_position.as_mut())
                     {
-                        dragged_region =
-                            Some((clicked_region.clone(), position - *prev_drag_position));
+                        dragged_region = Some((
+                            clicked_region.clone(),
+                            position - *prev_drag_position,
+                            position,
+                        ));
                         *prev_drag_position = position;
                     }
 
@@ -366,11 +369,11 @@ impl Presenter {
                 }
             }
 
-            if let Some((dragged_region, delta)) = dragged_region {
+            if let Some((dragged_region, delta, 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(delta, position, event_cx);
                     })
                 }
             }
@@ -648,6 +651,15 @@ impl<'a> PaintContext<'a> {
         }
     }
 
+    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 🔗

@@ -54,7 +54,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,7 +188,7 @@ 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 |delta, _, cx| {
             let prev_width = *actual_width.borrow();
             *custom_width.borrow_mut() = 0f32
                 .max(match side {