gesture_server.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from event_server import EventServerHandler
  2. from tuio_server import TuioServer2D
  3. from window import FullscreenWindow
  4. from point import TouchPoint
  5. class GestureServer(EventServerHandler):
  6. """
  7. Multi-touch gesture server. This uses a TUIO server to receive basic touch
  8. events, which are translated to gestures using gesture trackers. Trackers
  9. are assigned to a Window object, and gesture handlers are bound to a
  10. tracker.
  11. """
  12. def __init__(self):
  13. # List of all connected windows
  14. self.windows = []
  15. # Map of point sid to TouchPoint object
  16. self.points = {}
  17. # Create TUIO server, to be started later
  18. self.tuio_server = TuioServer2D(self)
  19. def add_window(self, window):
  20. self.windows.append(window)
  21. def remove_window(self, window):
  22. self.windows.remove(window)
  23. # TODO: Remove window from touch points
  24. def on_point_down(self, sid, x, y):
  25. if sid in self.points:
  26. raise ValueError('Point with sid %d already exists.' % sid)
  27. # Create a new touch point
  28. self.points[sid] = point = TouchPoint(x, y, sid)
  29. # Save the windows containing the point in a dictionary, and update
  30. # their trackers
  31. for window in self.windows:
  32. if window.contains(point):
  33. point.add_window(window)
  34. window.update_trackers('down', point)
  35. def on_point_move(self, sid, x, y):
  36. if sid not in self.points:
  37. raise KeyError('No point with sid %d exists.' % sid)
  38. # Update point position and corresponding window trackers
  39. point = self.points[sid]
  40. point.set_position(x, y)
  41. point.update_window_trackers('move')
  42. def on_point_up(self, sid):
  43. if sid not in self.points:
  44. raise KeyError('No point with sid %d exists.' % sid)
  45. # Clear the list of windows containing the point, and update their
  46. # trackers
  47. self.points[sid].update_window_trackers('up')
  48. del self.points[sid]
  49. def start(self):
  50. # Assert that at least one window exists, by adding a fullscreen window
  51. # if none have been added yet
  52. if not self.windows:
  53. self.add_window(FullscreenWindow())
  54. self.tuio_server.start()
  55. def stop(self):
  56. self.tuio_server.stop()
  57. def run(self):
  58. self.tuio_server.run()