Skip to content

Commit

Permalink
Calculate hitbox based on visible bounds in {Mouse}EventHandler
Browse files Browse the repository at this point in the history
This is in contrast to not dispatching the event altogether in `Flex` when
the event is not contained in the flex element bounds. That approach was
problematic because it didn't give an opportunity to `MouseEventHandler`s
to handle mouse move events when they didn't intersect with the element bounds,
causing elements to never clear their hover state, cursor style, etc.
  • Loading branch information
as-cii committed Apr 7, 2022
1 parent 73f2fd6 commit b396909
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 14 deletions.
9 changes: 4 additions & 5 deletions crates/gpui/src/elements/event_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,14 @@ impl Element for EventHandler {
fn dispatch_event(
&mut self,
event: &Event,
bounds: RectF,
_: RectF,
visible_bounds: RectF,
_: &mut Self::LayoutState,
_: &mut Self::PaintState,
cx: &mut EventContext,
) -> bool {
if let Some(capture) = self.capture.as_mut() {
if capture(event, bounds, cx) {
if capture(event, visible_bounds, cx) {
return true;
}
}
Expand All @@ -103,15 +102,15 @@ impl Element for EventHandler {
match event {
Event::LeftMouseDown { position, .. } => {
if let Some(callback) = self.mouse_down.as_mut() {
if bounds.contains_point(*position) {
if visible_bounds.contains_point(*position) {
return callback(cx);
}
}
false
}
Event::RightMouseDown { position, .. } => {
if let Some(callback) = self.right_mouse_down.as_mut() {
if bounds.contains_point(*position) {
if visible_bounds.contains_point(*position) {
return callback(cx);
}
}
Expand All @@ -123,7 +122,7 @@ impl Element for EventHandler {
..
} => {
if let Some(callback) = self.navigate_mouse_down.as_mut() {
if bounds.contains_point(*position) {
if visible_bounds.contains_point(*position) {
return callback(*direction, cx);
}
}
Expand Down
6 changes: 0 additions & 6 deletions crates/gpui/src/elements/flex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,12 +271,6 @@ impl Element for Flex {
_: &mut Self::PaintState,
cx: &mut EventContext,
) -> bool {
if let Some(position) = event.position() {
if !bounds.contains_point(position) {
return false;
}
}

let mut handled = false;
for child in &mut self.children {
handled = child.dispatch_event(event, cx) || handled;
Expand Down
6 changes: 3 additions & 3 deletions crates/gpui/src/elements/mouse_event_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ impl Element for MouseEventHandler {
fn dispatch_event(
&mut self,
event: &Event,
bounds: RectF,
_: RectF,
visible_bounds: RectF,
_: &mut Self::LayoutState,
_: &mut Self::PaintState,
cx: &mut EventContext,
Expand All @@ -113,8 +113,8 @@ impl Element for MouseEventHandler {
let handled_in_child = self.child.dispatch_event(event, cx);

let hit_bounds = RectF::from_points(
bounds.origin() - vec2f(self.padding.left, self.padding.top),
bounds.lower_right() + vec2f(self.padding.right, self.padding.bottom),
visible_bounds.origin() - vec2f(self.padding.left, self.padding.top),
visible_bounds.lower_right() + vec2f(self.padding.right, self.padding.bottom),
)
.round_out();

Expand Down

0 comments on commit b396909

Please sign in to comment.