(&mut self, mouse: &MouseEvent)
| 293 | } |
| 294 | |
| 295 | pub fn handle_mouse_event(&mut self, mouse: &MouseEvent) -> Option<ProviderSelection> { |
| 296 | if !self.visible { |
| 297 | return None; |
| 298 | } |
| 299 | |
| 300 | let area = match self.last_area { |
| 301 | Some(a) => a, |
| 302 | None => return None, |
| 303 | }; |
| 304 | |
| 305 | let in_popup = mouse.column >= area.x |
| 306 | && mouse.column < area.x.saturating_add(area.width) |
| 307 | && mouse.row >= area.y |
| 308 | && mouse.row < area.y.saturating_add(area.height); |
| 309 | |
| 310 | match mouse.kind { |
| 311 | MouseEventKind::ScrollUp if in_popup => { |
| 312 | self.scroll_offset = self.scroll_offset.saturating_sub(3); |
| 313 | None |
| 314 | } |
| 315 | MouseEventKind::ScrollDown if in_popup => { |
| 316 | let max_offset = self.rows.len().saturating_sub(self.visible_rows); |
| 317 | self.scroll_offset = (self.scroll_offset + 3).min(max_offset); |
| 318 | None |
| 319 | } |
| 320 | MouseEventKind::Moved if in_popup => { |
| 321 | if let Some(sel_idx) = self.selectable_index_at_row(mouse.row, &area) { |
| 322 | self.selected = sel_idx; |
| 323 | } |
| 324 | None |
| 325 | } |
| 326 | MouseEventKind::Down(MouseButton::Left) if in_popup => { |
| 327 | if let Some(sel_idx) = self.selectable_index_at_row(mouse.row, &area) { |
| 328 | self.selected = sel_idx; |
| 329 | let result = self.confirm_selection(); |
| 330 | if result.is_some() { |
| 331 | self.hide(); |
| 332 | } |
| 333 | return result; |
| 334 | } |
| 335 | None |
| 336 | } |
| 337 | MouseEventKind::Down(MouseButton::Left) if !in_popup => { |
| 338 | self.hide(); |
| 339 | None |
| 340 | } |
| 341 | _ => None, |
| 342 | } |
| 343 | } |
| 344 | |
| 345 | pub fn captures_mouse(&self, _mouse: &MouseEvent) -> bool { |
| 346 | self.visible |
nothing calls this directly
no test coverage detected