Skip to content

Commit

Permalink
MouseScrollUp/MouseScrollDown => plain MousEvent's
Browse files Browse the repository at this point in the history
... which means they get passesd x, y, etc. In particular,
they are passed the keyboard modifiers. This allows widgets
to use e.g. ctrl-wheel to scroll right/left.
  • Loading branch information
nitzan-shaked committed Dec 31, 2022
1 parent 4cf3aef commit e834b7a
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 48 deletions.
47 changes: 23 additions & 24 deletions src/textual/_xterm_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,36 +54,35 @@ def parse_mouse_code(self, code: str, sender: MessageTarget) -> events.Event | N
if sgr_match:
_buttons, _x, _y, state = sgr_match.groups()
buttons = int(_buttons)
button = (buttons + 1) & 3
x = int(_x) - 1
y = int(_y) - 1
delta_x = x - self.last_x
delta_y = y - self.last_y
self.last_x = x
self.last_y = y
event: events.Event
if buttons & 64:
event = (
events.MouseScrollUp if button == 1 else events.MouseScrollDown
)(sender, x, y)
else:
event = (
events.MouseMove
if buttons & 32
else (events.MouseDown if state == "M" else events.MouseUp)
)(
sender,
x,
y,
delta_x,
delta_y,
button,
bool(buttons & 4),
bool(buttons & 8),
bool(buttons & 16),
screen_x=x,
screen_y=y,
)
event_cls = (
(events.MouseScrollDown if buttons & 1 else events.MouseScrollUp)
if buttons & 64
else events.MouseMove
if buttons & 32
else (events.MouseDown if state == "M" else events.MouseUp)
)
if event_cls in (events.MouseScrollUp, events.MouseScrollDown):
buttons &= ~(64 | 3)
button = (buttons + 1) & 3
event = event_cls(
sender,
x,
y,
delta_x,
delta_y,
button,
bool(buttons & 4),
bool(buttons & 8),
bool(buttons & 16),
screen_x=x,
screen_y=y,
)
return event
return None

Expand Down
20 changes: 6 additions & 14 deletions src/textual/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -419,22 +419,14 @@ class MouseUp(MouseEvent, bubble=True, verbose=True):
pass


class MouseScrollDown(InputEvent, bubble=True, verbose=True):
__slots__ = ["x", "y"]

def __init__(self, sender: MessageTarget, x: int, y: int) -> None:
super().__init__(sender)
self.x = x
self.y = y

@rich.repr.auto
class MouseScrollDown(MouseEvent, bubble=True):
pass

class MouseScrollUp(InputEvent, bubble=True, verbose=True):
__slots__ = ["x", "y"]

def __init__(self, sender: MessageTarget, x: int, y: int) -> None:
super().__init__(sender)
self.x = x
self.y = y
@rich.repr.auto
class MouseScrollUp(MouseEvent, bubble=True):
pass


class Click(MouseEvent, bubble=True):
Expand Down
24 changes: 14 additions & 10 deletions tests/test_xterm_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,14 +236,14 @@ def test_mouse_move(parser, sequence, shift, meta, button):


@pytest.mark.parametrize(
"sequence",
"sequence, shift, meta",
[
"\x1b[<64;18;25M",
"\x1b[<68;18;25M",
"\x1b[<72;18;25M",
("\x1b[<64;18;25M", False, False),
("\x1b[<68;18;25M", True, False),
("\x1b[<72;18;25M", False, True),
],
)
def test_mouse_scroll_up(parser, sequence):
def test_mouse_scroll_up(parser, sequence, shift, meta):
"""Scrolling the mouse with and without modifiers held down.
We don't currently capture modifier keys in scroll events.
"""
Expand All @@ -256,17 +256,19 @@ def test_mouse_scroll_up(parser, sequence):
assert isinstance(event, MouseScrollUp)
assert event.x == 17
assert event.y == 24
assert event.shift is shift
assert event.meta is meta


@pytest.mark.parametrize(
"sequence",
"sequence, shift, meta",
[
"\x1b[<65;18;25M",
"\x1b[<69;18;25M",
"\x1b[<73;18;25M",
("\x1b[<65;18;25M", False, False),
("\x1b[<69;18;25M", True, False),
("\x1b[<73;18;25M", False, True),
],
)
def test_mouse_scroll_down(parser, sequence):
def test_mouse_scroll_down(parser, sequence, shift, meta):
events = list(parser.feed(sequence))

assert len(events) == 1
Expand All @@ -276,6 +278,8 @@ def test_mouse_scroll_down(parser, sequence):
assert isinstance(event, MouseScrollDown)
assert event.x == 17
assert event.y == 24
assert event.shift is shift
assert event.meta is meta


def test_mouse_event_detected_but_info_not_parsed(parser):
Expand Down

0 comments on commit e834b7a

Please sign in to comment.