| from __future__ import annotations |
|
|
| from collections import defaultdict |
| from typing import TYPE_CHECKING, Callable |
|
|
| from prompt_toolkit.mouse_events import MouseEvent |
|
|
| if TYPE_CHECKING: |
| from prompt_toolkit.key_binding.key_bindings import NotImplementedOrNone |
|
|
| __all__ = [ |
| "MouseHandler", |
| "MouseHandlers", |
| ] |
|
|
|
|
| MouseHandler = Callable[[MouseEvent], "NotImplementedOrNone"] |
|
|
|
|
| class MouseHandlers: |
| """ |
| Two dimensional raster of callbacks for mouse events. |
| """ |
|
|
| def __init__(self) -> None: |
| def dummy_callback(mouse_event: MouseEvent) -> NotImplementedOrNone: |
| """ |
| :param mouse_event: `MouseEvent` instance. |
| """ |
| return NotImplemented |
|
|
| |
| |
| |
|
|
| |
| self.mouse_handlers: defaultdict[int, defaultdict[int, MouseHandler]] = ( |
| defaultdict(lambda: defaultdict(lambda: dummy_callback)) |
| ) |
|
|
| def set_mouse_handler_for_range( |
| self, |
| x_min: int, |
| x_max: int, |
| y_min: int, |
| y_max: int, |
| handler: Callable[[MouseEvent], NotImplementedOrNone], |
| ) -> None: |
| """ |
| Set mouse handler for a region. |
| """ |
| for y in range(y_min, y_max): |
| row = self.mouse_handlers[y] |
|
|
| for x in range(x_min, x_max): |
| row[x] = handler |
|
|