Fix surprising mouse propagation & avoid focusing tab while closing

Co-Authored-By: Antonio Scandurra <me@as-cii.com>
This commit is contained in:
Julia 2023-03-03 12:18:27 -08:00
parent 124aa74b03
commit ff2e6bc3bd
2 changed files with 51 additions and 36 deletions

View file

@ -507,15 +507,18 @@ impl Presenter {
} }
// Handle Down events if the MouseRegion has a Click or Drag handler. This makes the api more intuitive as you would // Handle Down events if the MouseRegion has a Click or Drag handler. This makes the api more intuitive as you would
// not expect a MouseRegion to be transparent to Down events if it also has a Click handler. // not expect a MouseRegion to be transparent to Down events if it also has a Click handler.
// This behavior can be overridden by adding a Down handler that calls cx.propogate_event // This behavior can be overridden by adding a Down handler
if let MouseEvent::Down(e) = &mouse_event { if let MouseEvent::Down(e) = &mouse_event {
if valid_region let has_click = valid_region
.handlers .handlers
.contains(MouseEvent::click_disc(), Some(e.button)) .contains(MouseEvent::click_disc(), Some(e.button));
|| valid_region let has_drag = valid_region
.handlers .handlers
.contains(MouseEvent::drag_disc(), Some(e.button)) .contains(MouseEvent::drag_disc(), Some(e.button));
{ let has_down = valid_region
.handlers
.contains(MouseEvent::down_disc(), Some(e.button));
if !has_down && (has_click || has_drag) {
event_cx.handled = true; event_cx.handled = true;
} }
} }
@ -523,14 +526,13 @@ impl Presenter {
// `event_consumed` should only be true if there are any handlers for this event. // `event_consumed` should only be true if there are any handlers for this event.
let mut event_consumed = event_cx.handled; let mut event_consumed = event_cx.handled;
if let Some(callbacks) = valid_region.handlers.get(&mouse_event.handler_key()) { if let Some(callbacks) = valid_region.handlers.get(&mouse_event.handler_key()) {
event_consumed = true;
for callback in callbacks { for callback in callbacks {
event_cx.handled = true; event_cx.handled = true;
event_cx.with_current_view(valid_region.id().view_id(), { event_cx.with_current_view(valid_region.id().view_id(), {
let region_event = mouse_event.clone(); let region_event = mouse_event.clone();
|cx| callback(region_event, cx) |cx| callback(region_event, cx)
}); });
event_consumed &= event_cx.handled; event_consumed |= event_cx.handled;
any_event_handled |= event_cx.handled; any_event_handled |= event_cx.handled;
} }
} }

View file

@ -1150,40 +1150,53 @@ impl Pane {
let tab_active = ix == self.active_item_index; let tab_active = ix == self.active_item_index;
row.add_child({ row.add_child({
enum Tab {} enum TabDragReceiver {}
let mut receiver = dragged_item_receiver::<Tab, _>(ix, ix, true, None, cx, { let mut receiver =
let item = item.clone(); dragged_item_receiver::<TabDragReceiver, _>(ix, ix, true, None, cx, {
let pane = pane.clone(); let item = item.clone();
let detail = detail.clone(); let pane = pane.clone();
let detail = detail.clone();
let theme = cx.global::<Settings>().theme.clone(); let theme = cx.global::<Settings>().theme.clone();
move |mouse_state, cx| { move |mouse_state, cx| {
let tab_style = theme.workspace.tab_bar.tab_style(pane_active, tab_active); let tab_style =
let hovered = mouse_state.hovered(); theme.workspace.tab_bar.tab_style(pane_active, tab_active);
Self::render_tab(&item, pane, ix == 0, detail, hovered, tab_style, cx) let hovered = mouse_state.hovered();
}
}); enum Tab {}
MouseEventHandler::<Tab>::new(ix, cx, |_, cx| {
Self::render_tab(
&item,
pane.clone(),
ix == 0,
detail,
hovered,
tab_style,
cx,
)
})
.on_down(MouseButton::Left, move |_, cx| {
cx.dispatch_action(ActivateItem(ix));
})
.on_click(MouseButton::Middle, {
let item = item.clone();
move |_, cx: &mut EventContext| {
cx.dispatch_action(CloseItem {
item_id: item.id(),
pane: pane.clone(),
})
}
})
.boxed()
}
});
if !pane_active || !tab_active { if !pane_active || !tab_active {
receiver = receiver.with_cursor_style(CursorStyle::PointingHand); receiver = receiver.with_cursor_style(CursorStyle::PointingHand);
} }
receiver receiver
.on_down(MouseButton::Left, move |_, cx| {
cx.dispatch_action(ActivateItem(ix));
cx.propagate_event();
})
.on_click(MouseButton::Middle, {
let item = item.clone();
let pane = pane.clone();
move |_, cx: &mut EventContext| {
cx.dispatch_action(CloseItem {
item_id: item.id(),
pane: pane.clone(),
})
}
})
.as_draggable( .as_draggable(
DraggedItem { DraggedItem {
item, item,
@ -1438,7 +1451,7 @@ impl View for Pane {
.with_style(theme.workspace.tab_bar.container) .with_style(theme.workspace.tab_bar.container)
.boxed() .boxed()
}) })
.on_click(MouseButton::Left, move |_, cx| { .on_down(MouseButton::Left, move |_, cx| {
cx.dispatch_action(ActivateItem(active_item_index)); cx.dispatch_action(ActivateItem(active_item_index));
}) })
.boxed(), .boxed(),