def on_touch_up(self, touch): self.points += [touch.pos] gesture = Gesture() gesture.add_stroke(self.points) gesture.normalize() gdb = GestureDatabase() print "Gesture:", gdb.gesture_to_str(gesture)
class GestureBoard(FloatLayout): """ Our application main widget, derived from touchtracer example, use data constructed from touches to match symboles loaded from my_gestures. """ def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() # add pre-recorded gestures to database self.gdb.add_gesture(cross) self.gdb.add_gesture(check) self.gdb.add_gesture(circle) self.gdb.add_gesture(square) def on_touch_down(self, touch): # start collecting points in touch.ud # create a line to display the points userdata = touch.ud with self.canvas: Color(1, 1, 0) d = 30. Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d)) userdata['line'] = Line(points=(touch.x, touch.y)) return True def on_touch_move(self, touch): # store points of the touch movement try: touch.ud['line'].points += [touch.x, touch.y] return True except (KeyError), e: pass
def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() # add pre-recorded gestures to database self.gdb.add_gesture(cross) self.gdb.add_gesture(check) self.gdb.add_gesture(circle) self.gdb.add_gesture(square)
def __init__(self, path='./chronos/assets/gestures/'): with open(path + 'gestures.json', "r+") as f: self.path = path self.str_gestures = json.load(f) self.db = GestureDatabase() for name, gesture_string in self.str_gestures.items(): gesture = self.db.str_to_gesture(gesture_string) gesture.name = name self.db.add_gesture(gesture)
class TabPannel(TabbedPanel): def __init__(self, *args, **kwargs): super(TabPannel, self).__init__(*args, **kwargs) self.app = RfAttendance.get_running_app() self.gdb = GestureDatabase() self.left_to_right_gesture = self.gdb.str_to_gesture(left_to_right_gesture) self.right_to_left_gesture = self.gdb.str_to_gesture(right_to_left_gesture) self.gdb.add_gesture(self.left_to_right_gesture) self.gdb.add_gesture(self.right_to_left_gesture) def on_touch_down(self, touch): touch.ud['line'] = Line(points=(touch.x, touch.y)) return super(TabPannel, self).on_touch_down(touch) def on_touch_move(self, touch): try: touch.ud['line'].points += [touch.x, touch.y] return super(TabbedPanel, self).on_touch_move(touch) except KeyError: pass def on_touch_up(self, touch): g = Gesture() g.add_stroke(list(zip( touch.ud['line'].points[::2], touch.ud['line'].points[1::2] ))) g.normalize() g.name = '' g2 = self.gdb.find(g, minscore=0.70) if g2 and g2[1] == self.left_to_right_gesture: self.switch_to_left() elif g2 and g2[1] == self.right_to_left_gesture: self.switch_to_right() return super(TabPannel, self).on_touch_up(touch) def switch_to_right(self): current_tab_index = self.tab_list.index(self.current_tab) if current_tab_index == 0: return try: self.switch_to(self.tab_list[current_tab_index - 1]) except IndexError: pass def switch_to_left(self): current_tab_index = self.tab_list.index(self.current_tab) try: self.switch_to(self.tab_list[current_tab_index + 1]) except IndexError: pass
def __init__(self, app, **kwargs): # inicializace pole self.app = app super(GameMatrix, self).__init__(**kwargs) self.coords = [] self.dpos = (0, 0) self.colors = [] self.shape = None self.active_color = [.1372, .1372, .1372, 1] self.inactive_color = [.1372, .1372, .1372, 1] self.fUpdate = 12 * 22 * "0" self.tnetCoords2 = [] for y in range(51, 73): for x in range(51, 63): self.tnetCoords2.append(chr(x) + chr(y)) self.tnetCoords = [] for x in range(51, 63): col = [] for y in range(51, 73): col.append((chr(x), chr(y))) self.tnetCoords.append(col) self.tnetColors = [] for c in range(33, 48): self.tnetColors.append(chr(c)) self.move = False self.orientation = 0 self.colored = set() self.colors = [ deepcopy(self.inactive_color), [0, .6, .8, 1], [1, .7333333, .2, 1], [.6, .8, 0, 1], [.666666667, .4, .8, 1], [1, .266666667, .266666667, 1] ] self.COORDS_SET = set() for y in range(int(self.rows)): line = [] for x in range(int(self.cols)): box = Box() box.coords = (x, y) box.colored = deepcopy(self.inactive_color) self.add_widget(box) line.append(box) self.COORDS_SET.add((x, y)) self.coords.append(line) self.b = 0 self.startgame = False self.seed = randint(0, 0xFFFFFF) self.specials = set() self.buildNext = False self.mLR = False self.gdb = GestureDatabase() self.GSTR_DROP = \ self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebg08ng8M/YL0GslHqBKIQK0W4iSbHf37WtPIjZS/6Si4WIYez4P+Yyxt5eny4/35tSN08vQuc9L23u3Pfbg9ptr+73buD6Ut6VBN+434zTcnrqxfIxu+9yT2/4WstdhrueKkpLf3y7Xqaalmpb/kPaljnI9zBXUEt5LCgS3803EKCmwT5yJCXKt5q32Yu31HsETZe85AIAQsBu/tX+fJuo05E7zDEEEBDOg17k8ufH0AF2/O4gRPSk929CDCghgRA9KRyO6Wg13qx7viyaUaRLyY3jVGsQKr15DNsKjikWwwqtZRCu8qkUrtahq0Uotqlpc1H7yDaT1jhbKY3sEH1VtBCu8qo1ohVe1kazwqjaKFV7VRiu1pGrJSi2pWvpQG0Ne/9k+SFezREZ0FUtiRFevlG3orFoZjOhqlY2sslplI6usVtnIKqtV/rC6bPDLCSTBQi89HhIjUvQogcWXn+C/4KJSBWzg6lTQBq5Khf4XXm8Hh6HrrvezvnA97Iu47Q4FG+92UUJppl6Sa38N5nUwogaTXwUxpzkI6yAtwbAOQmnWL64jUEdwriNCWtKia+fqz93ldJ7qHYXcrmyxpbtEXy/H6VyDXIqaQ9PtuRva66FejpLUZQg1vDzWr/1wO74cFJRKJQ2Vs4OUK0sMwEF0gTY/AXq8jUg=') self.gdb.add_gesture(self.GSTR_DROP) self.dropAnimation2 = Animation(colored=self.inactive_color, d=.03) self.dropAnimation = Animation(colored=self.inactive_color, d=.1) self.spectate = False
def __init__(self, *args, **kwargs): super(QueueViewManager, self).__init__() #Initial values self.index = 0 #Create gesture database self.gdb = GestureDatabase() #Add gestures self.gdb.add_gesture(swipe_left) self.gdb.add_gesture(swipe_right) self.gesture_tolerence = 0.70 # minimum score that a gesture must reach before actions can be triggered
def __init__(self, config, gestures, el, *args, **kwarg): """ :param config: string containing the path to the action configuration :param gestures: string containing the path to the gestures configuration """ super(EventDispatcher, self).__init__(*args, **kwarg) self._event_loop = el self._gdb = GestureDatabase() self._actions = Actions(config, gestures) self.update_devices() self._multitouches = []
def __init__(self, **kwargs): # inicializace self.app = kwargs['root'] self.register_event_type('on_swipe_right') self.register_event_type('on_swipe_left') super(GestureListener, self).__init__(**kwargs) self.gdb = GestureDatabase() self.GSTR_SWIPE_LEFT = \ self.gdb.str_to_gesture('eNqtls2O2jAURvd+EdgU+f7bL0C3lXiAikIEaKYQQabtvH3tC0ITQZtZeJXkU3ycfEdK7vzwcvj1vth1l+Ht3IWvt2Mfw3zbQ1jNjuuf3Sz0WE7LgcJlNbsM59NLdymXHOavvYT5U8jKbwu9VpSV9f3pcBzqslSX5X8s+1bvCj1cn6A+wntZAhiWcRHr9n/qJdVL0pQNjZUIkAzC5cf6/1B2qITdnbe7oRBSxEwSIXJCmkb5a4E9olDEVCBnUGAUsmlWclZuwULvDeGRVSr62BfjNAudRU1YXj1KE5Z3j9aE5d3jQ/dfyikrIEgmzMCRTSZh5OUTtIF5+0RtYF4/SRuY90/WBuYCqI0AdgH8TAAmyBaVc8oCZvkTMBfA1AbmAljawFwAWxuYC+DcBCYuQNoIEBcgbQSIC5BnAjjFmCiJMSOxpemvv7gAsTYwFyC5CUxdgEIbmAtQagNzAdpGgLoAbSNAXYA+E6AEEa38eVWTaflNTLHM+zdowvL6jZqwvH2TT7LqmLc5d93xPrSZ1qnNLMyXlqSsXxLnchh6S2H9GOZrGD+GKXpoNArBQ8mjED1kGIXkIego5BpqHu2exEMbMzWsr6+27w67/VAnUbuPlb8P22FfoxSWEPUaDqfX7rw+buoInLJPGDW+Vfy9P5+2b5sKymUfXmA0SGqmkAG0Dh+Lv5QfIpE=') self.GSTR_SWIPE_RIGHT = \ self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebhs5Pm3X4C9VuIBKgoRi3YLEWTb7tvXnmzbjVQKquRcDJOZb4Z8KLKXh+fDt7du31/G13MfHt/XIYblboCwXhw3X/tFGLB8LAuFy3pxGc+n5/5SvnJYvgwSln+FrD0tDFpRVuqH0+E41rJUy/KVsk81KwwwTVBHeCslgGEVuxhZWRNH4KQ55eTz/Kj3KaweYkcZDJMiCwmBhsuXzb+7sHeRsL/eYP+LzQaQsmSIlqLqHXT/6WAT/aHi0VKCyDFlhMyW9A8fwWI0Js7MSJZv45PjcyM8ugGEVnh0PLXCu1mU+/CRAIgSppwVE0q6LRddLlq7Bq4Xc7MG5IIJ2jVwxUTtGrhkaieZXDLdI7n8R9nUVCxnFJUot+lumHIbOrtehkZ0d8vUiO5iWRrR3So3sspulRtZFbcqjayKW5VGVsWtyn1WBYSIxZBztKh8m+5WxRrR3arkNnR1qwqN6G5VqRHdrWojq+pWtZFVdavayKq5VWtk1dyq3WdVY0IDMpn2t7fhLtXkf+H1mLA99/3x96bftO76zcJyBdrFsCIqy8dLwzhYCpuSkK4n5JqAaX4n8pX0FGu60sTjspQYeA/ALs+uDxk4TZFmZeSdNc6CPI0js6CEzfQMnvrD/mmsRx4NK5yPV95UJeP7YTc+1QQrCZpLfQmOp5f+vDlu68krpfqIoYbfVX0ezqfd69axZWjuQKJC3dYgkGp9D3c/Ab86orc=') self.gdb.add_gesture(self.GSTR_SWIPE_LEFT) self.gdb.add_gesture(self.GSTR_SWIPE_RIGHT)
class Listener(EventDispatcher): """ listener function that queries kivy for touch events, builds the gesture and dispatch it through the actions singleton. """ def __init__(self, config, gestures, el, *args, **kwarg): """ :param config: string containing the path to the action configuration :param gestures: string containing the path to the gestures configuration """ super(EventDispatcher, self).__init__(*args, **kwarg) self._event_loop = el self._gdb = GestureDatabase() self._actions = Actions(config, gestures) self.update_devices() self._multitouches = [] def update_devices(self): log.debug('update_devices()') context = pyudev.Context() for device in context.list_devices(subsystem='input', ID_INPUT_MOUSE=True): if device.sys_name.startswith('event'): if 'PRODUCT' in device.parent.keys(): self._actions.update_gestures(device.parent['PRODUCT']) for gest_n, gest_r in self._actions.get_gestures().iteritems(): for g in gest_r: g = self._gdb.str_to_gesture(g) g.normalize() g.name = gest_n self._gdb.add_gesture(g) def on_touch_down(self, touch): """ listening function executed at begining of touch event builds the gesture """ self._multitouches.append(touch) touch.ud['line'] = Line(points=(touch.sx, touch.sy)) return True def on_touch_move(self, touch): """ listening function executed during touch event store points of the gesture """ # store points of the touch movement try: touch.ud['line'].points += [touch.sx, touch.sy] return True except (KeyError), e: pass
def __init__(self, *args, **kwargs): super().__init__() self.gdb = GestureDatabase() self.line45 = self.gdb.str_to_gesture(line45_str) self.cirlce = self.gdb.str_to_gesture(cirlce_str) self.cross = self.gdb.str_to_gesture(cross_str) self.line135 = self.line45.rotate(90) self.line225 = self.line45.rotate(180) self.line315 = self.line45.rotate(270) self.gdb.add_gesture(self.line45) self.gdb.add_gesture(self.line135) self.gdb.add_gesture(self.line225) self.gdb.add_gesture(self.line315) self.gdb.add_gesture(self.cross) self.gdb.add_gesture(self.cirlce)
def __init__(self, *args, **kwargs): super(DrawingCanvas, self).__init__() self.gdb = GestureDatabase() self.line45 = self.gdb.str_to_gesture(line45_str) self.circle = self.gdb.str_to_gesture(circle_str) self.cross = self.gdb.str_to_gesture(cross_str) self.line135 = self.line45.rotate(90) self.line225 = self.line45.rotate(180) self.line315 = self.line45.rotate(270) self.gdb.add_gesture(self.line45) self.gdb.add_gesture(self.line135) self.gdb.add_gesture(self.line225) self.gdb.add_gesture(self.line315) self.gdb.add_gesture(self.circle) self.gdb.add_gesture(self.cross) self.links = []
def InitVars(self) -> None: """ (re) Initialises all vars (also after a definition change) """ InitSystemVars() Globals.oDefinitions.InitVars() SetVar(uVarName = u'REPVERSION', oVarValue = ToUnicode(Globals.iVersion)) # Name of the Current page # List for settings dialog self.bIntransition = False self.dGestures.clear() self.dPopups.clear() self.iLastWidgetPage = 0 Globals.oActions.InitVars() self.oCurrentPage = None self.oFonts.DeInit() self.oGdb = GestureDatabase() self.oPopup = None self.oScreenPages.DeInit() self.uCurrentEffect = u'' self.uCurrentEffectDirection = u'' self.uCurrentPageName = u'' self.uDefaultTransmitterPictureName = u'' self.uDefaultWaitPictureName = u'' self.uDefName = u'' self.uFirstPageName = u'' self.uInterFaceToConfig = u'' self.uScriptToConfig = u'' self.uConfigToConfig = u'' self.uSplashText = u'' self.iBlockCount = 0 self.iBlockAskCount = 0 if Globals.oTheScreen: Globals.oTheScreen.oSkin.dSkinRedirects.clear() gc.collect()
def on_touch_up(self,touch): self.points+=[touch.pos] with self.canvas: Ellipse(pos=(touch.x-5,touch.y-5),size=(10,10)) gesture=Gesture() gesture.add_stroke(self.points) gesture.normalize() gdb=GestureDatabase()
class GestureBox(FloatLayout): def __init__(self, **kwargs): super(Box, self).__init__(**kwargs) self.gdb = GestureDatabase() top_to_button = self.gdb.str_to_gesture(gesture_string) self.gdb.add_gesture(top_to_button) self.register_event_type('on_top_to_button') def on_touch_down(self, touch): super(Box, self).on_touch_down(touch) # print('vbar',self.scroll.vbar) if self.scroll.vbar[0] > 0.79 and self.collide_point(*touch.pos): touch.grab(self) touch.ud['data points'] = [(touch.x, touch.y)] def on_touch_move(self, touch): super(Box, self).on_touch_move(touch) if touch.grab_current is self: touch.ud['data points'] += [(touch.x, touch.y)] def on_touch_up(self, touch): super(Box, self).on_touch_up(touch) if touch.grab_current is self: gesture = Gesture() gesture.add_stroke(touch.ud['data points']) gesture.normalize() match = self.gdb.find(gesture, minscore=0.8) if match: # print(match[0]) self.dispatch('on_top_to_button') touch.ungrab(self) def on_top_to_button(self): print('My event happend') def add_widget(self, widget): if len(self.children) == 0: super(Box, self).add_widget(widget) self.scroll = widget else: print("Can't add more than one widget")
def __init__(self, *args, **kwargs): super(TabPannel, self).__init__(*args, **kwargs) self.app = RfAttendance.get_running_app() self.gdb = GestureDatabase() self.left_to_right_gesture = self.gdb.str_to_gesture(left_to_right_gesture) self.right_to_left_gesture = self.gdb.str_to_gesture(right_to_left_gesture) self.gdb.add_gesture(self.left_to_right_gesture) self.gdb.add_gesture(self.right_to_left_gesture)
class GestureListener(Widget): def __init__(self, **kwargs): # inicializace self.app = kwargs['root'] self.register_event_type('on_swipe_right') self.register_event_type('on_swipe_left') super(GestureListener, self).__init__(**kwargs) self.gdb = GestureDatabase() self.GSTR_SWIPE_LEFT = \ self.gdb.str_to_gesture('eNqtls2O2jAURvd+EdgU+f7bL0C3lXiAikIEaKYQQabtvH3tC0ITQZtZeJXkU3ycfEdK7vzwcvj1vth1l+Ht3IWvt2Mfw3zbQ1jNjuuf3Sz0WE7LgcJlNbsM59NLdymXHOavvYT5U8jKbwu9VpSV9f3pcBzqslSX5X8s+1bvCj1cn6A+wntZAhiWcRHr9n/qJdVL0pQNjZUIkAzC5cf6/1B2qITdnbe7oRBSxEwSIXJCmkb5a4E9olDEVCBnUGAUsmlWclZuwULvDeGRVSr62BfjNAudRU1YXj1KE5Z3j9aE5d3jQ/dfyikrIEgmzMCRTSZh5OUTtIF5+0RtYF4/SRuY90/WBuYCqI0AdgH8TAAmyBaVc8oCZvkTMBfA1AbmAljawFwAWxuYC+DcBCYuQNoIEBcgbQSIC5BnAjjFmCiJMSOxpemvv7gAsTYwFyC5CUxdgEIbmAtQagNzAdpGgLoAbSNAXYA+E6AEEa38eVWTaflNTLHM+zdowvL6jZqwvH2TT7LqmLc5d93xPrSZ1qnNLMyXlqSsXxLnchh6S2H9GOZrGD+GKXpoNArBQ8mjED1kGIXkIego5BpqHu2exEMbMzWsr6+27w67/VAnUbuPlb8P22FfoxSWEPUaDqfX7rw+buoInLJPGDW+Vfy9P5+2b5sKymUfXmA0SGqmkAG0Dh+Lv5QfIpE=') self.GSTR_SWIPE_RIGHT = \ self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebhs5Pm3X4C9VuIBKgoRi3YLEWTb7tvXnmzbjVQKquRcDJOZb4Z8KLKXh+fDt7du31/G13MfHt/XIYblboCwXhw3X/tFGLB8LAuFy3pxGc+n5/5SvnJYvgwSln+FrD0tDFpRVuqH0+E41rJUy/KVsk81KwwwTVBHeCslgGEVuxhZWRNH4KQ55eTz/Kj3KaweYkcZDJMiCwmBhsuXzb+7sHeRsL/eYP+LzQaQsmSIlqLqHXT/6WAT/aHi0VKCyDFlhMyW9A8fwWI0Js7MSJZv45PjcyM8ugGEVnh0PLXCu1mU+/CRAIgSppwVE0q6LRddLlq7Bq4Xc7MG5IIJ2jVwxUTtGrhkaieZXDLdI7n8R9nUVCxnFJUot+lumHIbOrtehkZ0d8vUiO5iWRrR3So3sspulRtZFbcqjayKW5VGVsWtyn1WBYSIxZBztKh8m+5WxRrR3arkNnR1qwqN6G5VqRHdrWojq+pWtZFVdavayKq5VWtk1dyq3WdVY0IDMpn2t7fhLtXkf+H1mLA99/3x96bftO76zcJyBdrFsCIqy8dLwzhYCpuSkK4n5JqAaX4n8pX0FGu60sTjspQYeA/ALs+uDxk4TZFmZeSdNc6CPI0js6CEzfQMnvrD/mmsRx4NK5yPV95UJeP7YTc+1QQrCZpLfQmOp5f+vDlu68krpfqIoYbfVX0ezqfd69axZWjuQKJC3dYgkGp9D3c/Ab86orc=') self.gdb.add_gesture(self.GSTR_SWIPE_LEFT) self.gdb.add_gesture(self.GSTR_SWIPE_RIGHT) def simplegesture(self, name, point_list): # Pomocná funkce pro rozpoznávání gesta g = Gesture() g.add_stroke(point_list) g.normalize() g.name = name return g def on_touch_down(self, touch): # Při doteku, spustí zaznamenávání if self.collide_point(touch.x, touch.y): touch.ud["line"] = Line(points=(touch.x, touch.y)) touch.grab(self) print "< grabbed >" def on_touch_move(self, touch): # Při pohybu prstu, zaznamenává pohyb if (touch.grab_current is self): touch.ud["line"].points += [touch.x, touch.y] def on_touch_up(self, touch): # Při zvednutí prstu, porovnává s gestem v databázi if (touch.grab_current is self): g = self.simplegesture( '', zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2])) g2 = self.gdb.find(g, minscore=0.80) if g2: if g2[1] == self.GSTR_SWIPE_LEFT: self.dispatch('on_swipe_left') if g2[1] == self.GSTR_SWIPE_RIGHT: self.dispatch('on_swipe_right') touch.ungrab(self) def on_swipe_left(self, *args): # Událost přejetí prstu doleva self.app.on_swipe_left() def on_swipe_right(self, *args): # Událost přejetí prstu doprava self.app.on_swipe_right()
def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() self.error_sound = SoundLoader.load('error.mp3') self.success_sound = SoundLoader.load('success.mp3') #Gestures for key, ges in gestures.items(): self.gdb.add_gesture(ges) self.sort_letter()
class GestureManager(object): def __init__(self, path='./chronos/assets/gestures/'): with open(path + 'gestures.json', "r+") as f: self.path = path self.str_gestures = json.load(f) self.db = GestureDatabase() for name, gesture_string in self.str_gestures.items(): gesture = self.db.str_to_gesture(gesture_string) gesture.name = name self.db.add_gesture(gesture) def add_gesture(self, name, gesture_path): gesture = Gesture() gesture.add_stroke(gesture_path) gesture.normalize() if name in self.str_gestures: raise ValueError('Cannot overwrite existing gesture in file.') gesture.name = name self.str_gestures[name] = self.db.gesture_to_str(gesture).decode( 'utf-8') self.db.add_gesture(gesture) def save(self, path=None): if not path: path = self.path with open(path + 'gestures.json', "r+") as f: f.seek(0) json.dump(self.str_gestures, f) f.truncate()
def load_gestures(): gdb = GestureDatabase() gdb.add_gesture(cun_1) gdb.add_gesture(cun_10) print('Loading gestures...') return gdb
def __init__(self, **kwargs): super(CurrentSession, self).__init__(**kwargs) #self.snack = Snackbar(text="Current session updated", duration=2) self.ssm = None self.buttons = {} self.available_grid_sizes = ['small', 'large'] self.bind(grid=self.refresh_menu_text, buttons=self.refresh_screen) self.working_layout.bind( minimum_height=self.working_layout.setter('height')) self.menu_items = [{ 'viewclass': 'MDFlatButton', 'text': 'Show %s grid' % self.grid, 'on_release': lambda: self.change_grid_size() }] self.color_manager = ColorManager(md_colors) self.clear_anim = Animation(x=self.width, duration=.5, transition=animation_type) self.bind(width=self.update_anim, size=self.adjust_height) self.gdb = GestureDatabase() self.gdb.add_gesture(left_to_right) Clock.schedule_once(self.my_init)
def __init__(self, app, **kwargs): # inicializace pole self.app = app super(GameMatrix, self).__init__(**kwargs) self.coords = [] self.dpos = (0,0) self.colors = [] self.shape = None self.active_color = [.1372,.1372,.1372,1] self.inactive_color = [.1372,.1372,.1372,1] self.fUpdate = 12*22*"0" self.tnetCoords2 = [] for y in range(51,73): for x in range(51,63): self.tnetCoords2.append(chr(x)+chr(y)) self.tnetCoords = [] for x in range(51,63): col = [] for y in range(51,73): col.append((chr(x), chr(y))) self.tnetCoords.append(col) self.tnetColors = [] for c in range(33, 48): self.tnetColors.append(chr(c)) self.move = False self.orientation = 0 self.colored = set() self.colors = [deepcopy(self.inactive_color), [0,.6,.8,1], [1,.7333333,.2,1], [.6,.8,0,1], [.666666667,.4,.8,1], [1,.266666667,.266666667,1]] self.COORDS_SET = set() for y in range(int(self.rows)): line = [] for x in range(int(self.cols)): box = Box() box.coords = (x, y) box.colored = deepcopy(self.inactive_color) self.add_widget(box) line.append(box) self.COORDS_SET.add((x, y)) self.coords.append(line) self.b = 0 self.startgame = False self.seed = randint(0,0xFFFFFF) self.specials = set() self.buildNext = False self.mLR = False self.gdb = GestureDatabase() self.GSTR_DROP = \ self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebg08ng8M/YL0GslHqBKIQK0W4iSbHf37WtPIjZS/6Si4WIYez4P+Yyxt5eny4/35tSN08vQuc9L23u3Pfbg9ptr+73buD6Ut6VBN+434zTcnrqxfIxu+9yT2/4WstdhrueKkpLf3y7Xqaalmpb/kPaljnI9zBXUEt5LCgS3803EKCmwT5yJCXKt5q32Yu31HsETZe85AIAQsBu/tX+fJuo05E7zDEEEBDOg17k8ufH0AF2/O4gRPSk929CDCghgRA9KRyO6Wg13qx7viyaUaRLyY3jVGsQKr15DNsKjikWwwqtZRCu8qkUrtahq0Uotqlpc1H7yDaT1jhbKY3sEH1VtBCu8qo1ohVe1kazwqjaKFV7VRiu1pGrJSi2pWvpQG0Ne/9k+SFezREZ0FUtiRFevlG3orFoZjOhqlY2sslplI6usVtnIKqtV/rC6bPDLCSTBQi89HhIjUvQogcWXn+C/4KJSBWzg6lTQBq5Khf4XXm8Hh6HrrvezvnA97Iu47Q4FG+92UUJppl6Sa38N5nUwogaTXwUxpzkI6yAtwbAOQmnWL64jUEdwriNCWtKia+fqz93ldJ7qHYXcrmyxpbtEXy/H6VyDXIqaQ9PtuRva66FejpLUZQg1vDzWr/1wO74cFJRKJQ2Vs4OUK0sMwEF0gTY/AXq8jUg=') self.gdb.add_gesture(self.GSTR_DROP) self.dropAnimation2 = Animation(colored=self.inactive_color, d=.03) self.dropAnimation = Animation(colored=self.inactive_color, d=.1) self.spectate = False
class GestureListener(Widget): def __init__(self, **kwargs): # inicializace self.app = kwargs['root'] self.register_event_type('on_swipe_right') self.register_event_type('on_swipe_left') super(GestureListener, self).__init__(**kwargs) self.gdb = GestureDatabase() self.GSTR_SWIPE_LEFT = \ self.gdb.str_to_gesture('eNqtls2O2jAURvd+EdgU+f7bL0C3lXiAikIEaKYQQabtvH3tC0ITQZtZeJXkU3ycfEdK7vzwcvj1vth1l+Ht3IWvt2Mfw3zbQ1jNjuuf3Sz0WE7LgcJlNbsM59NLdymXHOavvYT5U8jKbwu9VpSV9f3pcBzqslSX5X8s+1bvCj1cn6A+wntZAhiWcRHr9n/qJdVL0pQNjZUIkAzC5cf6/1B2qITdnbe7oRBSxEwSIXJCmkb5a4E9olDEVCBnUGAUsmlWclZuwULvDeGRVSr62BfjNAudRU1YXj1KE5Z3j9aE5d3jQ/dfyikrIEgmzMCRTSZh5OUTtIF5+0RtYF4/SRuY90/WBuYCqI0AdgH8TAAmyBaVc8oCZvkTMBfA1AbmAljawFwAWxuYC+DcBCYuQNoIEBcgbQSIC5BnAjjFmCiJMSOxpemvv7gAsTYwFyC5CUxdgEIbmAtQagNzAdpGgLoAbSNAXYA+E6AEEa38eVWTaflNTLHM+zdowvL6jZqwvH2TT7LqmLc5d93xPrSZ1qnNLMyXlqSsXxLnchh6S2H9GOZrGD+GKXpoNArBQ8mjED1kGIXkIego5BpqHu2exEMbMzWsr6+27w67/VAnUbuPlb8P22FfoxSWEPUaDqfX7rw+buoInLJPGDW+Vfy9P5+2b5sKymUfXmA0SGqmkAG0Dh+Lv5QfIpE=') self.GSTR_SWIPE_RIGHT = \ self.gdb.str_to_gesture('eNq1l82O2jAQgO9+Ebhs5Pm3X4C9VuIBKgoRi3YLEWTb7tvXnmzbjVQKquRcDJOZb4Z8KLKXh+fDt7du31/G13MfHt/XIYblboCwXhw3X/tFGLB8LAuFy3pxGc+n5/5SvnJYvgwSln+FrD0tDFpRVuqH0+E41rJUy/KVsk81KwwwTVBHeCslgGEVuxhZWRNH4KQ55eTz/Kj3KaweYkcZDJMiCwmBhsuXzb+7sHeRsL/eYP+LzQaQsmSIlqLqHXT/6WAT/aHi0VKCyDFlhMyW9A8fwWI0Js7MSJZv45PjcyM8ugGEVnh0PLXCu1mU+/CRAIgSppwVE0q6LRddLlq7Bq4Xc7MG5IIJ2jVwxUTtGrhkaieZXDLdI7n8R9nUVCxnFJUot+lumHIbOrtehkZ0d8vUiO5iWRrR3So3sspulRtZFbcqjayKW5VGVsWtyn1WBYSIxZBztKh8m+5WxRrR3arkNnR1qwqN6G5VqRHdrWojq+pWtZFVdavayKq5VWtk1dyq3WdVY0IDMpn2t7fhLtXkf+H1mLA99/3x96bftO76zcJyBdrFsCIqy8dLwzhYCpuSkK4n5JqAaX4n8pX0FGu60sTjspQYeA/ALs+uDxk4TZFmZeSdNc6CPI0js6CEzfQMnvrD/mmsRx4NK5yPV95UJeP7YTc+1QQrCZpLfQmOp5f+vDlu68krpfqIoYbfVX0ezqfd69axZWjuQKJC3dYgkGp9D3c/Ab86orc=') self.gdb.add_gesture(self.GSTR_SWIPE_LEFT) self.gdb.add_gesture(self.GSTR_SWIPE_RIGHT) def simplegesture(self, name, point_list): # Pomocná funkce pro rozpoznávání gesta g = Gesture() g.add_stroke(point_list) g.normalize() g.name = name return g def on_touch_down(self, touch): # Při doteku, spustí zaznamenávání if self.collide_point(touch.x, touch.y): touch.ud["line"] = Line(points=(touch.x, touch.y)) touch.grab(self) print "< grabbed >" def on_touch_move(self, touch): # Při pohybu prstu, zaznamenává pohyb if (touch.grab_current is self): touch.ud["line"].points += [touch.x, touch.y] def on_touch_up(self, touch): # Při zvednutí prstu, porovnává s gestem v databázi if (touch.grab_current is self): g = self.simplegesture('', zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2])) g2 = self.gdb.find(g, minscore=0.80) if g2: if g2[1] == self.GSTR_SWIPE_LEFT: self.dispatch('on_swipe_left') if g2[1] == self.GSTR_SWIPE_RIGHT: self.dispatch('on_swipe_right') touch.ungrab(self) def on_swipe_left(self, *args): # Událost přejetí prstu doleva self.app.on_swipe_left() def on_swipe_right(self, *args): # Událost přejetí prstu doprava self.app.on_swipe_right()
class cGestureBoard(cTouchRectangle): """ base class for recording gestures """ def __init__(self, **kwargs): super(cGestureBoard, self).__init__(**kwargs) self.gdb = GestureDatabase() def on_touch_down(self, touch): #self.DrawStandardGestures() # start collecting points in touch.ud # create a line to display the points if not self.collide_point(touch.x, touch.y): return False touch.grab(self) userdata = touch.ud with self.canvas: Color(1, 1, 0) d = 10. Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d)) userdata['line'] = Line(points=(touch.x, touch.y)) return True def on_touch_move(self, touch): if touch.grab_current is not self: return # store points of the touch movement try: touch.ud['line'].points += [touch.x, touch.y] return True except KeyError: pass return True def on_touch_up(self, touch): if touch.grab_current is not self: return g = simplegesture('',zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2])) # print "gesture representation:", ':',self.gdb.gesture_to_str(g) uLogName=Globals.oFnGestureLog.string oLogFile = open(uLogName, 'a') oLogFile.write('Gesturecode:'+self.gdb.gesture_to_str(g)+'\n') oLogFile.close() return True
class cGestureBoard(cTouchRectangle): ''' base class for recording gestures ''' def __init__(self, **kwargs): super(cGestureBoard, self).__init__(**kwargs) self.gdb = GestureDatabase() def on_touch_down(self, touch): #self.DrawStandardGestures() # start collecting points in touch.ud # create a line to display the points if not self.collide_point(touch.x, touch.y): return False touch.grab(self) userdata = touch.ud with self.canvas: Color(1, 1, 0) d = 10. Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d)) userdata['line'] = Line(points=(touch.x, touch.y)) return True def on_touch_move(self, touch): if touch.grab_current is not self: return # store points of the touch movement try: touch.ud['line'].points += [touch.x, touch.y] return True except KeyError: pass return True def on_touch_up(self, touch): if touch.grab_current is not self: return g = simplegesture('',zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2])) # print "gesture representation:", ':',self.gdb.gesture_to_str(g) uLogName=oORCA.uGestureLogName oLogFile = open(uLogName, 'a') oLogFile.write('Gesturecode:'+self.gdb.gesture_to_str(g)+'\n') oLogFile.close() return True
class GestureBoard(Widget): def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() self.gdb.add_gesture(check) def on_touch_down(self, touch): userdata = touch.ud with self.canvas: Color(1, 1, 0) d = 30.0 Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d))userdata['line'] = Line(points=(touch.x, touch.y)) return True def on_touch_move(self, touch): try: touch.ud['line'].points += [touch.x, touch.y] return True except (KeyError) as e: pass def on_touch_up(self, touch): g = simplegesture('',list(zip(touch.ud['line'].points[::2],touch.ud['line'].points[1::2])))
def __init__(self, *args, **kwargs): super(DrawingSpace, self).__init__() self.gdb = GestureDatabase() self.line45 = self.gdb.str_to_gesture(line45_str) self.circle = self.gdb.str_to_gesture(circle_str) self.cross = self.gdb.str_to_gesture(cross_str) self.line135 = self.line45.rotate(90) self.line225 = self.line45.rotate(180) self.line315 = self.line45.rotate(270) self.gdb.add_gesture(self.line45) self.gdb.add_gesture(self.line135) self.gdb.add_gesture(self.line225) self.gdb.add_gesture(self.line315) self.gdb.add_gesture(self.circle) self.gdb.add_gesture(self.cross)
def __init__(self, **kwargs): super(AppView, self).__init__(**kwargs) #internal variables self.touches2 = {} self.last_touch_id = -1 #self.translation_allowed = False self.gesture_found = False self.position_left = True self.anim = False #currently animated self.set_texture('style/bar/slider-fond.png') #add gestures self.gdb = GestureDatabase() self.create_gesture( [(0,0),(10,0)] ) self.create_gesture( [(0,0),(-10,0)] )
from kivy.gesture import Gesture, GestureDatabase # Create a gesture g = Gesture() g.add_stroke(point_list=[(1, 1), (3, 4), (2, 1)]) g.normalize() g.name = "triangle" # Add it to database gdb = GestureDatabase() gdb.add_gesture(g) # And for the next gesture, try to find a match! g2 = Gesture() g2.add_stroke(point_list=[(1, 1), (3, 4), (2, 1)]) g2.normalize() print gdb.find(g2).name # will print "triangle"
from kivy.app import App from kivy.uix.widget import Widget from kivy.uix.button import Button from kivy.graphics import Color, Ellipse, Line from kivy.gesture import Gesture, GestureDatabase gdb = GestureDatabase() check =\ gdb.str_to_gesture('eNq1l0tuI0cMhvd9EXsTofgmL6BsA/gAgcYWb\GMmtmBpksztwyY1kgZI0rNpbdr+u+pjkX+9+v718+uf3zbP++Pp68d++v\X8PIzp/ukA08Pd2+6P/d10wPwzHzQdH+6Op4/3z/tj/svT/ZeDTPf/Cnm\oZtNBZ5Rl/8P769tp7uZzt/iPbr/NraYD9AjmIXzLLoDTdmxgBLsSMMIw\5OHzcP6eX9O0/WVsCMFGmCuaGgjBdPy0+/8wXGFkeu4Ig7LzgISbMw/j6\fh8hmMMBDIkdBYPimV4pQ7W8EQMUA4LMhMzCyW5watKgJoOHhxsuIz3ws\cVb8ExhpIxDoIgvcEzhoaiZ1geA20Rj+UAwlp4LDxd8OkqO4KHYXLI4oY\OwEai4oPRmHiZXr6iXOiY9mXBFUNYacAVDm4uIOCiaXws24plK9oq7PIU\r56iOqsyg+acyOrezJicpTCI3YYy5HtapFNZSldLCcRgCCk4hqniDZ2dH\ZjCMf1EXh47laNEN2MfEjkzJFgtK3BLHwEAGTcnlSu7LNPLUbo6+n2m5G\bAuVzUr/ShYQzoSBSWi5iXJwyVqWRr4ctX+om1mq+GR7ibAA8dJuHLfC5\nGVbjl7dMS/tk1g3tB3OXZyWXsyyrsMtWtlXY5SnHGmwpPwW+s3M15h5C\kVvM8FyWcWH3Uce5io00A/8Eu7wUWoVdXoqswi4v5eIlseTWl6e9Cqh6+\IUt6OoUwAJD88KwjC4rJVZAazmpsAa6jFRaA10+qqyBLht1DRu1bNQ1bL\Sy0S425mWFOc9khtxcnRwuaEW6PZnH8sFp5aPRKuwy0i5GMnsmHJE32dz\73a5oG3nJgLyemqDgXKtPu/m2//ix379d7u6m8+XdbLrf5jg2Y9picD5O\B/NpN4vQIrYYLWKJHiX6aJFblBahRSvRvEUsETuQjRapxe6uHSjPsBK7u\0CL0mKUyLKJ25/NLbRaUI+PzwGsRdHnVUzsftj7JFdK\7cAUSrW3SugrdpReeqdluV6Fxdu6hdv6hcCeYabQl7KFG5ElWpiM6itqg\tWovWorXYlU6/d234y/71+eWUVud1dRvz2xT/en06vcwfWiP7QFU51dP7\l/3H7u1xX2+gP9F+/MHc7jw1fz98vD99fTxV65yN6YfP81jE8nDMa8j81\bD5B2R9zCo=') def simplegesture(name, point_list): g = Gesture() g.add_stroke(point_list) g.normalize() g.name = name return g class GestureBoard(Widget): def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() self.gdb.add_gesture(check) def on_touch_down(self, touch): userdata = touch.ud with self.canvas: Color(1, 1, 0) d = 30.0 Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(d, d))userdata['line'] = Line(points=(touch.x, touch.y))
from kivy.gesture import GestureDatabase gdb = GestureDatabase() check = gdb.str_to_gesture( b'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' )
#!/usr/bin/env python from kivy.gesture import GestureDatabase gdb = GestureDatabase() square1 = \ gdb.str_to_gesture('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') square2 = \ gdb.str_to_gesture('eNqlWkuOHLkR3ddFRhsLZHzJC8hbAzqAIY8akjBjqSH12J7bO5IRVZ2RlcwsjHrT0quXj/FjZJBdb7789uU/f7799PTj5Y/vT5e/x+/ncnnz8ble3v/y9cO/n365PIP9037h5cf7X368fP/229MP+y9d3vz+zJc3uyLvB+3yLIuU2vPP3758fVkea8tjffLYPxbW5bm6BYsJf9ojFS7vylvUqg2gIBbsRLBY87/lU7y8+1t5awgSS1dthbTL5ce/PhwvQmMRvnxyfWDopZZmQtDsP5cfn/6y9HC76lW6MvXeehOGoqD4M9JtSPertMVCKllsKkqttbWVNrZGvXaChl2586k4jLhDdXGTKMqqBcxKalyQ6afUYajjTb0qipr/ULlIqYA/pT7SCXxTB+WipZNZ3aGA/pT4SCjoTRwVumKhSlyxFFmJW6gEaytG6ALn0iOh0B+Qxtq7NMsJFWis9VQbRz6xPqANxYRNHrmSEi+5OBMf6UR8QLzWUq3ChaWCkOIDlo9sIj8gXky7CbAC1IKtW5M4lx/5xNN8uumlNiYRtb3bz6VHPrGfS0O1KkQSLNyk2cen2jTySfVce2mSrbJSJ9GO59mkkU3Cc2krcG1apaNVSVM9lx65JD6Xtg4s1uJ1WcI27QNWjzySrjZ9Y1EiLcS6ViYUk24NEK3Z0LnySCP1VbOyOuOGVsVUbGu/SiNaAar9EPYHOjiPJPKqybJ1/gqAIJ0a0EoaxErPOrC1Mnt/nNc1jywy3t4OYMLWj8xjsQ5L+hPSI4t8e11WInuSVApWqLY7VtIgpmitncleGw9EZGSRb69LCwFZ/loxETTtlXS1tg0qaO+l3uC8j/BII99el5b8ZgZbGcBSYJVW0vYaFpBigbECP689GXmUepNeioCtB1kRd66gf33HyEij3NKIy6aoWtG2Mlkret3mdcmdZdeq3YaWB5RHFoVPlcESUGwjdWt6ltxHpEcWRU+ll7RW60lq/Y+Zz/eijCRKP1Ee7wJewiDFPmaCR15jOtKo9Vy8GqqlWTwKWxM4t1tHGhXPpZcJaGmKxX5ZDT3wgtSRSF0lktUaXLUy6J1v7WnptjZhidVHsw9Qovctk/yv35+evt7mcpVlMLfifPPOrHzb1z96eUdEb8vl5Vnb5cOMAc7oUwZKxsjorczpZQi2OmWAL2lv/BmjsjNwzohVaMoo7nrjGcP6vjNkzghLdcpozcp39SMLvc3pITiNtvWjwegR4MVEAz0evSbQQ9BhDYo4iAms9xnstGZwrMoJRAdlDZIHrWsCw76WQLgPTe9rBvqqtSRnkQNN3iIEmtyFq0LyF/h+5VqSw1DuQ1JLct+KcIeSglEplk/RKH3vwRSbIvFgikfxgNv0ukIhytTOiQmNpSsktAa6jge0iFKlhEacKyf0aoMk9Kq7dhT0allLqAbaExqrQfJNwwtIvmnYAMk3DRsg+Ra7wAamNSphGSTfJOIAyTfZ6W/LILCmXI1PjgruPdg3lPEgJq8lahmT1xKeYPKawxNMXnPEGJPXvKl7HJQUAo6AYwoBw7YRLRTdUHa0Uzw4EoQpBEvDuHuQUjxIdpanuqHsqKRIRROqlCJFuKc9fW1M+HzE3zFM5vzIPemcUvZMaEd8l5y+VQCjirjMKVFSXOeU6FoMc8peCTLO+VGPfMvIkjTcq0fmDWVnIUmUqEeeh/pG8egi5gc9oCO+r6h4DKll1MNm+2u6iHjYJC8iHhzdoB6PtlnaQ9Cyf+Jed86oe917RoejWDbc7mh2SYejWGtGq6NZQcHRvJoO32yWzSg5uuEO33CTAhVHN9zhG9KG675tEuOTLY7G94r6AIuS4+tDK0r2zQdV1BwHH059NFuh7tsmbz6EYpOMum9jyFyh7lvPOfaZkkr22OdI2uTNZ0eqmevDI9Ws69Ojj+QrFB3d6A7fCDdcdnTDHb7RJkM+NRLlbPrYSLzhum+c7AUfFUkgo+6b3M19K4o7Khs5dzSnFnxUJKWMuqMqGXVHtWXUHc1lAD4DUtvouqNN5sb7QEg2x20GjhXFQ5CLCXw6pNwawKdD6u1gxRECLjkwPipyrkLwUZELH1inTun5wREPXhrM1I7ulOyWD5GcKxx8iLyhO+8Q8InyRunxIE7t2Hu9A9DVmzuH96YdAJ7yeddKmfN3zpsAOuXH5Ao+uV4TEEMz+LDK0T9icAcfVrno+kAAPqze0AidD6sc75N+VcAVej3WAFJCW6C8RuPkDyhrNG4MADWhEmhbo3jl9oTKTtyorCl751WgmiixIoXXdD0S350DgHBN4XCLKKF9b0VeU+IAASQJjTiTrlGte3ItUSge7AltOw5wWVPiAAhcE0p7D6bg7F2QAKfg9KhGTsHp4TmneHTeWzEFp0dh8To4VMqeHW3Vz6jUPe2eKJFHKQmNdEhNaGwRgWsr3e5OqnsZE5zzd06cIDTnX83lOUX3TJApHyJZonMK7km2OX+viqTP+ZFgLVMK7lzvgNY5n3ZM1nni4iQEOs8VXq2cp4diU+k8PRS7QOcZiTte0HlG4mgMOk8C7TVIn53JzxD7FB+kycfVCSVGEzyg+JzSjlR8aBk3qDMKrSa0CcWHOLnrvDO+j3f3Vz0zvg9+fBSxGHf5gBKzb51TYsin8DU6UAz5BBmF64h+78SV4tFFOqCsx/9XlFdHhVfUwwaUUQ9O3XDb6rjyisbRRtcoxvhfakb92NY5o35say2jfmxrGwU/till1I9tsrFBVkfHV9SPbYwZjSOpZNSPpJRt8CHfr79XqPuGeTWf6xGyZTWO2xtd961uuO5bzR77KB9H/lfUfdvkosZVQva4xlVCtjdufXtWiFvfnhXi1rdvFPyapOVIxq1vu3lx1/UxroAbHlD8AuW1JnYofpui/YDid0jaDih+oaQyp8RNsR54FNfGCgcUj6EeeBQXynJgbtwuCx9QPLpyZItH93W/7FA8uqwHlHa9X5tTPLp8YEvcO/OBLXHvTLo9yM34Hmo6yGncSBM/Kulxvz97zvieBDpyXFZXmROKJwEPSjwuofGgZuISGg/CEZfQeFBWcQmNB9mOS2g82NfLMcP/bP756cunzy/L12F5ORXXuz/5GOe/Xz6+fB4UvkSjMfTl2+9P3z98/fVpfCLjSzQLHn/g/+fz928f//jVpfXyzsxotRcbsURl+ZrN8kWat/8HT6n29Q==') square3 = \ gdb.str_to_gesture('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') square4 = \ gdb.str_to_gesture('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') square5 = \ gdb.str_to_gesture('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') square6 = \ gdb.str_to_gesture('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') square7 = \ gdb.str_to_gesture('eNqlWttyVbkRfT8/Ai9xSX2VfsB5TRUfkCLgAmom4AJPkvn7aKt776O2tXU84BdgeZ0l9Wqp1dLh7Zffvvznz7tPDz+e/vj+cPm7//mYLm8/PubLuzdf3//74c3lEdpf2x94+fHuzY+n799+e/jR/kmXt78/8uXtVORdp10eZZPS9vnHb1++Pm0fK9vH6snH/rGxLo/ZZrBN4c/2kQyX+7+lO6wKtSIjikAV2abzv+3X2H/NSRFLAuKqhKyXH/96vx6F+ih8+eQDAFcASliZiwq3eD/9tHYPPOuhnZkEMkNNtXAb+RekS5euh3TilHJNuQgWEGy/+Xlx6M5DNvGmrVVKSZUQgagkGbUxM1agrDXBa7Sha+OunUvKSTgRKkGp+SpNNUnKAlABtWXjtnRPJfAuDRWTavNbNCPXwRHSkqgiZJHCPce3pHsmQXdp2o3mZjuMmfzr0j2TUA9pluZjbhksbZm3PF+lc84JNVNLY0q0rf0b2tgTiUciqc2uNNnc1iBjHvIItWTElFBUattbt+eNPZGIt7WzilZKta1+TASvmHZPJPJt6bQl4VjcuX3wpnbPJOoN7U06S62CgG2QVnLybemeSbxmsq3pRKUtQqQMg3TbMUq1UObcFmbS27Omnki6JrKVJ2i62+7TPEiDcipFGYUYCG4L9ywS3hTGgrss1oRweztSzyJdswighRCKUBvh2DPbRgeRXJWpVRChdLuIUE8iHUlEABSubU+23djmPmiLMitqKy2QE91OIvUk0pFESHWwpB7nwU9Ic08iX8tqq6lts1duCw2ktOry89I9jYzX4yDLcNbAUfx+RrvnkXk4xbxay1a7CX7Fkp5I1uH0bSdKO99rbkcw/5LbPZF8PSHbZ3OlbX+0k71XuEMaUREUSFHqK6SlJ1LyIU3jQaM6bJt2LiKVLFrabip4e2lLz6TgK7RxS4O284K1HQ1wu4pIz6TwK7TbXBMWpvaTAHohuCXeUyn6CvG/XlqlJ1OuyWzHCF+3jyYezgRqax6Klt6YtAp7U117PjW/Rr3VbCmVSq+BBfLtjGrPqA4ZHfpLZSlDiwnSjvUE7RxuvS3j7fqtPaU6pLRvHPVtJHWYOpbcPEkZEnE7KqnndOvmP3x/ePh69OYqW3Ouenl73zbFXbrcA8hdGn/w8vSo5fJ+YNQJo44MhJeMkgKjjbKBeQQp3dXxRzcGBIZMGDgyeDY0BUa1oXkExecjI6jJQA2gGhgsKRRHlY0RLKm5f6wGF2oxcHQBExsIAbRJ1zHWdkZFN2hjjLEiWASVA2ixVo+1dBCdqQEkA8sIkjM9vGqgaeZk8XW1+3ZzczQHtDhqEWLuqJCjOKKegnYKBHTnckB3XQtsW4QNLdlRiwzR0F3BQuuBNlQdrSNa00ubW3ceKJP8tw4+UFw7w4C23n72QQwUNzFTQGX2QQ4Unc1bRkrOMxUNFJyplEDx5OcaUJ1og9vGneLLszXMAQVH3Skx1DMG+Ax9OTugQPHZAQfU0wESUF9CoAGts0jKSME9EregBBQtaqKIWtScImpRM0fUopYcUQtU+HyaaFFrDvGhRd1r2YBa1OUZ1wItHFELtJSAkgVaU0Qt0IoRtUBrdJ4s0Foj2gNtN/Hn2R4obBReUMQodUHpFmyLPgxfDI12UbeAINrFyVCKaDY02sXdAsI4GqOhL3b4QDE/8JmcWUAQUYuaos9sgfLCUbaoeeEomwUSAxCzQOLsxCzQEvafmAWFJoPsFPNjXz472i1oLU5E2dAatr50CzhTRNXQEtEeNe9Z3dFqaFTQZChHNBsay4+CoRpRNDTOQS02iFGoxYYpohbbvoZ21GJ7VgKtj2N8NprFRlHX+jXeF9OOWmxeyabV1zo2Jl5QLGrSBcUsoLqgmB9eP+cUM4fzgmJO8Sois41XEZmHvIjIWj/msqCYu7wI2tpClkXQ1iS2C82CYu7KImjrGVkWQVsHybI4iq2fPCh+sltDeWh7h2Yd5T6pWfsA1l4elElrAtZr7tFnGxESBDQ56k7lvV8ylAJKjvJofMqOyoCi9/OQNKDsaAkoOloD6jPLaUSLOJoD6gp5XBJbF/zSlIyB4hPKFNBJLwh5jBrFHcohasmzEYMFXGfawQ/eJxX8oDrRhmCOXz0AgjkEkxEhOIUyowSn0JcPBKdAZpMKTkGaUYJt2c2E4FT2hQXBnLTHGMxJvlhw9AOqc3H0A8rMSIRA8QwgBtQtwNGC/RYMyAHduWOgINVRDeg+zRJQX9NYA+qBUgiUfQ4UAmXfrxRimz0LAIVAny817RQaKvL0+QGIA8VNJAkozobXQNljLCOKOhuxBoobySmgs4A5D0cQoC8160J3FGY2WEt6ULzMMQVUZiNyoLg5LAHF2YgaKL6wuAQ0zT5Yn1FeTkrGk7gVHNOWYE6eGS/ulCwo7hQsKN7arAbioc06oXjfVxcUHVrDE0oZ+s8TSh0a4jnF++C8mK43xUkXFBg6+hOKXwUWCbDemeoiAdZIz+4cJ3y7QZW0kLTrlK4mZtcpXU2sDhenOaWk4cZ1QrGLFi9WhvXoZB3tCcWs5kXQ1qP7zfKEMl5JTygy3GWP3WhtOe1rd0fNQ0wR9Yu4BLSOF/Er6hdxiKj5AVHXGmm/9l9R2p8IXq6enWJR52eDnD4/XCkWdYpeWLs8e9qY1zdrpGevJVM+Wlfd3yJPKf6EowuKv+fQguKPO7Cg2JNWqQsKDw9SJxR73yqrgeyxS+vpUYL+OOybek6xZzDFc4q/FNsL3AnF3JXFXPzZWMqC4m+Ei+nm8cHwhGLuCi0o5q7AeDajPxt7N3Wg5qEXowM121gD6o/DXpUO1J9JKaL+TIoRNQs4743Fy7z747DXtTnFLKC6oJgFpAuK+eHVcU4xc4gXlDo8Hc8p++syLijmoZfhOcUMpYV1/ghNC+v8RRoX1vmLNJ43f+jP06gLyvhCf0Ipw7cKJ5Q6fCk0p/iTNsKC0ty1r1c/P3z59Plp+6+T7frRCviLJrxx/vvl49PnTsGtCd+caujTt98fvr//+uGh/4b69/Ib7l8F//Px+7ePf3wwab7ct0t+kba2WjtRSuG6fTV993+wJ5Bl') square8 = \ gdb.str_to_gesture('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') squares=[square1,square2,square3,square4,square5,square6,square7,square8]
class QueueViewManager(ScreenManager): origin = ObjectProperty() manager = ObjectProperty() #screens = ListProperty([]) index = NumericProperty() loop = BooleanProperty(False) def __init__(self, *args, **kwargs): super(QueueViewManager, self).__init__() #Initial values self.index = 0 #Create gesture database self.gdb = GestureDatabase() #Add gestures self.gdb.add_gesture(swipe_left) self.gdb.add_gesture(swipe_right) self.gesture_tolerence = 0.70 # minimum score that a gesture must reach before actions can be triggered def getScreenNameByIndex(self, index): return str(self.screens[index].name) ''' def getNext(self): nextIndex = self.index + 1 if (self.loop == False): # if nextIndex would fall outside the scope of the screens list return None if nextIndex > (len(self.screens)-1): return None # otherwise return the widget associated with nextIndex else: return self.screens[nextIndex] else: # if loop is True return the widget no matter what if nextIndex > (len(self.screens)-1): nextIndex = nextIndex - (len(self.screens)-1) return self.screens[nextIndex] def getPrev(self): prevIndex = self.index - 1 if (self.loop == False) and (prevIndex < 0): return None else: return self.screens[prevIndex] next = AliasProperty(getNext, bind=['index']) prev = AliasProperty(getPrev, bind=['index']) ''' def isGesture(self, question, gesture): if question.get_score(gesture) > self.gesture_tolerence: return True else: return False def on_touch_down(self, touch): # create the 'line' key in the touch object, this data is made available # to all other functions that recive this touch object touch.ud['line'] = Line(points=(touch.x, touch.y)) super(QueueViewManager, self).on_touch_down(touch) def on_touch_move(self, touch): # append the newist coordinate data to the point list of the line try: touch.ud['line'].points += (touch.x, touch.y) return True except KeyError: pass super(QueueViewManager, self).on_touch_move(touch) def on_touch_up(self, touch): try: g = simplegesture( '', list( zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2]))) Logger.info('Swipe Left: {}'.format(g.get_score(swipe_left))) Logger.info('Swipe Right: {}'.format(g.get_score(swipe_right))) if self.isGesture(g, swipe_left): Logger.info("Gesture: gesture is a left swipe") self.gotoScreenRight() # A left swipe should goto the right hand # screen, because the act of dragging # somthing to the left exposes the right # hand side of the object and vice versa. if self.isGesture(g, swipe_right): Logger.info("Gesture: gesture is a right swipe") self.gotoScreenLeft() except KeyError: pass super(QueueViewManager, self).on_touch_up(touch) def on_index(self, widget, index): Logger.info('QueueViewManager: next: {}'.format(self.next)) Logger.info("QueueViewManager: index: {}".format(index)) Logger.info('QueueViewManager: prev: {}'.format(self.prev)) self.current = self.getScreenNameByIndex(index) def gotoScreenLeft(self): # only attempt to change the index if self.screens is not empty self.transition.direction = 'right' ''' if self.screens != []: self.index -= 1 ''' self.current = self.previous() def gotoScreenRight(self): # only attempt to change the index if self.screens is not empty self.transition.direction = 'left' ''' if self.screens != []: self.index += 1 ''' self.current = self.next() def addPostViewScreen(self, post): newName = str(post['id']) if not newName in self.screen_names: Logger.info( "QueueViewManager: I added post {id} by {artist}".format( id=post['id'], artist=post['artist'])) widget = PostView(origin=self.origin, coordinator=self.manager, name=newName) self.add_widget(widget) widget.metadata = post Logger.info(widget.name) #self.screens.append(widget) #widget.bind(origin=self.origin) else: Logger.info("QueueViewManager: I rejected the duplicate entry")
class GesturePad(Widget): minimum_x_distance = NumericProperty(0.0) minimum_y_distance = NumericProperty(0.0) def __init__(self, **kwargs): self.register_event_type('on_left') self.register_event_type('on_right') self.gdb = GestureDatabase() self.gdb.add_gesture(left) self.gdb.add_gesture(right) super().__init__(**kwargs) def simple_gesture(self, name, point_list): g = Gesture() g.add_stroke(point_list) g.normalize() g.name = name return g def on_touch_down(self, touch): touch.ud['start'] = (touch.x, touch.y) touch.ud['line'] = Line(points=(touch.x, touch.y)) return super().on_touch_down(touch) def on_touch_move(self, touch): try: touch.ud['line'].points += [touch.x, touch.y] except (KeyError) as e: pass return super().on_touch_move(touch) def on_touch_up(self, touch): if 'start' in touch.ud: if math.fabs(touch.x - touch.ud['start'][0]) <= self.minimum_x_distance: return super().on_touch_up(touch) if math.fabs(touch.y - touch.ud['start'][1]) <= self.minimum_y_distance: return super().on_touch_up(touch) else: return super().on_touch_up(touch) g = self.simple_gesture( '', list( zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2]))) # print("gesture representation:", self.gdb.gesture_to_str(g)) # print("left:", g.get_score(left)) # print("right:", g.get_score(right)) g2 = self.gdb.find(g, minscore=0.70) if g2: if g2[1] == left: self.dispatch('on_left') if g2[1] == right: self.dispatch('on_right') return super().on_touch_up(touch) def on_left(self, *args): pass def on_right(self, *args): pass
gesture_strings = { 'left_to_right_line': 'eNq1WMtSI0cQvM+PwMVE17vrB9irI/gABwYFELsGBWht79+7p0qPHoE044NExAhyslPVmdU9La5fvr/8/evmafWx+fm+Gr5t39dluH5cw3B39Xr/1+pqWGP7tb3R8HF39bF5f/u++mh/8nD9Yy3D9Zcid0Eb1jpKWRu/fnt53YzD6jjMTwz7fWQNa8gKxhJ+tSGAw+1v5aZocUexWtkNodpYz7/jfYr7Sk6ExZWNXajd/vP+/MdwfIwMT6c/4WknXqComhcSlMILxGPqYEvERUphpdpQR3KeF68h7ovEkYUUrEIxLVpnxTHcR1gizrXuqm7ew7w2hjYdtEWqF6FaiMgFVDpxNHHjgnnVeV8wEkW5lHxkil2mUnauWLNWKx/kqf7PdsQIFbtQuUhlBsmrQidOlQC07q7ztVOkSnAh9ciVulxJuCIZm9ZSvQnv1bEaOmAtwJWR5puGIlWSy4hHptRlimjdj7h26lgPK2nBUqKIlPwi4hyJcpcooLQpOxRnhdbUnTio9dvjEvmIlOlS8hEqd6EWYwSQglbRqXCXKiDkKkqDfD5Wjli5i7VwtTYFz+ukaYqJiEpVtNL6B+b7nSNY9gvJS0Qr22hHdcn9yzQyEO/U0Q+PjsZa4L1EtEJ7+X3dcbVugy+lybaP39aPbeueVY9kRQ7q4yLdb8JsuJUfa4eudHCXefUIVmyvjkX50DtOclBnZyYGii3Bqs6LR6ziB/FDv6u2ZckH8XpwpVT1+f1dI1SFBeIAtXt0KMybrhGp0hJxnmzvNu+5RqIqS8Qra79U53tdI1C1BeIIBcTUt7HygsojUF0SKHad2Lznec8tAjVY0Oho00af1448bXaJtof1ZGtckKZFmiYLpAm1O/WGI+N3gIf31ep1f6I3HY/0bdj1LRDclOGWRG68f/GwWVsd7kcGnmZ4Mvwko5ZgsJ5mQDDarZMMDIae0aBg2BkGB8PLaYaMjLbXJ6O2twZqgJgT1JKgBcgN7F80MjgZ4RzqdpgmGGahp50G09HaGB5mEeQ0TGKYhz9EWZfZF8PCnxZ4MrJyD0tIKcAKCYYLZOlCxQQlwZogf7bGw4XxVjByOh4u0NbRagnWBGUCeoLpRq2fZwAlZs4FzlBgRzmq7xQfk09nJCkpcobCSbEzlPCv7W5J8Zhz++4ZKJYpaonWKRquMR0peKJTLqRTzMeVdJR0in06MP0QnqJpgRxxc9ateT57vaPkrPWoupy1wRTNWRudqTktsKPq0gKTCYppwXa1f5kJwo6yrFkwzallKT9tq7Xvc8C0za1fJ+0MPqKy67Iv1hdg2CaAZyiWFNtRUjtsk12X7VBPFCYolURxikKiNEWbH/noeF69PD1v4n824wb3KcJG+eflcfMcjNGv2N8aunn7sXq/f31YxR2Jo8aIbx9xf6zf3x5/PqTy2AntINKeiuztyAraHvXjOeTmPyTQtjs=', 'right_to_left_line': 'eNq1WMty4zYQvPNHrMuqMC8M8APea6r8ASnHZtmq3dgqWZtk/z6DASWStijwIl5kjhqNQfcAGHmz+7H75/f2pf84/jr03ffhcx+6zfMeuoe7t8e/+7tuj/anfVD38XD3cTy8/+g/7JW7zc+9dJuLJA8O6/axUKmN37/v3o5lWCrD8sKwPwqq20PNoKTw24YAdvffwjZA5BgwJ2UEUkUuCf1XANTdh23ElCkk0AghRMv2r8frs7DPIt3LlQleKrdkyQCZc0wixNom95WDriKfZy5t8uTkeRU5FM7zBNgkRxcfYQ05qw7hRJE1t8nRyWkVOQcUEEVCDczQ1gXdUVzlKOVZ7im22d1S1Buxu6c49RSUiYaiQCEY2XlSi5LbnpJ7SnAbcveUJp6GTImTuxaQo+iZHDPEyaPcZndPaeJp0ICRSr2ZxDHlUXWksRZd/ja7e0p6I3b3lAZPeZuBBDEA2n40ZfpvQc7skM5ulL2a20cMu6kMN2J3V3lwtQjDGiNArJOksWBswvMmtR1L7Yph95Rl5M6cSlacGG0f4Zh4mDDbWSDtQ4DdUtbbkLujnM/kwBisZlJ0YVRGWUJ5G4WxHdFkF3dU4Ebs7qiMjkIUSRIzJKRs5xgN7H4+KGaRQbQo7fNL3FORVewRIdRvUs7Ull3cU9FV5Dl7zsMCsF3q4qZKvg17dFMjrGEHwsHrso9lxW0d3dS4ylSIg+Dq6q9hd1PjKlPt0oAJf0xtdnc1arPcjR35dLpJ+b5dMtFNjRNTIVkPkVKQQDCjFp2J3qRWd1RHR4OCXXNDRWcuwp7Jp9SauL1N1R3VycGLHKxxG7LMdmWd2WluaWg3veqOqrQvjULPw/6v1e6il98AT4e+fzt39BpLS6/abe4NuA3dPbF9TJ/YHfeauseCgGVEdkTURUQKFUHLCHCEpGUEVsQVDnIE8zKCHUGyjBBH4LIe1hMWRLiSqRaEtWDLCNdU9EqmrqlIqAja5unDhsiuqWCuiLIkC7qMEuQz3hCxIlxGu1nrsFyDrpx1jR4UqEEXiyl+zs4QVBEuFkM1XoYUXB/K6RT8mrnrQ5qXEa4PDfVyEeH61PwvI6xpcgjxFYjLRUhXIK4XAV6BuHoUaCoDBJcPc6xR/uoxBKkQuAJxNe00qhAcuLVGeR5NNYrzaK7RMItCmEVhiLoeqHkexRpN8yjVKJ8K6aswUCU4HR0XIVWCmKblaN1qjco8WlcdYR6tq5ZPDHXVpulsTp1AsEogOBuIVYLTxjtFqwTldfrQFELLkHTBWazi8JD3RYiJU4/u13738nr0/6nY/oP5cZDKz9SHu393z8dXh9gqGYsvFj2+/+wPj29PvX+TvPEv8eGa+XN/eH/+9VSpsyVivQyj1YUSkV1f3uRt/wdC4ZmI', 'bottom_to_top_line': 'eNq1mN1u40YMhe/1IslNDf4OyRfw3hbIAxRpYiTBbhMj9rbdty81I0t2YtWLFewbO6PDbyieEWeU25evL3//WD1tdvvv75vuy/C9he72cYvd3c3r/V+bm25L+TO/uNvd3ez2729fN7v8U7rbb1vtbs9C7qqs25YeZRm/fXt53fdh3ofFTNjvvarbYsugT+FHhiB1699gVRAIUQGYQUrUdP7tL3O3hhWwADuzCIuHWXS7P+//fxaps2j3NEygBu5a1AqzC2C3e/pldr1xtIlNbgpOBY2xaCxhe2XHyBZVQ0N0BoswXsCmWnnCq7Cpsnlkc/GShS6lEBUQXASvZpJeB17dJLsOvNpJk52UK4TJxYsomPrEzkEC1hJQHMxML8K5+sl4HXg1lPk68GooT4YSnK7Eo5oTORBbsHlKwn+CXh1luxK9WsqTpcgqQRxBef/GoRM9O1opQsJEyo5OF+lSPRW8Er2aKnwlenVVJlfBrWdGtnZHCJeJDrmYQtQh233+LnKZXl2VyVXQPtJIQSK7u8pR8od9hEph9fTXLvOrrzL5ClkWL+ZIFJypHvD9JSAxVwwJy26RD8XldaPVWZ2cBYgsUIA4ZTxmWzme4HRP6ZfsJX71Vgdv+/SPFraZl+P8040smKt5OKHQT+CruaojPstK5qSa9SHLLrqIXs1VG+nZXANMsrhJQj+hs6GI5ebFnk06K3qRXq3VONCx7dMebf8jX0Qv1diCI12P9gjVXLGL6NXWMtqKeYABZeXSDkwLc6+ultHV3PFyyaO2viBL6dXVMrpKalYy79wiIk2lZa6W6moZXSXPQMnnKR+XwHzyF9Gtumqjq6f9ajwr/SK8mmqjqcyRlTfAwGKES1OvptpoKhcs2cmQgLLjIF1ckP2rwMP7ZvM6Huyt9Cd7s+52LRh9f50+pVuj4Aq6/da8u59TSFPErEJlFccfS7nDrNygAh1nFVGaguYUWfMzU3KTWwavs/1+jEqFNIV+Brq2KbUpPgWvGeJ0SunlpcrB+yn5Y1JVYU1Rk8oXmDOKVnrQj5fWLHxGHgd5D9RmX8DJYLuXaAUGaYPeBul4MIv0aYJoZQRuimhhcjxoZ24jWuUAP9+GNzujzCqCm8LmFALw2c7weXk5I49ZObb5EWBWQjhIcFbCMEhoXhKDhGcleqDIrKQccpmtudiBUuYlh1zmq+4ySOYr7TZI5qsbQ7o4X90YKJjVbX3sefPy9Lzv/5HQ98J8SUlBDv/z8rh/rqPct5ITlxGll+zfvm3e718fNlUmde/tx4ee+8f2/e3x+0NDaz76K8++nbOA5w4RUU+0q/8AAJ5q8g==' } from kivy.uix.boxlayout import BoxLayout # BEGIN GESTURE_DB from kivy.gesture import GestureDatabase gestures = GestureDatabase() for name, gesture_string in gesture_strings.items(): gesture = gestures.str_to_gesture(gesture_string) gesture.name = name gestures.add_gesture(gesture) # END GESTURE_DB # BEGIN GESTUREBOX class GestureBox(BoxLayout): def on_touch_down(self, touch): touch.ud['gesture_path'] = [(touch.x, touch.y)] super(GestureBox, self).on_touch_down(touch) def on_touch_move(self, touch): touch.ud['gesture_path'].append((touch.x, touch.y)) super(GestureBox, self).on_touch_move(touch) def on_touch_up(self, touch): print(touch.ud['gesture_path']) super(GestureBox, self).on_touch_up(touch)
#!/usr/bin/env python from kivy.gesture import GestureDatabase gdb = GestureDatabase() vertical = \ gdb.str_to_gesture('eNq1l8ty2jAUhvd6kbApI52rzgvQbWd4gA5JPIRJCh4gbfP2lY4dbGbasmDkBYafo0+Xz8JmsXvd/fxYbrvT+f3Yha/juY9h8dynsH7Yb350D6GH8racMJzWD6fz8fDancpHCou3nsPir5C1l4VeKkpL+/6w259rs1yb2T+afatVoU/DCOoQPkqTBGEVlyKJ1NhSRlEkq6P5Xb/FsPoSlzEJ5yQIwhglxajh9Lj5fzfk3XDYDj2wqESIFAdOAWwvcCCbjtL9bbhPPWkbeHa4NYGDrz6kTzhFQl9yMcyqTDN6jMCcPrtOyHgbD47HVniXCtwK71pBW+FdLFgjPLpavKgFBIvTrim9D/hKxzxuJQDihPk23MUitoG7VuQ2cJeK2gbuStGawMmF0kVoFBOCzJqGV7gL7kIJ28BdKHEbuAslbQN3oWRN4OxCeRRatznRnA5R7sK7UsZWeJfK3ArvWllb4V0s2wVfGvF0V2W8a6uKm5XUiO5iBRvR3atMXiHq/EesPEPdQ3etoo3oblUmq8CS6710vHfqXdeMulVNjehuVSerkI1ptjR3wV2qTlIxURwBlE3tBrz+G3g6dt3+8mxfJlse7lXDYoXKyxhWpFhO515z2Eyh8NLmB9UKGyrEKzh6sxyH0DxMY5g8zPXTCiUPIcxDGEOch3FsTrMQVIeQ56GMlTIPaWTqVThW5nmINIR2FcL1nLVUWLyqSN7M5tMDsPqgNx1YK+CqYhiXlbkOUl663fblXHSUdS0jrEte0l+75/NLDTmsxuh8eOuOm/1T/Y9nUkWnGo9Xy/f+eHh+f3KQFtDSMpGhScxUbnhl054el38AMsG4pA==') ligne = \ gdb.str_to_gesture('eNq1l81y2jAURvd6kbApo/svvQDddoYH6NDEQ5ik4AHSNm9f6QIBd0rsjby4Tr5cHck+xDKzzcvm1/t83R2Ob/sufD2f+xhmTz2E5cN29bN7CD2WH8uJwmH5cDjudy/dofzKYfbaS5j9F7L0ttBrRVkZ3+8222MdluqwfGfYt9oVejitoC7hvQwBDIsvcR4jW0KO0VQgMZPWBf2pDeQNnMgoXwpDOPxYfT4P+zwS1p9Msb7QBRDypWBJR/F+9WDT8JA053OxWJY2ik+Ozzf4aGCkEYDNTAnhyqfhIaN4dAkF0QiPjqdpeASgdFMm8N0tSjO+y0Vrxne7mFvxyfXSRL0AlpJeywS++yVqxne/JM347pcm+i3/2VHlWhKOT+CCKTebgN0wQ7sJXDFTuwncMZ8dVwQRm6YoJIrJ0C4P0PK3bKIfRbKO090wWyO66+Xchi7uVmAKHTJE0Y9C4zuLuFihRnS3KtKI7lZlklVMLHItZacepbtVyW3o6lYVGtHdqk6yevsiVcr4bVeXqtIG7k7V2sBdqU5SypQj3pRRuLlRgzZwF2qThA7fjcuuMwp3oTZJqMQEFC8FHV6/Kzzuu2778eZfBpRXf7MwWyDpPIYFgczz7cHh2FsKq5GO7B3MdztS9A7B+x1w6sj3O9A7jE4dVk4lpBpSHIbsIeogFA+FB6F6aOdZ0ym0GnKEf9dw7fBbwiiDYX4XmO02zH7hrDQI/VrZeBD65XGKg5BOIQ7Ccnknoc/dZv18LCqzhAXW7f56lCdu6fi9eTo+1wYtDVxvSAmPu9duv9o+1u+S2fyxXuPz5+57v989vT06NlWsEQOqckbkrL4Zzv8CCbHPtw==') lance = \ gdb.str_to_gesture('eNq1WMtyHDcMvM+PWJeoSDyJH1CuqfIHpBR7S1Y5kbYkOYn/PiDAnaG864wu2stKmGYT0w2AlK7uv97//f367vD88u3psPw6vo9lufp8rMvHDw+3fx0+LEfwH/0Ll+ePH55fnh6/Hp79V1qu/jzycnWR5GPAlqN0KvX1x8f7h5e+rPVl9pNlv3XUcqyZQU/huy+psNyUa+YiTaExAKKo9mz+7U9xufnFHxcytCbABMbMy/Mft/+/CcUmvNwlP5lVKs2QtKgVWZ7vBjUx4imM2mCfOl676kqNULFwo2pAaLZRI1LzlxFTNuKC+9QtqO0dqCFUh3qixrbxuq7KGzeQwlCjdFdonxyCHFdy3JiZEDfuSganpKtWk33ucBL4XbjDSlitBOvVhSAkhZrX0MpdpMpUP9j2ucNLWL0E9pza5Ocgd25ga2oKXBpbMd13E8NNXN0ErMVMWJAVW5OVuwK6KLVKw0a+yX7eGF4ivgd1WImrlVC7yiu76cZtUqwWYXekGPcne9xhJa5WVp2drBs1MGgnFahmWGG/SjCcxNXJStu4KMVtW7mxkpCqCAIWeEORUPhIq4+e6FTBjTa1UcXbnFBoaL7PHUbSaqQX1tzVGzUBNOParMQGb1CEwkhajSz6akyVrbap+a9M1qBVbfs2UthIq42FZhdLgSntAnCSmnyPfe7wkVYfS03aUYBKNBlpLVkj8zeQczjJw8k+MaBupeC5blUCqBhyiFHlVvePHA4rGd+HPMxk3sjltLoos8nUln5SjirpZcj7lcLhJ+tGPo06b3A/8dYxSCKnjvfmfEOFcxjK9i7kEobKZmgFYi1EoshoNJ+YBecO8HbeJQ9DZTO08tokXXqYyU01LkU5GfY1lzBUNkOrpZdSqlc5F5jOTJ9XGze/IfMwVDZDAVa9Xd766iJRax03tt7Db7hISDgqm6OgVCZl6kTeGo0x2Q9V2Z8tGo7q5ijYMDOH3ySL9z9Ot9H9JtIwVDdD/ZYy1ZtNVwlUP9qmG8w+d/ipm59oOg8+nS6zPhGhuGh52w3B+73+09Ph8LDe0n32+zXdL9lXN9Dkuiw3hOXa5g8tL0dty21HtECA+pcHLYKWy6BGsJUedNEiWPScq9VAYCzzN89lEEHmCDbLIEZQIYNjA4pgQOLZ+QbcEf7SgZDBJRGE5BLfZ/5IR2ggEAPBdgERKhCVHx+NxB1hicjXYIiglQy2C8sGIiTxnvvxZW6QMn2DRGgQUxpgmEG7sEwSEWKR5DtRJml8Cp4vw3M5LZU7l+wn8JRR0l7C3DKV05rBdNJSLE2xsJ1z+SmfEDtBSkRTrlZeR+EVnY5oaiTpO8KlTVIkyoxBLkFSMswdoQzuVKbWc2VqHZBQw8/KWFh4RFsWdlZoOdGFHlGbi7cVZbRmQ0WleAfqeVn6aA1IaO2QsXXNlkKKqMqIZk9By+gJm02V3QFySYLK2diSEBgLJaO5kNul7FKCognh19wakNSj5JszXIKkOCXfkewCBFKpUhMilyA1R1bmMvqhAmQ0t+8yzh8MCCZkbD/eHuhVtFza0WXLyfvlcH/35SX+zeEV4sfMj2jH/HP/+eVLQNQhUQIefXn88/B0+/DpEE9aXL96fJwRvx+fHj9/+5TU5lP3uvVrg/iRKNr/evLRf/0fgMqGqw==')
from highscore import HighScore from functools import partial from kivy.properties import (StringProperty, NumericProperty, ListProperty, BooleanProperty, ObjectProperty) import random import math from kivy.uix.behaviors import ButtonBehavior #------------------------------------- hsff = HighScore gdb = GestureDatabase() swipe_up = gdb.str_to_gesture(up_swipe) swipe_up.name = "swipe_up" swipe_down = gdb.str_to_gesture(down_swipe) swipe_down.name = "swipe_down" swipe_left = gdb.str_to_gesture(left_swipe) swipe_left.name = "swipe_left" swipe_right = gdb.str_to_gesture(right_swipe) swipe_right.name = "swipe_right" gdb.add_gesture(swipe_up) gdb.add_gesture(swipe_down) gdb.add_gesture(swipe_down) gdb.add_gesture(swipe_left) gdb.add_gesture(swipe_right) #--------------------------------------------
class GestureBoard(FloatLayout): """ Our application main widget, derived from touchtracer example, use data constructed from touches to match symboles loaded from my_gestures. """ def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() # add pre-recorded gestures to database self.gdb.add_gesture(cross) self.gdb.add_gesture(check) self.gdb.add_gesture(circle) self.gdb.add_gesture(square) def on_touch_down(self, touch): # start collecting points in touch.ud # create a line to display the points userdata = touch.ud with self.canvas: Color(1, 1, 0) d = 30. Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d)) userdata['line'] = Line(points=(touch.x, touch.y)) return True def on_touch_move(self, touch): # store points of the touch movement try: touch.ud['line'].points += [touch.x, touch.y] return True except (KeyError) as e: pass def on_touch_up(self, touch): # touch is over, display informations, and check if it matches some # known gesture. g = simplegesture('', list(zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2]))) # gestures to my_gestures.py print("gesture representation:", self.gdb.gesture_to_str(g)) # print match scores between all known gestures print("cross:", g.get_score(cross)) print("check:", g.get_score(check)) print("circle:", g.get_score(circle)) print("square:", g.get_score(square)) # use database to find the more alike gesture, if any g2 = self.gdb.find(g, minscore=0.70) print(g2) if g2: if g2[1] == circle: print("circle") if g2[1] == square: print("square") if g2[1] == check: print("check") if g2[1] == cross: print("cross") # erase the lines on the screen, this is a bit quick&dirty, since we # can have another touch event on the way... self.canvas.clear()
#!/usr/bin/env python from kivy.gesture import GestureDatabase gdb = GestureDatabase() gestures = { 'a': gdb.str_to_gesture('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'), 'e': gdb.str_to_gesture('eNq1WN1OKzcQvt8XgZsiz5/HfgF6W4kHqChEgM4pRJDT9rx9xzPOrkOWLlIFF1ky+fx5PN/8OLl8+vb018+rh93b4cfrbvq1P/dpurzfw3Rz8Xz75+5i2qP9aw+a3m4u3g6vL992b/aWp8vve5kuV0luHDbtc6NSW79/eXo+tGWlLasfLPutoaY9hAfNhZ+2BHC6/iVdSVJgLNJfpbnzT/uY4mNGJqiKWiqA5Ontj9v/3oV9F5ke+gZcU4FMmIVSBmSd3h46OVOmVAWpxOs2uZ8cdCEXHtkHbgKtjKC5aFIuuM1dnLvO3OaV+YvMpWqVKrSQQwVu0eCMUiTRJjl67BG+hhydnBZybpxQKCtxrnXgFs5zSGrF7ZCj64mLnpgXt6Fw4oXdpMDO7DnD2+wuKC6CAg25ghaCzm7kqUgpTELKwDVn2GZ3SbF+DTu5prRomk4iQyXLQk8KUkumyiJaSLbZXVTqohoDNimpqIpAsrzWhVypBC8SYCXdJndRSWbyMnBjGsJS7RxLVLRuU7uipEdqKEu8LTalzNwmRuq8LTSynejkelI9cmOZXW5tgGnhzpRrYs3gr7pd/uxqMhy5CccSIv0/1C4lz1LyaXkOXisUWULyiabFLiTPQnIeejkwL9SY65whKGm7NNmFZN2kTmxd/aiiJfhnuF1InoUkHZix0NhTJOvSxatl0ya7uJQySDlOOJshQ8MyZZeOJduVI66lzFqiRO4d28rgOaSqfWq2Vq7bHUVcTZnVhHdhKQM5WH9JwjHivMdvkbueokvNjxOo1HECvZudnwi5CypLp7XGUYcsL4PrKZfaRxsnIN7O8uyCZvgidpc0L+MTTlotppH99MaSt+dndk3zMj+hjtzWcOY6Qq5DGQltN8TsmuZlfOJJxhjd0MkTIqTjjPvEbM6uaR4vRKthsV2tu2iyyCdU22M7F9UFVfgKaldTabgijtdPzDO1vZe5jUPdjra6lLpIKQDjxF+8ptMZgc7d7vl3r7vd83xr19yu7arT5bWd8ipN13Z0exz2WqZbM2oKY7X7yfBHDVEdUckRgOeIkhqCkgQiO3EBNyK6EdNVHf+0IdAREsRUYxm5MccyzivL2BHdY8EVhDiiBCLHQUtuRqvUUzxP5ngKhAaiOXJtt/owenwYihupc3lILLXd6Ac47KtHgck9J9XTOOWG8JAwp/cf2aadAz9EQEdQIHwXK78w8mj0hxkljBBGDmNEgfL5BiyBiCgQx7JujChQOgsec145aI8Preyi7ykO9n0xDUH+AAJHcT7lgdV24D0HuOtm10DPjJrDKt0aGVXCaqqubB8ppeEhwNqOOSBeXpyO3BpWT3JrtmsLS0AicUrqC+to1SgqgCg1dVEpywodwAgR7AtxtHZZbbafWPvW0OMRPvdGYbeLiF1gE65t3WtMzkTCsnZyiFzrPSLTSuAhMg9rVDt3XyLB5LyYkfS8IdiXxcAHC+EaJBJM5divztqctWCHlHK+a8prlFGrvXMmWqOMyj3Pi4/wJkJ0+Mfd08PjwX9eaWh+l7XQfl75++n+8OgQbWc6a0kGObx8373ePt/tHFb8MtjsfTD9vn99uf9xF/tUy+sru2PWwjaGqiabozZvrv4FaZqffg=='), 'i': gdb.str_to_gesture('eNq1l9tu4zYQhu/1IvFNjTny8ALubYE8QOEmRmLsNhFsb3f37TscypIYuyujgX3j+NfwIzk/Z6is9l/2//xcv+yOp2+HXff78N1Dt3rusXt8eNv+vXvoerI/7Yu74+PD8XR4/7I72k/pVl977VZXIY8e1vWhoKKN79/3b6cyLJVh+T+G/VGiuh7rCsoSftoQpG4D6yCgIoQxpAhRy2J+lIfcbX6DNaEkypkxR4opM3XHv7a/nkR8Eu1eKl9ZYyJGyqQYwQAvZzYJK0dByUFzSsto3zbGe6CTo/MZLeEjYEJnRA0SSJMCa1hkk6ed8MxmUYaAtkZJOeYoM7hWG2rSiXQZTg7n+8DdS9L7wN1NGt2k3BAgzOBhmFEzJo7LaHeTRjcJIiGkNHga/z+Z3UsevUQMkSVkTjGqQvoM2p1kvgfafeTRR0sFBqYwuJnkE2h3kUcXQQFCAhoSLvwJG9lt5MFGA5RyOxeeALQHkFPgLFpbAsPyART3UnDEW8at1ifKDI7NrnS5oYi7KXwfuPspOsHD2MFL+ZQ2fqZjGhOGHCDdkBe3VOJIJ5pq3qwLM0tRBm69QzIv091Uyfehq3uqk6fUZmYOhw8X3xLaHdXJUUpTCdnyZ2iIw31ZbwprF4twd1QnR7k9LjA76YC1gGp7EMTlS1ndUp0stbwKjE1Aw/nAGF3GHuybWL7f1B3VPIOX63g802Fip+ZBXF54cD/D5CfrWON27UuaFo6p3dINcHc08H3g7mjQG+CkjdfLaHczxHug3cuQb0AzTyfcOgwvV1B0M+PczPF+QyDAiR2n29rewJbrPrqVkZfRQlOrtQlueFGJ7mTUG9g6lmV5XMjl3f7psNu9jW/qVlH2qm5PVxtOuoZuY1fZGuaf0J36mLrtGME52ZeJuYpSRV3n+UcsIkETwT4sYSNCFamK7GKsEyRuRLoygdQI8ogwTKAuxuAiD6xQxboDGsQ4FzFfbjyleQTkOizPREr5cl0Zmgi5BGecR/haTRyyAC5qujJsSInvjQTaqWOJqCnJ6BGMFewpcWtNxHhlWKgRuUZUV7LnR1A/LmRjb8StxiXckyXki8Nck5U9WSIXp8oi5JJhF2GNT1fiq78InjsJqc4Dg+rJk3quJtUTpnXnkypVHQg4qJ4lJWjVUFVt1VjVkXCRUStqD2H6RUhuQob9IVSVWxUb9VrurCVsa5m/7vYvr6fyr3NpBu5nm02L+b5/Pr16iBiwnLaint6/7g7bt6edP1G/b4o+tKM/+8P787enijZTtLx5WAez6ikvBlK64/pf0KAwEA=='), 'o': gdb.str_to_gesture('eNq1WNtuHDcMfd8fiV9qiBeR0g+4rwXyAYWTLBwjqb2wN23z99WQnJEmnvXsSz0ANzmmzlA8JKX1zeO3x79/3j4cX88/Xo6H3+PzlA43X05w+Pjh6f6v44fDCds/2wcdXj9+eD2/PH87vrb/8uHm+ykfbjZJPprb4SQTlbb1p+fHp/O0rEzL6oVlf0xehxN4BFMIP9sSwMNdukXKWoRnyxbOv9Ov6XD3W7pNqAy6WOLD66f791/D9pp8eIg3JIDMHDZJY3gIckCphQe7T25bB53JARJyJrepFujkmLgm6Zb2yYuR15k85YJVMayWPJAzFdFud7nRko/g3FNiCQWghCXGkb0oZO1W9+nR6GmhB6jjk7GzEyhL6nZfUjRJMS/smLIqprCCOrATq8piyxXspinqwt6EFCngtkk7kCNoqd1eQW6aYu3kK4KaZUj7uhp1P+1kqlJXlalmKui21fxQ61WQy2Kb/y65aUpdU844PDTkJWlOJN3CPrlJSl1STqOmsJTjNAJWD9EVoZukNEoK4yML+di/zeYrcm6KUlcUV9SpdG5eP/vVwqYndz1hNZ544M5F26ZmW/anC5ucTPsTwLYkWha7P17Y5OQuZ0pIqZTZapom+8KeU9LF7hcLm5y8TN1UcXxwYK5E0u0VgZuavMxc0AwlUViWXimYhLguNu9SZxMzw3IQ8eon9bCBULMstlzBbWJm2ude9hI2yT65iZmvOUETsxIN9gp2EzP3IxRpeMZRPtRPs21i7nObmrmfoLQiT3UkJ6nc7S63mJwynKDrkdoCHNhTa3dabLve7Fe5mKZyVYOmkoG02/1CFxNVhg5d7V+5DkOxrKom7w9cMVGld+h6gIB2coJS2xAPu6+pmKZSd5t/3QIs++NWTVKF/4PaxNSlQWF1zVVdqDOtnv3WVxNSe3fy0J7t4F+YhSo2VWdrMU93/c8vx+PTcnNvyrSrewvo5o6w3qbDHSO3j/Op1fP9W7A6WEawJAfBQXQQDAQ1EMptHX948kD3oMseZB5J3EOcmCcQq4cA8bbsoHum6qA46C+YWMYfmTzUPIpxteT5suIgO5g24qruYcQ0rf6VuFpKUKt7kBFXcNCJFd8SV0tJO+vNQ2DDg9wjmwerE3tKBB3EjXg8P5LMgzxp1fOTffeYN5bpyiOWlREET1qtK9ALA1Ia0URv99OGg0dmxeOqTigOO3JZJzQ2b3Su2oT67pUcxUB9x2oV4UJMqAy6+C8nNMrAatWzP6G+z5ocnd/mG63saDBAGoqyo94DKRhyoFH3v6Be61DWKA+t1VHbWztyfRcpUNsbcaAaqDrqeytzZN7c2QstzQze3RJyb1Q+oPe6eqmhbLn4rqP22Wsf0HcdXbVV2u0m4C5e27MM6CmwyNtHhIp5ROtmqLJyCf1QB5TTHF0ZXs1Jt+g8OSXGVcRBng+ruoZuVThFPi5Pwnbpcxd5x8WTY2IvkxfIkyO+EENd8uQIrVEZNO+o5yMHQ1QNRX2kNeopYF4xsKeAgpfejpH27cdd5B0XTwHFIQLBTUOld5THo2kzXewpwDweHcAynlRxdgB7CjCtlOUyNORUEo7W8VjbOlPa9xp3iVqKmDMM6FKNGVcob9HFYIjjKGLOPKJbRxDkvHLhjSxlGV9f5lB1RHUrvTmS4701lfbb10emfAxojC6Ju4IfnQobCwUG6WiebuKZQlmjY33QPHfFk0MxSPLWS2KE+qiTaCeJEerTTWI4SLQIXB5dEv2S33FZDVeJXGsahkNHPQUF1qinwO8zS3RqKfA7TwzmCbUUsFcvzQed2q45dr05NdVSwJnn6t1wUXepl3vAL4+scHks+lWSY57iVnn6xZL9XL7gAu7ypkibf/TYdM/0u+/X4+PD1/P01+V2s7wDy2CD/3n8cv5qaFvWvmv+StVczs/fjy/3T5+P5pbtSj/hcUf/8/Ty/OXHZ6eWltrbXBlrbt8iJCfU6Wvtp9v/AFOnskU='), 'u': gdb.str_to_gesture('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'), }
def getCurrentGestures(): gestures = db.query("SELECT gestures.name,gestures.description,gestures.representation\ FROM gestures,profiles,activeprofile WHERE profiles.name =\ activeprofile.name AND gestures.name = gesturename ORDER BY LOWER(gesturename)") return gestures def getCustomCommands(): return filter(lambda r: r[0] != u'(No macro)',getCommands()) def getCurrentCommands(): commands = db.query("SELECT commands.name,commands.description,commands.script\ FROM commands,profiles,activeprofile WHERE profiles.name =\ activeprofile.name AND commands.name = commandname ORDER BY LOWER(commandname)") return commands gdb = GestureDatabase() kivygestures = dict() for [name,description,representation] in getCurrentGestures(): if len(representation) < 20: # Fulhack för att känna igen multitouch. continue kivygestures.update({representation:name}) gest = gdb.str_to_gesture(representation.encode("ascii")) gdb.add_gesture(gest) def getCommand(gesture): if gesture.multitouch: return getMultitouchedCommand(gesture) g = gdb.str_to_gesture(gesture.toString()) identifiedGesture = None current_max = 0.7 # Minimum score
#!/usr/bin/env python from kivy.gesture import GestureDatabase gdb = GestureDatabase() cross = \ gdb.str_to_gesture('eNq1l9tu3DYQhu/1It6bLjicE+cFtrcF/ACBYwv2Iqkt7G7a5u1DDqlT0lZ7I2Mxsj5JP2f4kxR1OH85//X9+Npfb98uffd7Ow6hO7wM0D0+vD/92T90Q8z/5gN218eH6+3y8aW/5lPqDl8H7g7/KvLot3WDFCnNzw8f5/dbeSyVx+w/Hvuj3NUNUDMoKXzPj0DsTuGIGiRJGCOVbP4pV7E7/RaORJZMwhS1u35++v9WyFvh7rU2ENEMJI1RuLu+NnEEgyhpjEG2xb1y0H3Ek4vbKA6kEmyKEWdxWPaJsaVN8eidH2Ef8ejiOIqHdbeQLvolaLTFLxlty7ulsVlaNBKChCnmEpp+uRSSIozRBLbl3dSoe8m7rdF2kkc3FmGSB1FVphYT6qSejY2sOsXtyYRuLOIkHgEtGrZIKJP4Spk13ZG524qzrXFWLlHmfok/9UvcFndTUe8Rz8OVA7RIYXtAoluKdke3hJU42j0dQ24pwV7ybiptm1oGE+Rz4ilu9w25q8R3qQtnZ2WKd+TutpLeox4pZmt1jHlh3VR3X8nuUceFdIm4qc5uKy9mapCY339jXKb+08tjewlmN5VxH3H3lBcLcASZfzGv4osFPiVk5SnmCb6p766y7qbvvvL0Zg2GKtHGCDjPJ2FKicfI2wuNuKsCu2i7qYLzdiP3BXGLYIs1DEAo0hh1eyaJeyq8i7b7KdM26ddNXpPO7SCSTnHbSnErxXaQVndSJyeJGQOMMe+RJm1aLrk5bku7kYp7SLuPOvlI6/FHs4+87hH2Fats/p8vff8+beVVyl5etTucMA/a7kSE+XAbNHVPmcGK2ZKBsxSciTPUyqAwUmdRKouFCToDqgwLU3MWQmVUmDnD1O7jwsCfOuXFt0JxGKNDaS1rhVwhV5gqpBW0CnEJLaw0G4QKwwrGmlJaQaxw1bp5QRBsBb2iZMvczQtSWjGvx09m5uXwmnk1tNKDEGYbZli94TX0aqg1nRrE5Z3WoFdDtWyFBr0aqR2URljLqa1bbNDrsToywth69QfqGIrcaDVoPSoBqkNtbDE1Wi3iqsAtV6gesSdL0vKCalLNdqa5rjpB3vrz69utfJTmz8qTFclM/z6/3N4cSteSyvT28bW/PL0/935Ffdsd1n9Q7muT+dNw+Xj59lzFU+6WY5L8ug5qwTR/PFH5bDz+AM/6Dqo=') circle = \ gdb.str_to_gesture('eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4ByQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTze/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91Gh6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7MY3pSVxVuRMiGFJaBOcXEzqYrZtwglLEsluBdOSen7R5LiN7nISzehAwsQZwC3yfwJ3PSnP4FZ31fnNrZX/PS8uKOkCvpBiFkfSF2Sz3PpoC9wVpTqDExXKmkvYmoc274S8nRZ2RXlR1B5u5xGG1bKcK7a5rtz77ILyIihVSVzL2bb8zuB4LefsgnJ+AzjQtTuUXVBeBCVRTKSMbq1HA/u9b7DMohpWSLbPFnZFuf4/6NklzYOki57N1rzAQ8YV/HY3Ztc0L5piXR0BMqAj1GItLmELb/OeXdQ87FKB8QhIOKDXOXGzOb2BGVc1D9sUaNxJNiPM6LQkbpbS9lbKrmpeVAXluRtTTloXdDs2B95z3UYXV1UWVe2aPydutqAO6HIt7+KqCm0f7A2+Fk1JkNyiTQ+b8C6rzJdpyrkoQUlhUx6IZ61XEi8uqyzXKSODTSphAcsAjnBlz4irKvN9CjVxsXEwu2UZ9iopXcmLuqgKWwOMb2JJNoh2y284B9Q11WU6En2NFuRrFVVXVJdhN71QdDhjBIe3a/3xtg3/n54Oh4d5lFdps7zNmjd7Rt2laY9ad3V88XQ6apluW0TxiAL2Yc7qTkqjs6RwSjgxnOBOhpUTw6krJ7kz06up2D3iETUiNB7L7pT+WLZhf3hJi5CIiLyU4zENZ5SlPYWoVSNZTeGMWv25vWnqzhq1amBKYNaotcTjuUdGrSXy8+rMGbWW7E6u66SpRUStJRbgvGZDW0QUXqICjgqqjE6q4dSVM19Yrawi4MJqwUIJyTBqg5TGOpC6F1be9ON6ttdGVkB+XNA2ZYREjwFfCgmSNJKC8/JBjMbyAN0bzLjS5k3dG9RoLJJK95axY9K52KBAohGShBeCAgncdIFcABj79nJI8JHzT0L6/kg/CQk+mFd5Q/BBtKoRZNzXZz4g+MC0YhSCD+hqXWhGgCAn1dcFxWAqdV0uND1gMJWCTIyeBnRy7CtZeLl7KbxRLPaykMObXu1k+1rpIb2VL20Hm9siJFKlTiTqylu7t4SXx31o35ZW3p4zpZVXLyxNsAq5xBIFH/1syH1FCj76Hs69PSn4KHU8k2w+D5aCZ+lbhKLqGvVJF5+i6hp0yRk3WiLFWSedfepdQOMBCtyFl/GsBe5a9xO4r8axESCNh7UNo+GFVw95YB57VHuaHL0Pebwy7DYPb79IevLcex/W3n7/0dobhWI+X1buzVEoytprhcYN/OVwf/fl1H70sql+ry83CbbfxP66/3z64iF2m9sJZxjmPT3+fni6ffh08L9w/IixfkGL68PDb8enx8/fPsVSedrnnc05diDYoIA2CpbUvu7t/gFuoPx3') check = \ gdb.str_to_gesture('eNq1l0tuI0cMhvd9EXsTofgmL6BsA/gAgcYWbGMmtmBpksztwyY1kgZI0rNpbdr+u+pjkX+9+v718+uf3zbP++Pp68d++vX8PIzp/ukA08Pd2+6P/d10wPwzHzQdH+6Op4/3z/tj/svT/ZeDTPf/CnmoZtNBZ5Rl/8P769tp7uZzt/iPbr/NraYD9AjmIXzLLoDTdmxgBLsSMMIw5OHzcP6eX9O0/WVsCMFGmCuaGgjBdPy0+/8wXGFkeu4Ig7LzgISbMw/j6fh8hmMMBDIkdBYPimV4pQ7W8EQMUA4LMhMzCyW5watKgJoOHhxsuIz3wscVb8ExhpIxDoIgvcEzhoaiZ1geA20Rj+UAwlp4LDxd8OkqO4KHYXLI4oYOwEai4oPRmHiZXr6iXOiY9mXBFUNYacAVDm4uIOCiaXws24plK9oq7PIUr56iOqsyg+acyOrezJicpTCI3YYy5HtapFNZSldLCcRgCCk4hqniDZ2dHZjCMf1EXh47laNEN2MfEjkzJFgtK3BLHwEAGTcnlSu7LNPLUbo6+n2m5GbAuVzUr/ShYQzoSBSWi5iXJwyVqWRr4ctX+om1mq+GR7ibAA8dJuHLfC5nGVbjl7dMS/tk1g3tB3OXZyWXsyyrsMtWtlXY5SnHGmwpPwW+s3M15h5CkVvM8FyWcWH3Uce5io00A/8Eu7wUWoVdXoqswi4v5eIlseTWl6e9Cqh6+IUt6OoUwAJD88KwjC4rJVZAazmpsAa6jFRaA10+qqyBLht1DRu1bNQ1bLSy0S425mWFOc9khtxcnRwuaEW6PZnH8sFp5aPRKuwy0i5GMnsmHJE32dz73a5oG3nJgLyemqDgXKtPu/m2//ix379d7u6m8+XdbLrf5jg2Y9picD5OB/NpN4vQIrYYLWKJHiX6aJFblBahRSvRvEUsETuQjRapxe6uHSjPsBK7u0CL0mKUyLKJ25/NLbRaUI+PzwGsRWrxzOr0qKNy5+ydHnVUzsftj7JFdK7cAUSrW3SugrdpReeqdluV6Fxdu6hdv6hcCeYabQl7KFG5ElWpiM6itqgtWovWorXYlU6/d234y/71+eWUVud1dRvz2xT/en06vcwfWiP7QFU51dP7l/3H7u1xX2+gP9F+/MHc7jw1fz98vD99fTxV65yN6YfP81jE8nDMa8j81bD5B2R9zCo=') square = \ gdb.str_to_gesture('eNq1mEluIzcYRvd1EXsT4Z+HC6i3AXyAwG0LttEdW7DUSfr2YZHVEgk4KQGCtZH8RD4OH4eSb1++vfz1c/O0Oxx/vO+mL8v7Hqbbxz1Odzev93/ubqY9lY/ljafD3c3h+P72bXcof8p0+32v0+2HkrtabNrbrPJSf//28nqcq8VcLf+j2u9zqWmPrQdzF36WKkjTFjasKZKMaJwqGTp355/5a562v8FGREAVLIINymebDl/v/78Zqc3o9LS04EgogK6ECeSlhadFTomIHElsKqoS6/I6dPQL5JiWaSTKYMZEuS6PKs8L5DD03DB11U51+gnX7EVuGOQUgqDIxHGBnKqc1+XkJXLMyAyXUFkPlGqgpJ/irnmSr7s5kThBIhAB5RJ3jZPOcYpbiIG6elkc81Je3DL222TVzTVMPoVJggFESoEGBIJndyirWWpYRonyAnfNkk9ZQkQYghuLSlnI7tfIa5i8hDmvZFBSUwdH5ixDgKv6XvNkP+mxbDxgo1S2JIhr3DVPzpOb0IGQ3DTVhTPP8nEH+bpcaqCCJzkHOjlqpISFAp/lZMqMZqIBLnCBvCYqfJKLEqNyCgkFFNlZjt0qJaD1rS81UTknKuEGqYgRGUZdnsxlnapilrkiKafjurzmKec8Sy12KTPvTmWn5lle9mS/B2z9MJcaqOSqvC7TflRlkZZ7bM2vNVPFT/PXWJUv8ZO5hkiAQVkz5Wpat9dcVT/JXoNVv8Quoz3Wl43WZDU/x241V1vfq+UrRTFhLicyAxpecG1YTdXOqVLXP4XSRmcHCg/NIPGAcnOs22uqdk4Vx777dfaaqp2uU+jPWGdkvcpeU7X8HLvXVP10pWJKOdSFksIMSgNXyWuofrpTyyUKaewgxuCJeJW8ZuqnB6TxIATspkXGJ16r8vkHwMP7bvd6epx3m5/ny0V/uy1X4wamLaWVt+PeY7qfoQ8wG8wGvcKACjMGiDMsj/EDpApRB8gV0lhdKpSxulaoI7QKDQfoDfIAY4Cyyf4lc4lsJaSV4FotYYDzCd69bC6BfYloU5XUQ88GeYBLA9JD+6BfqX0J1VZtGThVKD72i+cS3k+NUKvWZkFbhMwfVMu+BOXYHy8lENqcaMuM2vyWp+WB2kJpoLrQNhOqI21Toa3HJAttw5c2fOKFtvGzjrSNmWikbdAAI11WMw8U23L2HCkOdBkxUk8/msyyCVsj0IeAKAP9aI5R+yJ1+mZqPXVYqPc0fjUSA82FZk9zmWNqo45hG5WfSB1lWOaCqDMwLDkTD/SXoQy0nTzPu5en52P9f4BO25jbLfTvl8fjc4VWoDZ4fPu+e79/fdjVL7we0jC+cC63nJJ/7N/fHn88NHdM29xw+VUXOp+Mzm7FcPi6+ReGcFi7') s = \ gdb.str_to_gesture('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')
class GestureBox(BoxLayout): 'GestureBox class. See module documentation for more information.' gesture_timeout = NumericProperty(200) '''Timeout allowed to trigger the :data:`gesture_distance`, in milliseconds. If the user has not moved :data:`gesture_distance` within the timeout, the gesture will be disabled, and the touch event will go to the children. :data:`gesture_timeout` is a :class:`~kivy.properties.NumericProperty`, default to 200 (milliseconds) ''' gesture_distance = NumericProperty('20dp') '''Distance to move before attempting to interpret as a gesture, in pixels. As soon as the distance has been traveled, the :class:`GestureBox` will interpret as a gesture. It is advisable that you base this value on the dpi of your target device's screen. :data:`gesture_distance` is a :class:`~kivy.properties.NumericProperty`, default to 20dp. ''' # INTERNAL USE ONLY # used internally to store a touch and # dispatch it if the touch does not turn into a gesture _touch = ObjectProperty(None, allownone=True) def __init__(self, *args, **kwargs): super(GestureBox, self).__init__(*args, **kwargs) self.gestures = GestureDatabase() self.register_event_type('on_gesture') def add_gesture(self, name, gesture_str): '''Add a recognized gesture to the database. :param name: a short identifier for the gesture. This value is passed to the on_gesture event to identify which gesture occurred. :param gesture_str: A (probably very long) string describing the gesture and suitable as input to the :meth:`GestureDatabase.str_to_gesture` method. The `examples/gestures/gesture_board.py` example is a good way to generate such gestures.''' gesture = self.gestures.str_to_gesture(gesture_str) gesture.name = name self.gestures.add_gesture(gesture) def on_touch_down(self, touch): '''(internal) When the touch down event occurs, we save it until we know for sure that a gesture is not being initiated. If a gesture is initiated we intercept all the touch and motion events. Otherwise, we release it to any child widgets.''' if not self.collide_point(*touch.pos): touch.ud[self._get_uid('cavoid')] = True return if self._touch: return super(GestureBox, self).on_touch_down(touch) self._touch = touch uid = self._get_uid() touch.grab(self) touch.ud[uid] = { 'mode': 'unknown', 'time': touch.time_start} # This will be unscheduled if we determine that a gesture is being # attempted before it is called. Clock.schedule_once(self._change_touch_mode, self.gesture_timeout / 1000.) # Start storing the gesture line in case this turns into a gesture touch.ud['gesture_line'] = Line(points=(touch.x, touch.y)) return True def on_touch_move(self, touch): '''(internal) As with touch down events, motion events are recorded until we know that a gesture is or is not being attempted.''' if self._get_uid('cavoid') in touch.ud: return if self._touch is not touch: super(GestureBox, self).on_touch_move(touch) return self._get_uid() in touch.ud if touch.grab_current is not self: return True ud = touch.ud[self._get_uid()] if ud['mode'] == 'unknown': dx = abs(touch.ox - touch.x) dy = abs(touch.oy - touch.y) distance = sqrt(dx * dx + dy * dy) # If we've moved more than the thershold distance inside the # threshold time, treat as a gesture if distance > self.gesture_distance: Clock.unschedule(self._change_touch_mode) ud['mode'] = 'gesture' # Regardless of whether this is a known gesture or not, collect # the motion point in case it becomes one. try: touch.ud['gesture_line'].points += [touch.x, touch.y] except KeyError: pass return True def on_touch_up(self, touch): '''(internal) When the touch up occurs, we have to decide if a gesture was attempted. If so, we fire the on_gesture event. In all other cases we propogate the change to child widget.''' if self._get_uid('cavoid') in touch.ud: return if self in [x() for x in touch.grab_list]: touch.ungrab(self) self._touch = None ud = touch.ud[self._get_uid()] if ud['mode'] == 'unknown': Clock.unschedule(self._change_touch_mode) super(GestureBox, self).on_touch_down(touch) Clock.schedule_once(partial(self._do_touch_up, touch), .1) else: # A gesture was attempted. Did it match? gesture = Gesture() gesture.add_stroke( zip(touch.ud['gesture_line'].points[::2], touch.ud['gesture_line'].points[1::2])) gesture.normalize() match = self.gestures.find(gesture, minscore=0.70) if match: self.dispatch('on_gesture', match[1].name) else: # The gesture wasn't recognized; invoke a normal reaction super(GestureBox, self).on_touch_down(touch) Clock.schedule_once(partial(self._do_touch_up, touch), .1) return True else: if self._touch is not touch and self.uid not in touch.ud: super(GestureBox, self).on_touch_up(touch) return self._get_uid() in touch.ud def _do_touch_up(self, touch, *largs): '''(internal) Simulate touch up events for anything that has grabbed the touch''' super(GestureBox, self).on_touch_up(touch) # don't forget about grab event! for x in touch.grab_list[:]: touch.grab_list.remove(x) x = x() if not x: continue touch.grab_current = x super(GestureBox, self).on_touch_up(touch) touch.grab_current = None return True def _change_touch_mode(self, *largs): '''(internal) Simulate a touch down if we know the touch did not become a gesture''' if not self._touch: return uid = self._get_uid() touch = self._touch ud = touch.ud[uid] if ud['mode'] == 'unknown': touch.ungrab(self) self._touch = None touch.push() touch.apply_transform_2d(self.to_widget) touch.apply_transform_2d(self.to_parent) super(GestureBox, self).on_touch_down(touch) touch.pop() return def _get_uid(self, prefix='sv'): return '{0}.{1}'.format(prefix, self.uid) def on_gesture(self, gesture_name): '''Called whenever a gesture has occured. This is a Kivy event. It can be overridden in a subclass our bound to using :meth:`Widget.bind`. ''' pass
#!/usr/bin/env python from kivy.gesture import GestureDatabase gdb = GestureDatabase() cross = gdb.str_to_gesture( 'eNq1l9tu3DYQhu/1It6bLjicE+cFtrcF/ACBYwv2Iqkt7G7a5u1DDqlT0lZ7I2Mxsj5JP2f4k' 'xR1OH85//X9+Npfb98uffd7Ow6hO7wM0D0+vD/92T90Q8z/5gN218eH6+3y8aW/5lPqDl8H7g' '7/KvLot3WDFCnNzw8f5/dbeSyVx+w/Hvuj3NUNUDMoKXzPj0DsTuGIGiRJGCOVbP4pV7E7/Ra' 'ORJZMwhS1u35++v9WyFvh7rU2ENEMJI1RuLu+NnEEgyhpjEG2xb1y0H3Ek4vbKA6kEmyKEWdx' 'WPaJsaVN8eidH2Ef8ejiOIqHdbeQLvolaLTFLxlty7ulsVlaNBKChCnmEpp+uRSSIozRBLbl3' 'dSoe8m7rdF2kkc3FmGSB1FVphYT6qSejY2sOsXtyYRuLOIkHgEtGrZIKJP4Spk13ZG524qzrX' 'FWLlHmfok/9UvcFndTUe8Rz8OVA7RIYXtAoluKdke3hJU42j0dQ24pwV7ybiptm1oGE+Rz4il' 'u9w25q8R3qQtnZ2WKd+TutpLeox4pZmt1jHlh3VR3X8nuUceFdIm4qc5uKy9mapCY339jXKb+' '08tjewlmN5VxH3H3lBcLcASZfzGv4osFPiVk5SnmCb6p766y7qbvvvL0Zg2GKtHGCDjPJ2FKi' 'cfI2wuNuKsCu2i7qYLzdiP3BXGLYIs1DEAo0hh1eyaJeyq8i7b7KdM26ddNXpPO7SCSTnHbSn' 'ErxXaQVndSJyeJGQOMMe+RJm1aLrk5bku7kYp7SLuPOvlI6/FHs4+87hH2Fats/p8vff8+beV' 'Vyl5etTucMA/a7kSE+XAbNHVPmcGK2ZKBsxSciTPUyqAwUmdRKouFCToDqgwLU3MWQmVUmDnD' '1O7jwsCfOuXFt0JxGKNDaS1rhVwhV5gqpBW0CnEJLaw0G4QKwwrGmlJaQaxw1bp5QRBsBb2iZ' 'MvczQtSWjGvx09m5uXwmnk1tNKDEGYbZli94TX0aqg1nRrE5Z3WoFdDtWyFBr0aqR2URljLqa' '1bbNDrsToywth69QfqGIrcaDVoPSoBqkNtbDE1Wi3iqsAtV6gesSdL0vKCalLNdqa5rjpB3vr' 'z69utfJTmz8qTFclM/z6/3N4cSteSyvT28bW/PL0/935Ffdsd1n9Q7muT+dNw+Xj59lzFU+6W' 'Y5L8ug5qwTR/PFH5bDz+AM/6Dqo=') circle = gdb.str_to_gesture( 'eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4B' 'yQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTz' 'e/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN' '3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91G' 'h6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm' '8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7M'
def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() self.gdb.add_gesture(check)
def __init__(self, **kwargs): super(Box, self).__init__(**kwargs) self.gdb = GestureDatabase() top_to_button = self.gdb.str_to_gesture(gesture_string) self.gdb.add_gesture(top_to_button) self.register_event_type('on_top_to_button')
from kivy.gesture import GestureDatabase gdb = GestureDatabase() cross = gdb.str_to_gesture( 'eNq1l9tu3DYQhu/1It6bLjicE+cFtrcF/ACBYwv2Iqkt7G7a5u1DDqlT0lZ7I2Mxsj5JP2f4k' 'xR1OH85//X9+Npfb98uffd7Ow6hO7wM0D0+vD/92T90Q8z/5gN218eH6+3y8aW/5lPqDl8H7g' '7/KvLot3WDFCnNzw8f5/dbeSyVx+w/Hvuj3NUNUDMoKXzPj0DsTuGIGiRJGCOVbP4pV7E7/Ra' 'ORJZMwhS1u35++v9WyFvh7rU2ENEMJI1RuLu+NnEEgyhpjEG2xb1y0H3Ek4vbKA6kEmyKEWdx' 'WPaJsaVN8eidH2Ef8ejiOIqHdbeQLvolaLTFLxlty7ulsVlaNBKChCnmEpp+uRSSIozRBLbl3' 'dSoe8m7rdF2kkc3FmGSB1FVphYT6qSejY2sOsXtyYRuLOIkHgEtGrZIKJP4Spk13ZG524qzrX' 'FWLlHmfok/9UvcFndTUe8Rz8OVA7RIYXtAoluKdke3hJU42j0dQ24pwV7ybiptm1oGE+Rz4il' 'u9w25q8R3qQtnZ2WKd+TutpLeox4pZmt1jHlh3VR3X8nuUceFdIm4qc5uKy9mapCY339jXKb+' '08tjewlmN5VxH3H3lBcLcASZfzGv4osFPiVk5SnmCb6p766y7qbvvvL0Zg2GKtHGCDjPJ2FKi' 'cfI2wuNuKsCu2i7qYLzdiP3BXGLYIs1DEAo0hh1eyaJeyq8i7b7KdM26ddNXpPO7SCSTnHbSn' 'ErxXaQVndSJyeJGQOMMe+RJm1aLrk5bku7kYp7SLuPOvlI6/FHs4+87hH2Fats/p8vff8+beV' 'Vyl5etTucMA/a7kSE+XAbNHVPmcGK2ZKBsxSciTPUyqAwUmdRKouFCToDqgwLU3MWQmVUmDnD' '1O7jwsCfOuXFt0JxGKNDaS1rhVwhV5gqpBW0CnEJLaw0G4QKwwrGmlJaQaxw1bp5QRBsBb2iZ' 'MvczQtSWjGvx09m5uXwmnk1tNKDEGYbZli94TX0aqg1nRrE5Z3WoFdDtWyFBr0aqR2URljLqa' '1bbNDrsToywth69QfqGIrcaDVoPSoBqkNtbDE1Wi3iqsAtV6gesSdL0vKCalLNdqa5rjpB3vr' 'z69utfJTmz8qTFclM/z6/3N4cSteSyvT28bW/PL0/935Ffdsd1n9Q7muT+dNw+Xj59lzFU+6W' 'Y5L8ug5qwTR/PFH5bDz+AM/6Dqo=') circle = gdb.str_to_gesture( 'eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4B' 'yQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTz' 'e/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN' '3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91G' 'h6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm' '8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7M' 'Y3pSVxVuRMiGFJaBOcXEzqYrZtwglLEsluBdOSen7R5LiN7nISzehAwsQZwC3yfwJ3PSnP4FZ'
def __init__(self, **kwargs): super(cGestureBoard, self).__init__(**kwargs) self.gdb = GestureDatabase()
class GestureBoard(FloatLayout): """ Our application main widget, derived from touchtracer example, use data constructed from touches to match symboles loaded from my_gestures. """ def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() # add pre-recorded gestures to database self.gdb.add_gesture(cross) self.gdb.add_gesture(check) self.gdb.add_gesture(circle) self.gdb.add_gesture(square) def on_touch_down(self, touch): # start collecting points in touch.ud # create a line to display the points userdata = touch.ud with self.canvas: Color(1, 1, 0) d = 30. Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d)) userdata['line'] = Line(points=(touch.x, touch.y)) return True def on_touch_move(self, touch): # store points of the touch movement try: touch.ud['line'].points += [touch.x, touch.y] return True except (KeyError) as e: pass def on_touch_up(self, touch): # touch is over, display informations, and check if it matches some # known gesture. g = simplegesture( '', list( zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2]))) # gestures to my_gestures.py print("gesture representation:", self.gdb.gesture_to_str(g)) # print match scores between all known gestures print("cross:", g.get_score(cross)) print("check:", g.get_score(check)) print("circle:", g.get_score(circle)) print("square:", g.get_score(square)) # use database to find the more alike gesture, if any g2 = self.gdb.find(g, minscore=0.70) print(g2) if g2: if g2[1] == circle: print("circle") if g2[1] == square: print("square") if g2[1] == check: print("check") if g2[1] == cross: print("cross") # erase the lines on the screen, this is a bit quick&dirty, since we # can have another touch event on the way... self.canvas.clear()
class GestureBoard(FloatLayout): """ Our application main widget, derived from touchtracer example, use data constructed from touches to match symboles loaded from my_gestures. """ edge_size = NumericProperty(0) exists=BooleanProperty(False) def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() # add pre-recorded gestures to database for square in squares: self.gdb.add_gesture(square) def on_touch_down(self, touch): super(GestureBoard,self).on_touch_down(touch) if self.collide_point(*touch.pos): if App.get_running_app().config.getboolean('museotouch','validation') == True: # start collecting points in touch.ud # create a line to display the points userdata = touch.ud userdata['line'] = Line(points=(touch.x, touch.y)) return True def on_touch_move(self, touch): if self.collide_point(*touch.pos): super(GestureBoard,self).on_touch_move(touch) # store points of the touch movement try: touch.ud['line'].points += [touch.x, touch.y] return True except (KeyError) as e: pass def on_touch_up(self, touch): super(GestureBoard,self).on_touch_up(touch) # touch is over, display informations, and check if it matches some # known gesture. try : g = simplegesture( '', list(zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2])) ) self.edge_size = (self.stroke_length(list(zip(touch.ud['line'].points[::2], touch.ud['line'].points[1::2]))))/4 if self.edge_size < 150: self.edge_size=150 # gestures to my_gestures.py except : return # use database to find the more alike gesture, if any g2 = self.gdb.find(g, minscore=0.9) if g2: for index,square in enumerate(squares) : if (g2[1] == square): if index in [0,1]: square_pos=[touch.x,touch.y-self.edge_size] elif index in [2,3]: square_pos=[touch.x-self.edge_size,touch.y-self.edge_size] elif index in [4,5]: square_pos=[touch.x-self.edge_size,touch.y] elif index in [6,7]: square_pos=[touch.x,touch.y] valid = Valid(pos=(0,0),size=[self.edge_size,self.edge_size],rotation=180,scale_min=0.5) self.add_widget(valid) Animation(pos=square_pos,d=.3,rotation=0,transition='out_sine').start(valid) self.exists=True break def stroke_length(self,l): distance = 0 for index, point in enumerate(l) : if index < len(l)-1: distance += Vector(point).distance(l[index+1]) return distance
def __init__(self, *args, **kwargs): super(GestureBox, self).__init__(*args, **kwargs) self.gestures = GestureDatabase() self.register_event_type('on_gesture')
class CurrentSession(Screen): _app = ObjectProperty() working_layout = ObjectProperty() buttons = DictProperty() grid = StringProperty('small') n_of_cols = NumericProperty(number_of_cols) color_manager = ObjectProperty() def __init__(self, **kwargs): super(CurrentSession, self).__init__(**kwargs) #self.snack = Snackbar(text="Current session updated", duration=2) self.ssm = None self.buttons = {} self.available_grid_sizes = ['small', 'large'] self.bind(grid=self.refresh_menu_text, buttons=self.refresh_screen) self.working_layout.bind( minimum_height=self.working_layout.setter('height')) self.menu_items = [{ 'viewclass': 'MDFlatButton', 'text': 'Show %s grid' % self.grid, 'on_release': lambda: self.change_grid_size() }] self.color_manager = ColorManager(md_colors) self.clear_anim = Animation(x=self.width, duration=.5, transition=animation_type) self.bind(width=self.update_anim, size=self.adjust_height) self.gdb = GestureDatabase() self.gdb.add_gesture(left_to_right) Clock.schedule_once(self.my_init) def my_init(self, dt): self.manager = self.parent self.root = self.parent.parent.parent.parent self.working_layout.parent.bind( minimum_height=self.working_layout.parent.setter('height')) self.init_button = self.ids.add_cells def animate_action_button(self, instance): # print instance.content # anim = Animation(size=(0,0), center_x=instance.center_x, duration=1, transition='in_out_quad') # anim2 = Animation(opacity=0, center_x=instance.center_x, duration=1, transition='in_out_quad') # print instance.center_x, instance.center_y # anim.bind(on_complete= self.teste) # anim.start(instance) # anim2.start(instance.content) self.parent.current = 'workspace' def teste(self, x, y): print x, y def update_anim(self, instance, value): self.clear_anim._animated_properties['x'] = self.width def refresh_screen(self, instance, value): if bool(self.buttons): if self.ids.plus_layout.children: self.ids.plus_layout.remove_widget(self.ids.add_cells) else: self.ids.plus_layout.add_widget(self.init_button) def on_touch_down(self, touch): # create an user defined variable and add the touch coordinates touch.ud['gesture_path'] = [(touch.x, touch.y)] super(CurrentSession, self).on_touch_down(touch) def on_touch_move(self, touch): if 'gesture_path' in touch.ud: touch.ud['gesture_path'].append((touch.x, touch.y)) super(CurrentSession, self).on_touch_move(touch) def on_touch_up(self, touch): if 'gesture_path' in touch.ud: # create a gesture object gesture = Gesture() # add the movement coordinates gesture.add_stroke(touch.ud['gesture_path']) # normalize so thwu willtolerate size variations gesture.normalize() # minscore to be attained for a match to be true, default 0.3 g2 = self.gdb.find(gesture, minscore=0.70) if g2: print 'swipe left' #print("gesture representation:", self.gdb.gesture_to_str(gesture)) def finish(self): print 'finishing' self.clear() def adjust_height(self, instance, value): # TODO Analysis pass # print self.width, self.height # print self.ids.add_cells.pos #print self.height #self.ids.plus_layout.height = self.height - self.ids.add_cells.height - self.root.ids.toolbar.height #print self.ids.plus_layout.height # print [x for x in instance.walk()] # print self.buttons #print type(instance) == GridLayout # if type(instance) == GridLayout: # self.ids.plus_layout.height = self.working_layout.row_default_height # self.ids.add_cells.y = self.buttons[sorted(self.buttons.keys())[-1]].y # def on_touch_down(self, touch): # print touch @mainthread def on_enter(self, *args): if not self.parent.has_screen('workspace'): self.parent.add_widget(self.parent.saved_screens['workspace']()) self.ssm = self.parent.get_screen( 'workspace').secondary_screen_manager self.update_dots_menu() @mainthread def on_leave(self, *args): if len(self.root.ids['toolbar'].dots_menu.items) > 3: del self.root.ids['toolbar'].dots_menu.items[1] def update_dots_menu(self): self.root.ids['toolbar'].dots_menu.items.insert(1, self.menu_items[0]) def refresh_menu_text(self, widget, value): self.menu_items[0]['text'] = 'Show %s grid' % value def change_grid_size(self): if self.grid != self.available_grid_sizes[0]: self.grid = self.available_grid_sizes[0] self.n_of_cols = number_of_cols else: self.grid = self.available_grid_sizes[1] self.n_of_cols = number_of_cols + 1 self.root.ids['toolbar'].dots_menu.items[1] = self.menu_items[0] self.root.ids['toolbar'].dots_menu.custom_dismiss() def populate_current_session(self, _widget): if _widget.active: if not self.buttons.has_key(_widget.pass_text) or dev: print 'Adding ' + _widget.pass_text + ' to current session' new_text = _widget.pass_text.replace(' ', '\n') button = MDColorFlatButton(text=new_text, id=_widget.pass_text, size_hint=(1, 1), on_release=self.add) self.bind(grid=button.setter('grid')) self.buttons[_widget.pass_text] = button button.set_bg_color( get_color_from_hex(self.color_manager.pop())) self.working_layout.add_widget(button) else: if self.buttons.has_key(_widget.pass_text): self.working_layout.remove_widget( self.buttons[_widget.pass_text]) del self.buttons[_widget.pass_text] def add(self, button): button.set_is_empty(False) button.increment_counter() if self.parent.get_screen('settings').ids.vibration.active: print "I'm vibratin'!" if (platform == 'android' or platform == 'ios' ) and self.parent.get_screen('settings').ids.vibration.active: #print platform # try: vibrate(0.1) # except NotImplementedError: # print "Can't access the vibrate function" def clear(self): if self.manager.current_screen.name == self.name: for i, button in enumerate(self.buttons.values()): self.clear_anim.start(button) if i == len(self.buttons) - 1: self.clear_anim.bind(on_complete=self.clear_complete) else: self.ssm.reset = not self.ssm.reset def clear_complete(self, instance, value): # sm = self.parent.get_screen('workspace').ids.secondary_screen_manager # sm.reset = not sm.reset self.ssm.reset = not self.ssm.reset
def __init__(self, *args, **kwargs): super(GestureBoard, self).__init__() self.gdb = GestureDatabase() # add pre-recorded gestures to database for square in squares: self.gdb.add_gesture(square)
from kivy.gesture import GestureDatabase gdb = GestureDatabase() check = \ gdb.str_to_gesture('eNq1l0tuI0cMhvd9EXsTofgmL6BsA/gAgcYWbGMmtmBpksztwyY1kgZI0rNpbdr+u+pjkX+9+v718+uf3zbP++Pp68d++vX8PIzp/ukA08Pd2+6P/d10wPwzHzQdH+6Op4/3z/tj/svT/ZeDTPf/CnmoZtNBZ5Rl/8P769tp7uZzt/iPbr/NraYD9AjmIXzLLoDTdmxgBLsSMMIw5OHzcP6eX9O0/WVsCMFGmCuaGgjBdPy0+/8wXGFkeu4Ig7LzgISbMw/j6fh8hmMMBDIkdBYPimV4pQ7W8EQMUA4LMhMzCyW5watKgJoOHhxsuIz3wscVb8ExhpIxDoIgvcEzhoaiZ1geA20Rj+UAwlp4LDxd8OkqO4KHYXLI4oYOwEai4oPRmHiZXr6iXOiY9mXBFUNYacAVDm4uIOCiaXws24plK9oq7PIUr56iOqsyg+acyOrezJicpTCI3YYy5HtapFNZSldLCcRgCCk4hqniDZ2dHZjCMf1EXh47laNEN2MfEjkzJFgtK3BLHwEAGTcnlSu7LNPLUbo6+n2m5GbAuVzUr/ShYQzoSBSWi5iXJwyVqWRr4ctX+om1mq+GR7ibAA8dJuHLfC5nGVbjl7dMS/tk1g3tB3OXZyWXsyyrsMtWtlXY5SnHGmwpPwW+s3M15h5CkVvM8FyWcWH3Uce5io00A/8Eu7wUWoVdXoqswi4v5eIlseTWl6e9Cqh6+IUt6OoUwAJD88KwjC4rJVZAazmpsAa6jFRaA10+qqyBLht1DRu1bNQ1bLSy0S425mWFOc9khtxcnRwuaEW6PZnH8sFp5aPRKuwy0i5GMnsmHJE32dz73a5oG3nJgLyemqDgXKtPu/m2//ix379d7u6m8+XdbLrf5jg2Y9picD5OB/NpN4vQIrYYLWKJHiX6aJFblBahRSvRvEUsETuQjRapxe6uHSjPsBK7u0CL0mKUyLKJ25/NLbRaUI+PzwGsRWrxzOr0qKNy5+ydHnVUzsftj7JFdK7cAUSrW3SugrdpReeqdluV6Fxdu6hdv6hcCeYabQl7KFG5ElWpiM6itqgtWovWorXYlU6/d234y/71+eWUVud1dRvz2xT/en06vcwfWiP7QFU51dP7l/3H7u1xX2+gP9F+/MHc7jw1fz98vD99fTxV65yN6YfP81jE8nDMa8j81bD5B2R9zCo=') circle = \ gdb.str_to_gesture('eNq1WNtyGzcMfd8fiV+iIS4EyB9QXzuTD+g4icbxpLU1ttI2f18QoHa5jpy12qlGAyUw9hA4ByQh3dx/vf/z++7u8Hz69nSYfumfxzTdfD7C9OHdw+0fh3fTEe2f9kHT84d3z6enx6+HZ/svTze/H/N0cxHkg4dNR2lQas8fH+8fTu2x0h6rrzz2a4uajhAZtBS+2yOA0z7tCDMkqjk1y0W1pfN3+zNN+/dpl0pGqmdLJcv0/PH25+uwr5Onu74EMxErVLeGMT3fNXQDT4C1kopbLVBhG92LB91Gh6RJinRb5A2ZF8euM/aP5JyxhVVShbBiJW9ho7OPcMZG1YTzWzTP2LgAm8XyBmx0bJqxsfSkm8UqMzaRluVduW5ju5o4qwkKmFWruM28cGLNcW3eriXOWi5kv8zbNK7GcwmbabtP0LXEWcuB7MY3pSVxVuRMiGFJaBOcXEzqYrZtwglLEsluBdOSen7R5LiN7nISzehAwsQZwC3yfwJ3PSnP4FZ31fnNrZX/PS8uKOkCvpBiFkfSF2Sz3PpoC9wVpTqDExXKmkvYmoc274S8nRZ2RXlR1B5u5xGG1bKcK7a5rtz77ILyIihVSVzL2bb8zuB4LefsgnJ+AzjQtTuUXVBeBCVRTKSMbq1HA/u9b7DMohpWSLbPFnZFuf4/6NklzYOki57N1rzAQ8YV/HY3Ztc0L5piXR0BMqAj1GItLmELb/OeXdQ87FKB8QhIOKDXOXGzOb2BGVc1D9sUaNxJNiPM6LQkbpbS9lbKrmpeVAXluRtTTloXdDs2B95z3UYXV1UWVe2aPydutqAO6HIt7+KqCm0f7A2+Fk1JkNyiTQ+b8C6rzJdpyrkoQUlhUx6IZ61XEi8uqyzXKSODTSphAcsAjnBlz4irKvN9CjVxsXEwu2UZ9iopXcmLuqgKWwOMb2JJNoh2y284B9Q11WU6En2NFuRrFVVXVJdhN71QdDhjBIe3a/3xtg3/n54Oh4d5lFdps7zNmjd7Rt2laY9ad3V88XQ6apluW0TxiAL2Yc7qTkqjs6RwSjgxnOBOhpUTw6krJ7kz06up2D3iETUiNB7L7pT+WLZhf3hJi5CIiLyU4zENZ5SlPYWoVSNZTeGMWv25vWnqzhq1amBKYNaotcTjuUdGrSXy8+rMGbWW7E6u66SpRUStJRbgvGZDW0QUXqICjgqqjE6q4dSVM19Yrawi4MJqwUIJyTBqg5TGOpC6F1be9ON6ttdGVkB+XNA2ZYREjwFfCgmSNJKC8/JBjMbyAN0bzLjS5k3dG9RoLJJK95axY9K52KBAohGShBeCAgncdIFcABj79nJI8JHzT0L6/kg/CQk+mFd5Q/BBtKoRZNzXZz4g+MC0YhSCD+hqXWhGgCAn1dcFxWAqdV0uND1gMJWCTIyeBnRy7CtZeLl7KbxRLPaykMObXu1k+1rpIb2VL20Hm9siJFKlTiTqylu7t4SXx31o35ZW3p4zpZVXLyxNsAq5xBIFH/1syH1FCj76Hs69PSn4KHU8k2w+D5aCZ+lbhKLqGvVJF5+i6hp0yRk3WiLFWSedfepdQOMBCtyFl/GsBe5a9xO4r8axESCNh7UNo+GFVw95YB57VHuaHL0Pebwy7DYPb79IevLcex/W3n7/0dobhWI+X1buzVEoytprhcYN/OVwf/fl1H70sql+ry83CbbfxP66/3z64iF2m9sJZxjmPT3+fni6ffh08L9w/IixfkGL68PDb8enx8/fPsVSedrnnc05diDYoIA2CpbUvu7t/gFuoPx3')