Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
Check empty Frames still work.
"""
screen = MagicMock(spec=Screen, colours=8, unicode_aware=False)
canvas = Canvas(screen, 10, 40, 0, 0)
scene = MagicMock(spec=Scene)
form = TestFrame3(canvas)
form.register_scene(scene)
form.reset()
# Check all keyboard events get swallowed
self.assertIsNone(form.process_event(KeyboardEvent(ord("A"))))
# Check Mouse events over the Frame are swallowed and others allowed
# to bubble down the input stack.
self.assertIsNone(
form.process_event(MouseEvent(20, 5, MouseEvent.LEFT_CLICK)))
self.assertIsNotNone(
form.process_event(MouseEvent(5, 5, MouseEvent.LEFT_CLICK)))
# Check form data is empty.
form.save()
self.assertEqual(form.data, {})
def test_mouse_event(monkeypatch):
reverse = tui.Interface.reverse
with Aria2Server(port=7608, session=SESSIONS_DIR / "3-magnets.txt") as server:
interface = run_interface(
monkeypatch,
server.api,
events=[MouseEvent(x=tui.Interface.x_offset, y=tui.Interface.y_offset, buttons=MouseEvent.LEFT_CLICK)] * 2,
)
assert interface.sort == 0
assert interface.reverse is not reverse
def process_mouse(form, values):
"""
Inject a set of mouse events.
"""
for x, y, buttons in values:
form.process_event(MouseEvent(x, y, buttons))
def test_click_row(monkeypatch):
with Aria2Server(port=7619, session=SESSIONS_DIR / "2-dl-in-queue.txt") as server:
interface = run_interface(
monkeypatch, server.api, events=[Event.pass_frame, MouseEvent(x=10, y=2, buttons=MouseEvent.LEFT_CLICK)]
)
assert interface.focused == 1
"""
Check a dynamic path works as expected.
"""
class TestPath(DynamicPath):
def process_event(self, event):
# Assume that we're always passing in a MouseEvent.
self._x = event.x
self._y = event.y
# Initial path should start at specified location.
path = TestPath(None, 0, 0)
self.assertEqual(path.next_pos(), (0, 0))
self.assertFalse(path.is_finished())
# Process event should move location.
path.process_event(MouseEvent(10, 5, 0))
self.assertEqual(path.next_pos(), (10, 5))
# Reset should return to original location.
path.reset()
self.assertEqual(path.next_pos(), (0, 0))
screen = MagicMock(spec=Screen, colours=8, unicode_aware=False)
canvas = Canvas(screen, 10, 40, 0, 0)
scene = MagicMock(spec=Scene)
form = TestFrame3(canvas)
form.register_scene(scene)
form.reset()
# Check all keyboard events get swallowed
self.assertIsNone(form.process_event(KeyboardEvent(ord("A"))))
# Check Mouse events over the Frame are swallowed and others allowed
# to bubble down the input stack.
self.assertIsNone(
form.process_event(MouseEvent(20, 5, MouseEvent.LEFT_CLICK)))
self.assertIsNotNone(
form.process_event(MouseEvent(5, 5, MouseEvent.LEFT_CLICK)))
# Check form data is empty.
form.save()
self.assertEqual(form.data, {})
def process_mouse_event_main(self, event):
if event.buttons & MouseEvent.LEFT_CLICK:
if event.y == 0:
new_sort = self.get_column_at_x(event.x)
if new_sort == self.sort:
self.reverse = not self.reverse
else:
self.sort = new_sort
else:
self.focused = min(event.y - 1 + self.row_offset, len(self.rows) - 1)
self.refresh = True
if key == curses.KEY_RESIZE:
# Handle screen resize
self._re_sized = True
elif key == curses.KEY_MOUSE:
# Handle a mouse event
_, x, y, _, bstate = curses.getmouse()
buttons = 0
# Some Linux modes only report clicks, so check for any
# button down or click events.
if (bstate & curses.BUTTON1_PRESSED != 0 or
bstate & curses.BUTTON1_CLICKED != 0):
buttons |= MouseEvent.LEFT_CLICK
if (bstate & curses.BUTTON3_PRESSED != 0 or
bstate & curses.BUTTON3_CLICKED != 0):
buttons |= MouseEvent.RIGHT_CLICK
if bstate & curses.BUTTON1_DOUBLE_CLICKED != 0:
buttons |= MouseEvent.DOUBLE_CLICK
return MouseEvent(x, y, buttons)
elif key != -1:
# Handle any byte streams first
logger.debug("Processing key: %x", key)
if self._unicode_aware and key > 0:
if key & 0xC0 == 0xC0:
self._bytes_to_return = struct.pack(b"B", key)
self._bytes_to_read = bin(key)[2:].index("0") - 1
logger.debug("Byte stream: %d bytes left",
self._bytes_to_read)
continue
elif self._bytes_to_read > 0:
self._bytes_to_return += struct.pack(b"B", key)
self._bytes_to_read -= 1
if event.buttons != 0:
# Check for normal widget.
if (len(self._options) > 0 and
self.is_mouse_over(event, include_label=False,
width_modifier=1 if self._scroll_bar else 0)):
# Figure out selected line
new_line = event.y - self._y + self._start_line
if self._titles:
new_line -= 1
new_line = min(new_line, len(self._options) - 1)
# Update selection and fire select callback if needed.
if new_line >= 0:
self._line = new_line
self.value = self._options[self._line][1]
if event.buttons & MouseEvent.DOUBLE_CLICK != 0 and self._on_select:
self._on_select()
return
# Check for scroll bar interactions:
if self._scroll_bar:
event = self._scroll_bar.process_event(event)
# Ignore other mouse events.
return event
else:
# Ignore other events
return event