(
&self,
ui: &Ui,
pointer: Pos2,
shapes: &mut Vec<Shape>,
plot_ui: &PlotUi<'_>,
transform: &PlotTransform,
show_xy: Vec2b,
)
| 1544 | } |
| 1545 | |
| 1546 | fn handle_hover( |
| 1547 | &self, |
| 1548 | ui: &Ui, |
| 1549 | pointer: Pos2, |
| 1550 | shapes: &mut Vec<Shape>, |
| 1551 | plot_ui: &PlotUi<'_>, |
| 1552 | transform: &PlotTransform, |
| 1553 | show_xy: Vec2b, |
| 1554 | ) -> (Vec<Cursor>, Option<Id>) { |
| 1555 | if !show_xy.any() { |
| 1556 | return (Vec::new(), None); |
| 1557 | } |
| 1558 | |
| 1559 | let interact_radius_sq = ui.style().interaction.interact_radius.powi(2); |
| 1560 | |
| 1561 | let mut candidates = plot_ui |
| 1562 | .items |
| 1563 | .iter() |
| 1564 | .filter(|entry| entry.allow_hover()) |
| 1565 | .filter_map(|item| { |
| 1566 | let item = &**item; |
| 1567 | let closest = item.find_closest(pointer, transform); |
| 1568 | |
| 1569 | Some(item).zip(closest) |
| 1570 | }); |
| 1571 | |
| 1572 | // Since many items can have same distance, |
| 1573 | // and dist_sq can be zero for some items (e.g. rectangle) |
| 1574 | // we pick topmost item within interact radius |
| 1575 | let topmost = candidates.rfind(|(_, elem)| elem.dist_sq <= interact_radius_sq); |
| 1576 | |
| 1577 | let plot = crate::PlotConfig { |
| 1578 | ui, |
| 1579 | transform, |
| 1580 | show_x: show_xy.x, |
| 1581 | show_y: show_xy.y, |
| 1582 | show_crosshair: self.show_crosshair, |
| 1583 | }; |
| 1584 | |
| 1585 | let mut cursors = Vec::new(); |
| 1586 | |
| 1587 | let hovered_plot_item_id = if let Some((item, elem)) = topmost { |
| 1588 | item.on_hover( |
| 1589 | &plot_ui.response, |
| 1590 | elem, |
| 1591 | shapes, |
| 1592 | &mut cursors, |
| 1593 | &plot, |
| 1594 | &self.label_formatter, |
| 1595 | ); |
| 1596 | Some(item.id()) |
| 1597 | } else { |
| 1598 | let value = transform.value_from_position(pointer); |
| 1599 | items::rulers_and_tooltip_at_value( |
| 1600 | &plot_ui.response, |
| 1601 | value, |
| 1602 | None, |
| 1603 | &plot, |
no test coverage detected