Skip to content

Commit 6f41a60

Browse files
committed
events.py
- Bug Fix in events.py - Deprecated event.change Mouse Events are integarted using the existing events system
1 parent d41b98c commit 6f41a60

File tree

4 files changed

+101
-44
lines changed

4 files changed

+101
-44
lines changed

p5/sketch/Skia2DRenderer/base.py

+21-21
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import builtins
2+
from calendar import c
23
from p5.core import p5
34

45
import contextlib, glfw, skia
56
from OpenGL import GL
67
from time import time
78

89
from ..events import handler_names
9-
from .handlers import mouse_callback_handler
10+
from .handlers import *
1011

1112

1213
def _dummy(*args, **kwargs):
@@ -57,6 +58,9 @@ def __init__(self, setup_method, draw_method, handlers=dict(), frame_rate=60):
5758
self.handlers[handler_name] = handlers.get(handler_name, _dummy)
5859

5960
self.handler_queue = []
61+
62+
# Modifiers used for managing the Input system
63+
self.modifiers = list()
6064

6165
@property
6266
def size(self):
@@ -126,6 +130,10 @@ def main_loop(self):
126130
if self.redraw:
127131
self.redraw = False
128132
self.poll_events()
133+
while len(self.handler_queue) != 0:
134+
function, event = self.handler_queue.pop(0)
135+
event._update_builtins()
136+
function(event)
129137

130138
def start(self):
131139
self.window = self.glfw_window()
@@ -161,10 +169,15 @@ def poll_events(self):
161169

162170
# Callbacks and handlers
163171
def assign_callbacks(self):
164-
glfw.set_cursor_pos_callback(self.window, mouse_callback_handler)
165172
glfw.set_framebuffer_size_callback(self.window, self.frame_buffer_resize_callback_handler)
166-
glfw.set_mouse_button_callback(self.window, self.mouse_button_callback_handler)
167-
173+
174+
glfw.set_key_callback(self.window, on_key_press)
175+
glfw.set_char_callback(self.window, on_key_char)
176+
glfw.set_mouse_button_callback(self.window, on_mouse_button)
177+
glfw.set_scroll_callback(self.window, on_mouse_scroll)
178+
glfw.set_cursor_pos_callback(self.window, on_mouse_motion)
179+
glfw.set_window_close_callback(self.window, on_close)
180+
168181

169182

170183
def frame_buffer_resize_callback_handler(self, window, width, height):
@@ -187,22 +200,9 @@ def frame_buffer_resize_callback_handler(self, window, width, height):
187200
# Tell the program, we have resized the frame buffer
188201
# Restart the rendering again
189202
self.resized = True
190-
191-
# For testing will be removed later
192-
def mouse_button_callback_handler(self, window, button, action, mods):
193-
# If a mouse button is pressed
194-
if action == glfw.PRESS:
195-
196-
# Changing the values manually, at the end we will have an event handler
197-
# similar to vispy
198-
if button == glfw.MOUSE_BUTTON_LEFT:
199-
self.redraw = True
200-
if button == glfw.MOUSE_BUTTON_RIGHT:
201-
self.looping = True
202-
203-
# If a mouse button is released
204-
if action == glfw.RELEASE:
205-
# set environment variables
206-
pass
203+
204+
def _enqueue_event(self, handler_name, event):
205+
event._update_builtins()
206+
self.handler_queue.append((self.handlers[handler_name], event))
207207

208208

p5/sketch/Skia2DRenderer/handlers.py

+55-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import builtins
2+
from os import environ
3+
import glfw
4+
from p5.core import p5
5+
from p5.sketch.events import MouseEvent
26

