1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
"""
Mouse events.
How it works
------------
The renderer has a 2 dimensional grid of mouse event handlers.
(`prompt_toolkit.layout.MouseHandlers`.) When the layout is rendered, the
`Window` class will make sure that this grid will also be filled with
callbacks. For vt100 terminals, mouse events are received through stdin, just
like any other key press. There is a handler among the key bindings that
catches these events and forwards them to such a mouse event handler. It passes
through the `Window` class where the coordinates are translated from absolute
coordinates to coordinates relative to the user control, and there
`UIControl.mouse_handler` is called.
"""
from __future__ import annotations
from enum import Enum
from .data_structures import Point
__all__ = ["MouseEventType", "MouseButton", "MouseModifier", "MouseEvent"]
class MouseEventType(Enum):
# Mouse up: This same event type is fired for all three events: left mouse
# up, right mouse up, or middle mouse up
MOUSE_UP = "MOUSE_UP"
# Mouse down: This implicitly refers to the left mouse down (this event is
# not fired upon pressing the middle or right mouse buttons).
MOUSE_DOWN = "MOUSE_DOWN"
SCROLL_UP = "SCROLL_UP"
SCROLL_DOWN = "SCROLL_DOWN"
# Triggered when the left mouse button is held down, and the mouse moves
MOUSE_MOVE = "MOUSE_MOVE"
class MouseButton(Enum):
LEFT = "LEFT"
MIDDLE = "MIDDLE"
RIGHT = "RIGHT"
# When we're scrolling, or just moving the mouse and not pressing a button.
NONE = "NONE"
# This is for when we don't know which mouse button was pressed, but we do
# know that one has been pressed during this mouse event (as opposed to
# scrolling, for example)
UNKNOWN = "UNKNOWN"
class MouseModifier(Enum):
SHIFT = "SHIFT"
ALT = "ALT"
CONTROL = "CONTROL"
class MouseEvent:
"""
Mouse event, sent to `UIControl.mouse_handler`.
:param position: `Point` instance.
:param event_type: `MouseEventType`.
"""
def __init__(
self,
position: Point,
event_type: MouseEventType,
button: MouseButton,
modifiers: frozenset[MouseModifier],
) -> None:
self.position = position
self.event_type = event_type
self.button = button
self.modifiers = modifiers
def __repr__(self) -> str:
return f"MouseEvent({self.position!r},{self.event_type!r},{self.button!r},{self.modifiers!r})"
|