|
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 |
|
|