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)
Exemple #2
1
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)
Exemple #5
0
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
Exemple #6
0
 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
Exemple #7
0
    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
Exemple #8
0
 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 = []
Exemple #9
0
 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)
Exemple #10
0
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
Exemple #11
0
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
Exemple #12
0
 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)
Exemple #13
0
 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 = []
Exemple #14
0
    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()
Exemple #16
0
    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)
Exemple #17
0
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")
Exemple #18
0
    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)
Exemple #19
0
 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 = []
Exemple #20
0
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()
Exemple #21
0
    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()
 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 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()
Exemple #24
0
def load_gestures():
    gdb = GestureDatabase()
    gdb.add_gesture(cun_1)
    gdb.add_gesture(cun_10)
    print('Loading gestures...')

    return gdb
Exemple #25
0
 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)
Exemple #26
0
 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()
Exemple #28
0
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
Exemple #29
0
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
Exemple #30
0
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)
Exemple #32
0
    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"

Exemple #34
0
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))
Exemple #35
0
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('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')

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('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')

square8 = \
gdb.str_to_gesture('eNqlWttyHLkNfZ8fsV+iIm4E+QPe11T5A1KOrbJVu7FVkjbJ/n1IAj1NSH2ZivQC6cxpNHDAC8jRx4ffH/791933++eXP5/uL7+5fUyXj98e4fL5w88v/7r/cHnE9mszdHn+/OH55enX7/fP7U++fPzjUS4fN518HrTLY+6utD3/+Ovh50t/rPTH6s5jf++syyNYBD2Ev9ojgJdPf0t3DFCEq7jp0fy3f0rjU0msSQGwdpP48vzPL8cv4fESuXy/+s+JahIzrO0N3905aYXCkBI3kyqcOx+Jg67OMSESiBmuujpH0cICpWA3WvK59zK811u8A2VJGTVDN/ncOQ7xESbnzElR3MDqOxHURJoldyNyg3MczunMefNdKpMAZ+5GWM99j4KinPtuAyjnypJTN1nPBwuOeuJUT0JVYXGz+sZaMifISt00Uc59j2riVE3KVaqIG7z6ZqhVa9LK3ZRy6ppGLWmtJWmhgsBuiFbfVbBiKZq6qflcExq1pLWWqKRaM7mR9/getaS1lpArqAK6YX2P81FMWouZmuLSlhc3iO9xPqpJXs3mO1eCLNWN1Mk3QCptvudubvHNo5wMi29oQ02BkxlIkygZCqZUKHdT8dz1KCbT4hq1CEIGN1PUhEJAJekw52OQRylZFs9UJWtmNNMK/X+Pbh51ZF08M4MmEHLTlyN3TRnWOZnLDUqPKnI9d42c1uVV8/kyJaOIAueugWB1DHKDIjKqKHTuO0GhJEyVuuHCNzgfhRQ5c95na6JExIqlmxtGtoxSylrKtp2AtvXJjMzbZdufxz48tmPlG5yPYspaTOSaBcgNzRt9m+TKpQp1U84X7zyqmeEG302v654jUpXOnY9y5ms5m9RY2qBwM/tuayIxpZqbwVrPRcmjmvlaTWyzjxnBzft8j2rmazVT2xNTW0iHoYT8LuejmnndLhO0wdzmiplU3uNcRzl13TBbs1mzVjQD5V2h66inTjumYJEK5Ibe5XwUVNctkyT0KHRW0t7df326v/957dU192Zd9fLxExHepcun1l7e1flHLy+PWi5fOoP2GdUYsssoyRhlnwGDwWmfgcbYj6OQMfI+g41R9xkyGHLVI80/1BnZGLzPUGPkfYZpKmWfYZrm/TiqaZr9LZ3YQJNRIYCmnJYAmliFA2j61Pi4SVLj40MFThLAkTgDBXDk2s4wAawGeiHS20K09X9QSA8oI1tmOaCM3NssOaAMJVpPFTXOu3w2fjlwOSRj5QOKCag5fsa7fNO2pAOXpnQ5eqvpXvKNuYIVoZQbowSrSMX9EMAqUg+KBlaRelB6GEWQdJXjzfwAEKPQASUbRTbT2+Cr8eut/FERgaMQqlHyPgWTUWzAQR0zCHBI3fr3iKKhGFEylCJqGiJH1GRDiagphRpR04NSRC1rehWDJUrxbWS5UY6o5Ua2PIBuDACyRBkPKJa1Lw/bFJOA9YBievBRLCaOpAOKKeXr0DbFZPONZZtiGspBRmyCykFGbOrmg3DZ1M1wQDF180FGbOrmo3BN3XwUrqmbDwrApq4eZWTq6lFGNVB8LEqa0TEtOgoz2of6m2krGCjqD9KMMm09yIFSN0IVmSmy+M4zmtFRDWhxNOihS1pBguIecpCg6OvNo1OCHpX9wVkCSuAoBdSDz3PW7fzjqATUg89zojSWtY5qQL1+eU60N7qvlu5OqdPw6V3qW4qaBLbpE7tcCtPotbayozijsnBpmgyUXQvlaRZRdi3UZ8VY3EY390ZwzdMkJt2qifqaYzEvxdQyLRC9/9tI1peZbBQPqqSAerLWuC9o9ZdYs35FeSM669avFNmIw9r1K2V5o0woL4Oq5Glp5OQDsGhAdesl87LLkPzBOq3XvIzGmgJKG+4qBMpWXSoGytZwqzRT0HOsrgcaSlu+JVC2qltzoGT3rQH1mtcSUJ9+tQa0vo0DU5opZKpicnEgor6VlwN381a+Q+GpIdihyNRWLNmgdeLegqyoTk3Mipoe+MqD6YHRg/XO3l6tKEwN2op625YiSlPjt6I8dYwrKlOruaJ5r2FdKbrXA6+UMnXSK2pniRq1sGaVa+Ras9rPEQHF6cCyorR3MlopdgTTKKJ1rn4wW1E7aOVXAdlxylbBFbUTVBuf+6+2rDmqb20sc3pzrlopJgHlA4rp8WrMWRtrf06oSfBqdFmzagvGhJoEIAev9qM7bFDUKSZO0nmFQGtJbRleUetCqcq8xqA1nlTT7uKE1nhSkQOK31wcebF7DOWFYq+3i4xcI5qnm5YV9Tscjajf20hE63RndEWtbyRJEYXpBmpF/W4rvk3m+6wV9TusGIM1hMQxY2sI/c5sRS03fhWv5cYQ0Trdy11RawivKDg63+Ft7muYMVB8XGQKKDnKAfXNIsuMbu3omHOg5I2dIGugLGmVgMKW71mPpSVBTQHd6GVQIVA8R8WAeo4660F90XyTgHKgeAIqAV3czXqQt/qoGlDYesmsx9KcogYJvJHFEiTwEwmGa12bIR0NWbOPghKyZtwIqISsydeuErImz6+ErGkrvxIkwLxRthIkWMZ/CRKg61yDBLA1CmrQw9tKrEGP5HrUoIf3uVhnCZaDFtZZAiwuTM0BXcKcs15OfljnRJdTItYaUIuX0pwoysb4pBTu84X9wTnRfrJ9c/ilRIEi/mDImpc4Qta0caanFCSgJY4gAYGjQQLfGSkFCfz8TxAk8FttgvgtxsZlHkGQYOsegiBI4IskQZAAPBMIEvjSSRCyBtyKo0lgXwv9uH/4/uOl/wtY6/O2Qmqc/zx8e/kxKLUL1pe9hr78+uP+6cvPr/3fyNosGN9qd9y/wvrH49Ovb39+Ha5bA/ip3Gk7ZuWcSGtpJ9/+pfTd/wDNLeDK')

squares=[square1,square2,square3,square4,square5,square6,square7,square8]
Exemple #37
0
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")
Exemple #38
0
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
Exemple #39
0
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)
Exemple #40
0
#!/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==')
Exemple #41
0
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)
#--------------------------------------------
Exemple #42
0
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()
Exemple #43
0
#!/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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'),
}
Exemple #44
0
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
Exemple #45
0
#!/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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')
Exemple #46
0
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
Exemple #47
0
#!/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'
Exemple #48
0
 def __init__(self, *args, **kwargs):
     super(GestureBoard, self).__init__()
     self.gdb = GestureDatabase()
     self.gdb.add_gesture(check)
Exemple #49
0
 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')
Exemple #50
0
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'
Exemple #51
0
 def __init__(self, **kwargs):
     super(cGestureBoard, self).__init__(**kwargs)
     self.gdb = GestureDatabase()
Exemple #52
0
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
Exemple #54
0
 def __init__(self, *args, **kwargs):
     super(GestureBox, self).__init__(*args, **kwargs)
     self.gestures = GestureDatabase()
     self.register_event_type('on_gesture')
Exemple #55
0
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)
Exemple #57
0
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')