Source code for kitt.actions

#!/usr/bin/env python

from kivy.logger import Logger
log = Logger.getChild("KiTT")

import gtk
import sys
import imp
import json
import os.path

[docs]class Actions(): """ This class loads all the actions and gesture, and does the binding between them. Then, when a gesture is found by the listener, the gesture gets dispatched. """ def __init__(self, actions_config, gestures_config): """ Build and load actions and gestures from files :param actions_config: string containing the path to the actions JSON file :param gestures_config: string containing the path to the gestures JSON file """ self._actions = dict(pinch_in=[], pinch_out=[], two_swipe_up=[], two_swipe_down=[], two_swipe_left=[], two_swipe_right=[], three_swipe_up=[], three_swipe_down=[], three_swipe_left=[], three_swipe_right=[], four_swipe_up=[], four_swipe_down=[], four_swipe_left=[], four_swipe_right=[]) self._functions = dict() self._gestures = dict() self._gestures_config = gestures_config try: with open(os.path.expanduser(actions_config)) as config: config = json.load(config) for engine in config['engines']: plugin = imp.load_source("kitt.plugin_%s" % engine, "%s/plugin_%s.py" % (os.path.dirname(__file__), engine)) self._functions.update(plugin.ACTIONS) actions = config["actions"] for gesture, act_l in self._actions.iteritems(): if gesture in actions.keys(): for action in actions[gesture]: act_l.append(action) else: log.error("Unable to load gesture: '%s' unknown" % gesture) except IOError: log.debug("No configuration file found")
[docs] def update_gestures(self, model): log.debug('update_gestures') with open(os.path.expanduser(self._gestures_config)) as config: gestures = json.load(config) if model in gestures.keys(): self._gestures.update(gestures[model])
[docs] def get_gestures(self): """ :return: the gesture dict """ return self._gestures
[docs] def before(self): """ safeguard function to be called before a touch is defined """ pass
[docs] def after(self): """ safeguard function to be called after a touch is defined """ pass
[docs] def dispatch(self, gestures, gdb): """ dispatches found gestures, matched using the gesture database into gesture events. :param gestures: list of live gestures :param gdb: kivy's gesture database object """ d = u = l = r = 0 for gesture in gestures: if gesture is None: log.warning("Undefined touch") continue gesture = gesture[1] if gesture: if gesture.name == 'move_down': d += 1 elif gesture.name == 'move_up': u += 1 elif gesture.name == 'move_left': l += 1 elif gesture.name == 'move_right': r += 1 else: log.warn("Unknown gesture") else: log.info("gesture: \t%s" % gdb.gesture_to_str(gesture)) for gest_n, gest_r in self._gestures.iteritems(): s = gest_n, "\t", for g2 in gest_r: g2 = gdb.str_to_gesture(g2) g2.normalize() s += g2.get_score(gesture), log.debug(s) if u is 4 and d == l == r == 0: gesture = "four_swipe_up" elif d is 4 and u == l == r == 0: gesture = "four_swipe_down" elif l is 4 and u == d == r == 0: gesture = "four_swipe_left" elif r is 4 and u == d == l == 0: gesture = "four_swipe_right" elif u is 3 and d == l == r == 0: gesture = "three_swipe_up" elif d is 3 and u == l == r == 0: gesture = "three_swipe_down" elif l is 3 and u == d == r == 0: gesture = "three_swipe_left" elif r is 3 and u == d == l == 0: gesture = "three_swipe_right" elif u is 2 and d == l == r == 0: gesture = "two_swipe_up" elif d is 2 and u == l == r == 0: gesture = "two_swipe_down" elif l is 2 and u == d == r == 0: gesture = "two_swipe_left" elif r is 2 and u == d == l == 0: gesture = "two_swipe_right" else: log.warn("Gesture:\tNot found") return False for act in self._actions[gesture]: fun = act["function"] prm = act["parameters"] if fun in self._functions.keys(): self._functions[fun](**prm) else: log.error("Action not found: %s" % fun) return True