tracker.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from logger import Logger
  2. class GestureTracker(Logger):
  3. """
  4. Abstract class for gesture tracker definitions. Contains methods for
  5. changing the state of touch points.
  6. """
  7. # Supported gesture types
  8. gesture_types = []
  9. # Configurable properties (see configure() method)
  10. configurable = []
  11. def __init__(self, window=None):
  12. # Hashmap of gesture types
  13. self.handlers = {}
  14. if window:
  15. window.add_tracker(self)
  16. def bind(self, gesture_type, handler, *args, **kwargs):
  17. """
  18. Bind a handler to a gesture type. Multiple handlers can be bound to a
  19. single gesture type. Optionally, (keyword) arguments that will be
  20. passed to the handler along with a Gesture object can be specified.
  21. """
  22. if gesture_type not in self.gesture_types:
  23. raise ValueError('Unsupported gesture type "%s".' % gesture_type)
  24. h = handler, args, kwargs
  25. if gesture_type not in self.handlers:
  26. self.handlers[gesture_type] = [h]
  27. else:
  28. self.handlers[gesture_type].append(h)
  29. def trigger(self, gesture):
  30. if gesture._type not in self.handlers:
  31. self.debug('Triggered "%s", but no handlers are bound.'
  32. % gesture._type)
  33. return
  34. self.info('Triggered %s.' % gesture)
  35. for handler, args, kwargs in self.handlers[gesture._type]:
  36. handler(gesture, *args, **kwargs)
  37. def is_type_bound(self, gesture_type):
  38. return gesture_type in self.handlers
  39. def on_point_down(self, point):
  40. pass
  41. def on_point_move(self, point):
  42. pass
  43. def on_point_up(self, point):
  44. pass
  45. def configure(self, **kwargs):
  46. for name, value in kwargs.iteritems():
  47. if name not in self.configurable:
  48. raise ValueError('%s.%s is not a configurable property.'
  49. % (self.__class__.__name__, name))
  50. setattr(self, name, value)
  51. def __getattr__(self, name):
  52. """
  53. Allow calls like:
  54. tracker.gesture(...)
  55. instead of:
  56. tracker.bind('gesture', ...)
  57. """
  58. if name not in self.gesture_types:
  59. raise AttributeError("'%s' has no attribute '%s'"
  60. % (self.__class__.__name__, name))
  61. return lambda handler: self.bind(name, handler)
  62. class Gesture(object):
  63. """
  64. Abstract class that represents a triggered gesture.
  65. """
  66. pass