37
"""
48
This file contains the handlers needed for glfw event handling
@@ -7,10 +11,57 @@
711
# TODO : Make a raw_event class and populate it with data about current events
812
# TODO : Design of raw_event should follow that of Vispy's raw event beacuse events.py is highly based on it
913

10-
def mouse_callback_handler(window, xpos, ypos):
11-
builtins.mouse_x = xpos
12-
builtins.mouse_y = ypos
14+
BUTTONMAP = {glfw.MOUSE_BUTTON_LEFT: 1,
15+
glfw.MOUSE_BUTTON_RIGHT: 2,
16+
glfw.MOUSE_BUTTON_MIDDLE: 3
17+
}
18+
19+
class PseudoMouseEvent:
20+
"""
21+
This class is a helper class to reuse the events module which is very Vispy oriented
22+
"""
23+
def __init__(self, pos, delta, modifiers, button, buttons):
24+
"""Initialize the pseduoMouseEventClass to work with exisiting event system
25+
26+
Args:
27+
pos (tuple): Position of the cursor
28+
delta (tuple): Change in position of the cursor from the last frame
29+
modifiers (list): Modifiers active during the event
30+
button (int): Mouse Button that was pressed
31+
buttons (list): Mouse Buttons that were pressed during the event
32+
"""
33+
self.pos = pos
34+
self.delta = delta
35+
self.modifiers = modifiers
36+
self.button = button
37+
self.buttons = buttons
38+
39+
def on_close(window):
40+
pass
41+
42+
def on_mouse_button(window, button, action, mod):
43+
pos = glfw.get_cursor_pos(window)
44+
45+
if button < 3:
46+
button = BUTTONMAP.get(button, 0)
1347

48+
# TODO: Check if it is possible to detect multiple mouse button clicks in GLFW and populate buttons accordingly
49+
# TODO: Implement delta, if needed
50+
event = PseudoMouseEvent(pos, (0,0), p5.sketch.modifiers, button, [])
51+
mev = MouseEvent(event, active = (action == glfw.PRESS))
1452

53+
p5.sketch._enqueue_event('mouse_pressed', mev)
54+
55+
def on_mouse_scroll(window, x_off, y_off):
56+
pass
57+
58+
def on_mouse_motion(window, x, y):
59+
builtins.mouse_x = x
60+
builtins.mouse_y = y
61+
62+
63+
def on_key_press(window, key, scancode, action, mod):
64+
pass
1565

16-
66+
def on_key_char(window, text):
67+
pass

p5/sketch/events.py

+12-14
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,12 @@ def __init__(self, buttons):
4848
MouseButtonEnum.RIGHT: 'RIGHT',
4949
MouseButtonEnum.MIDDLE: 'MIDDLE',
5050
}
51-
5251
self._buttons = buttons
5352
self._button_names = [button_names[bt] for bt in self._buttons]
5453

5554
@property
5655
def buttons(self):
57-
self._button_names
56+
return self._button_names
5857

5958
def __eq__(self, other):
6059
button_map = {
@@ -191,7 +190,6 @@ class KeyEvent(Event):
191190

192191
def __init__(self, *args, **kwargs):
193192
super().__init__(*args, **kwargs)
194-
195193
if self._raw.key is not None:
196194
self.key = Key(self._raw.key.name, self._raw.text)
197195
else:
@@ -235,19 +233,19 @@ class MouseEvent(Event):
235233

236234
def __init__(self, *args, **kwargs):
237235
super().__init__(*args, **kwargs)
238-
239236
x, y = self._raw.pos
240237
x = max(min(builtins.width, x), 0)
241238
y = max(min(builtins.height, builtins.height - y), 0)
242239
dx, dy = self._raw.delta
243240

244-
if (self._raw.press_event is not None) and (
245-
self._raw.last_event is not None):
246-
px, py = self._raw.press_event.pos
247-
cx, cy = self._raw.last_event.pos
248-
self.change = Position(cx - px, cy - py)
249-
else:
250-
self.change = Position(0, 0)
241+
# This is not needed as per #347
242+
# if (self._raw.press_event is not None) and (
243+
# self._raw.last_event is not None):
244+
# px, py = self._raw.press_event.pos
245+
# cx, cy = self._raw.last_event.pos
246+
# self.change = Position(cx - px, cy - py)
247+
# else:
248+
# self.change = Position(0, 0)
251249

252250
self.x = max(min(builtins.width, x), 0)
253251
self.y = max(min(builtins.height, builtins.height - y), 0)
@@ -256,15 +254,15 @@ def __init__(self, *args, **kwargs):
256254
self.scroll = Position(int(dx), int(dy))
257255

258256
self.count = self.scroll.y
259-
self.button = MouseButton(self._raw.buttons)
260-
257+
self.button = MouseButton(self._raw.buttons + [self._raw.button])
258+
261259
def _update_builtins(self):
262260
builtins.pmouse_x = builtins.mouse_x
263261
builtins.pmouse_y = builtins.mouse_y
264262
builtins.mouse_x = self.x
265263
builtins.mouse_y = self.y
266264
builtins.mouse_is_pressed = self._active
267-
builtins.mouse_is_dragging = (self.change == (0, 0))
265+
# builtins.mouse_is_dragging = (self.change != (0, 0))
268266
builtins.mouse_button = self.button if self.pressed else None
269267

270268
def __repr__(self):

test.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,22 @@ def setup():
77
p5.sketch.canvas.clear(skia.ColorWHITE)
88
size(1000, 700)
99
p5.renderer.render_rectangle(200, 300, 50, 50)
10-
print("frame count", frame_count)
10+
# print("frame count", frame_count)
1111
no_loop()
1212

1313
def draw():
14-
p5.renderer.render_circle(20,20, 30)
15-
p5.renderer.render_circle(mouse_x, mouse_y, 30)
16-
print("frame count", frame_count)
17-
14+
p5.renderer.render_circle(20,20, 80)
15+
# print(mouse_x, mouse_y)
16+
p5.renderer.render_circle(mouse_x, mouse_y, 80)
17+
# print("frame count", frame_count)
1818

19+
def mouse_pressed(event):
20+
if mouse_button == 'LEFT':
21+
redraw()
22+
elif mouse_button == 'RIGHT':
23+
loop()
24+
elif mouse_button == 'MIDDLE':
25+
print("middle button is pressed")
26+
1927
if __name__ == '__main__':
2028
run(renderer='skia', frame_rate=60)

0 commit comments

Comments
 (0)