Spaces:
Sleeping
Sleeping
first-space
/
first-space-venv
/lib
/python3.12
/site-packages
/prompt_toolkit
/layout
/mouse_handlers.py
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 | |
# NOTE: Previously, the data structure was a dictionary mapping (x,y) | |
# to the handlers. This however would be more inefficient when copying | |
# over the mouse handlers of the visible region in the scrollable pane. | |
# Map y (row) to x (column) to handlers. | |
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 | |