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 this class provides a test to emulate one or two TOUCH/TRACK events.
29 by pressing "ctrl left/right" the TOUCH events will be switched into TRACK events and the
30 other way around.
31 by pressing "shift left/right" a second event is created whenever the mousebutton (left)
32 is clicked.
33 the second event appears at the position: mousePosition - (40,40) pixels.
34
35 Note: remove any mouse event handling from your application to avoid emulation issues
36
37 For example:
38
39 1) avg.MOUSE | avg.TOUCH filters can be safely reduced to avg.TOUCH
40 2) the current libavg button module breaks the emulation
41 3) the current libavg Grabbable class breaks the emulation, unless is created with
42 source = avg.TOUCH parameter
43 """
44
45 from libavg import avg, Point2D
46 import warnings
47
48 Player = avg.Player.get()
49
51 """
52 this class provides a test method to
53 emulate one or two TOUCH events.
54 by pressing "ctrl left" the TOUCH events
55 will be switched into TRACK events.
56 """
57
58 ID = Point2D(10000,0)
59 EventMode = avg.TOUCH
60 pos1 = pos2 = Point2D(-1,-1)
61 mouseDown1 = mouseDown2 = Point2D(-1,-1)
62 hover = False
63 multiActive = False
64 mouseState = ''
65
67 rootNode = Player.getRootNode()
68 posX = rootNode.size.x * 3/4
69 posY = rootNode.size.y-40
70
71 self.__layer = Player.createNode('''
72 <words id="displayEmu" x="%(posX)i" y="%(posY)i" fontsize="20" opacity="1"
73 color="DDDDDD" text="multitouch emulation active!" sensitive="False" />
74 '''
75 % {'posX':posX, 'posY':posY}
76 )
77 rootNode.appendChild(self.__layer)
78
79 self.__container = Player.createNode('div', {})
80 self.__p1 = Player.createNode('circle', {'r': 10, 'fillcolor':'ff0000',
81 'fillopacity':0, 'opacity':0, 'sensitive':False})
82 self.__p2 = Player.createNode('circle', {'r': 10, 'fillcolor':'ff0000',
83 'fillopacity':0, 'opacity':0, 'sensitive':False})
84
85 rootNode.appendChild(self.__container)
86 self.__container.appendChild(self.__p1)
87 self.__container.appendChild(self.__p2)
88
89 rootNode.setEventHandler(avg.CURSORMOTION, avg.MOUSE, self.__onMouseMove)
90 rootNode.setEventHandler(avg.CURSORDOWN, avg.MOUSE, self.__onMouseButtonDown)
91 rootNode.setEventHandler(avg.CURSORUP, avg.MOUSE, self.__onMouseButtonUp)
92
93
95 """
96 after turning off the emulater the function unlinks
97 all nodes of the emulator. so it be garanted that the
98 application is working as before again.
99 events will be cleared with two UP events.
100 """
101 rootNode = Player.getRootNode()
102 rootNode.setEventHandler(avg.CURSORMOTION, avg.MOUSE, None)
103 rootNode.setEventHandler(avg.CURSORDOWN, avg.MOUSE, None)
104 rootNode.setEventHandler(avg.CURSORUP, avg.MOUSE, None)
105 self.__layer.unlink()
106 self.__container.unlink()
107 self.__p1.unlink()
108 self.__p2.unlink()
109 self.__p1 = self.__p2 = None
110 self.__container = self.__node2root = self.__layer = None
111 Player.getTestHelper().fakeTouchEvent(self.__getLeftID(), avg.CURSORUP,
112 self.EventMode, self.pos1, self.pos1, Point2D(0,0))
113 Player.getTestHelper().fakeTouchEvent(self.__getRightID(), avg.CURSORUP,
114 self.EventMode, self.pos2, self.pos2, Point2D(0,0))
115
117 self.ID = self.ID + (1,0)
118
120 self.idpos1 = int(self.ID.x)
121 return self.idpos1
122
124 self.ID = self.ID + (0,1)
125
127 self.idpos2 = int(self.ID.y)
128 return self.idpos2
129
130
152
154
155
156
157
158
159
160
161 if e.leftbuttonstate and self.multiActive:
162 self.pos1 = e.pos
163 self.pos2 = 2*Point2D(self.mouseDown2) - Point2D(20,20) - e.pos
164 Player.getTestHelper().fakeTouchEvent(self.__getLeftID(), avg.CURSORMOTION,
165 self.EventMode, self.pos1, self.pos1, e.speed)
166 Player.getTestHelper().fakeTouchEvent(self.__getRightID(), avg.CURSORMOTION,
167 self.EventMode, self.pos2, self.pos2, -e.speed)
168 self.__drawTouch()
169
170 elif e.leftbuttonstate and not self.multiActive:
171 self.pos1 = e.pos
172 Player.getTestHelper().fakeTouchEvent(self.__getLeftID(), avg.CURSORMOTION,
173 self.EventMode, self.pos1, self.pos1, e.speed)
174 self.__drawTouch()
175
176 return True
177
178
199
200
229
230
237
239 """
240 function to switch between TRACK and TOUCH.
241 it is called from the AVGAppStarter by pressing
242 'ctrl left'.
243 """
244
245 self.__eraseDraw()
246 Player.getTestHelper().fakeTouchEvent(self.__getLeftID(), avg.CURSORUP,
247 self.EventMode, self.pos1, self.pos1, Point2D(0,0))
248
249 if self.multiActive:
250 Player.getTestHelper().fakeTouchEvent(self.__getRightID(), avg.CURSORUP,
251 self.EventMode, self.pos2, self.pos2, Point2D(0,0))
252
253 self.hover = not self.hover
254 if self.hover == True:
255 self.EventMode = avg.TRACK
256 else:
257 self.EventMode = avg.TOUCH
258
259 if self.mouseState == 'Down':
260 self.mouseDown1 = self.pos1
261 self.__leftIDup()
262 Player.getTestHelper().fakeTouchEvent(self.__getLeftID(), avg.CURSORDOWN,
263 self.EventMode, self.pos1, self.pos1, Point2D(0,0))
264 if self.multiActive:
265 e = Player.getMouseState()
266 self.mouseDown2 = e.pos - Point2D(20,20)
267 self.pos2 = 2*Point2D(self.mouseDown2) - Point2D(20,20) - e.pos
268 self.__rightIDup()
269 Player.getTestHelper().fakeTouchEvent(self.__getRightID(), avg.CURSORDOWN,
270 self.EventMode, self.pos2, self.pos2, Point2D(0,0))
271 self.__drawTouch()
272
274 """
275 creates another event if shift and mouse left is pressed.
276 if the mouse is not pressed no event will appear.
277 """
278 self.multiActive = not self.multiActive
279
280 if self.mouseState == 'Down':
281 self.__eraseDraw()
282
283 if not self.multiActive:
284 Player.getTestHelper().fakeTouchEvent(self.__getRightID(), avg.CURSORUP,
285 self.EventMode, self.pos2, self.pos2, Point2D(0,0))
286
287 if self.multiActive:
288 e = Player.getMouseState()
289 self.mouseDown2 = e.pos - Point2D(20,20)
290 self.pos2 = 2*Point2D(self.mouseDown2) - Point2D(20,20) - e.pos
291 self.__rightIDup()
292 Player.getTestHelper().fakeTouchEvent(self.__getRightID(), avg.CURSORDOWN,
293 self.EventMode, self.pos2, self.pos2, Point2D(0,0))
294
295 self.__drawTouch()
296
297 return True
298