Package libavg :: Module mtemu

Source Code for Module libavg.mtemu

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3   
  4  # libavg - Media Playback Engine. 
  5  # Copyright (C) 2003-2008 Ulrich von Zadow 
  6  # 
  7  # This library is free software; you can redistribute it and/or 
  8  # modify it under the terms of the GNU Lesser General Public 
  9  # License as published by the Free Software Foundation; either 
 10  # version 2 of the License, or (at your option) any later version. 
 11  # 
 12  # This library is distributed in the hope that it will be useful, 
 13  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 15  # Lesser General Public License for more details. 
 16  # 
 17  # You should have received a copy of the GNU Lesser General Public 
 18  # License along with this library; if not, write to the Free Software 
 19  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 20  # 
 21  # Current versions can be found at www.libavg.de 
 22  # 
 23  # Original author of this file is Sebastian Maulbeck  
 24  # <sm (at) archimedes-solutions (dot) de> 
 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   
50 -class MTemu(object):
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
66 - def __init__(self):
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
94 - def delete(self):
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
116 - def __leftIDup(self):
117 self.ID = self.ID + (1,0)
118
119 - def __getLeftID(self):
120 self.idpos1 = int(self.ID.x) 121 return self.idpos1
122
123 - def __rightIDup(self):
124 self.ID = self.ID + (0,1)
125
126 - def __getRightID(self):
127 self.idpos2 = int(self.ID.y) 128 return self.idpos2
129 130
131 - def __onMouseButtonDown(self,e):
132 #activation with a left mouse click. 133 #one or two fake UP events will be created (multitouch active or not). 134 #SOURCE depending on EventMode. 135 136 if e.button == 1: 137 self.mouseState = 'Down' 138 self.pos1 = e.pos 139 self.mouseDown1 = self.pos1 140 self.__leftIDup() 141 Player.getTestHelper().fakeTouchEvent(self.__getLeftID(), avg.CURSORDOWN, 142 self.EventMode, self.pos1, self.pos1, e.speed) 143 if self.multiActive: 144 self.mouseDown2 = e.pos - Point2D(20,20) 145 self.pos2 = 2*Point2D(self.mouseDown2) - Point2D(20,20) - e.pos 146 self.__rightIDup() 147 Player.getTestHelper().fakeTouchEvent(self.__getRightID(), avg.CURSORDOWN, 148 self.EventMode, self.pos2, self.pos2, -e.speed) 149 150 self.__drawTouch() 151 return True
152
153 - def __onMouseMove(self, e):
154 #is activated if left mouse button is pressed AND moved. 155 156 #If the left mouse button is pressed and multitouch (shift) 157 #is acitvated it creates two fake events. 158 #One event position will be set to the mouse position. 159 #the second event will move in relation to the mouse position. 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
179 - def __onMouseButtonUp(self, e):
180 #one or two fake UP events will be created (multitouch active or not). 181 #SOURCE depending on EventMode. 182 183 self.__eraseDraw() 184 if e.button == 1: 185 self.mouseState = 'Up' 186 Player.getTestHelper().fakeTouchEvent(self.__getLeftID(), avg.CURSORUP, 187 self.EventMode, self.pos1, self.pos1, e.speed) 188 self.pos1 = (-1,-1) 189 self.mouseDown1 = (-1,-1) 190 191 192 if self.multiActive: 193 Player.getTestHelper().fakeTouchEvent(self.__getRightID(), avg.CURSORUP, 194 self.EventMode, self.pos2, self.pos2, -e.speed) 195 self.pos2 = (-1,-1) 196 self.mouseDown2 = (-1,-1) 197 198 return True
199 200
201 - def __drawTouch(self):
202 #function to draw the fake events. style depending on EventMode. 203 if self.EventMode == avg.TOUCH: 204 self.__p1.pos = self.pos1 205 self.__p1.r = 6 206 self.__p1.fillcolor = 'ff0000' 207 self.__p1.fillopacity = 1 208 209 self.__p2.pos = self.pos2 210 self.__p2.r = 6 211 self.__p2.fillcolor = 'ff0000' 212 if self.multiActive: 213 self.__p2.fillopacity = 1 214 else: 215 self.__p2.fillopacity = 0 216 else: 217 self.__p1.r = 13 218 self.__p1.pos = self.pos1 219 self.__p1.fillcolor = 'ffffff' 220 self.__p1.fillopacity = 0.4 221 222 self.__p2.r = 13 223 self.__p2.pos = self.pos2 224 self.__p2.fillcolor = 'ffffff' 225 if self.multiActive: 226 self.__p2.fillopacity = 0.4 227 else: 228 self.__p2.fillopacity = 0
229 230
231 - def __eraseDraw(self):
232 #function to erase the fake TOUCH events. 233 234 self.__p1.fillopacity = 0 235 if self.multiActive: 236 self.__p2.fillopacity = 0
237
238 - def changeMode(self):
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
273 - def multiTouch(self):
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