gloss-mc/InputQueue.py

83 lines
3.1 KiB
Python

import clutter
#########################################################
# The input queue controls fast user input by queing up
# signals and processing them one by one once any timelines
# are complete
#########################################################
class InputQueue:
NORTH, EAST, SOUTH, WEST = range(4)
def __init__(self):
self.queue_north = 0
self.queue_east = 0
self.queue_south = 0
self.queue_west = 0
self.action_north = None
self.action_east = None
self.action_south = None
self.action_west = None
def set_timeline(self, timeline):
self.timeline = timeline
self.timeline.connect('completed', self.flush_queue)
def input(self, event):
if not self.timeline.is_playing():
if (event.keyval == clutter.keysyms.Left) and (not self.action_west is None): self.action_west()
if (event.keyval == clutter.keysyms.Right) and (not self.action_east is None): self.action_east()
if (event.keyval == clutter.keysyms.Up) and (not self.action_north is None): self.action_north()
if (event.keyval == clutter.keysyms.Down) and (not self.action_south is None): self.action_south()
return True
if event.keyval == clutter.keysyms.Left:
self.queue_west = self.queue_west + 1
return True
elif event.keyval == clutter.keysyms.Right:
self.queue_east = self.queue_east + 1
return True
elif event.keyval == clutter.keysyms.Down:
self.queue_south = self.queue_south + 1
return True
elif event.keyval == clutter.keysyms.Up:
self.queue_north = self.queue_north + 1
return True
#If we get to this point, we haven't handled the input, so return False
return False
def set_action(self, direction, function):
if (direction == self.NORTH): self.action_north = function
if (direction == self.EAST): self.action_east = function
if (direction == self.SOUTH): self.action_south = function
if (direction == self.WEST): self.action_west = function
def flush_queue(self, data):
#Consolodate north/south, east/west volumes
self.queue_north = self.queue_north - self.queue_south
self.queue_south = self.queue_south - self.queue_north
self.queue_east = self.queue_east - self.queue_west
self.queue_west = self.queue_west - self.queue_east
if self.queue_north > 0:
self.action_north()
if self.queue_east > 0:
self.action_east()
if self.queue_south > 0:
self.action_south()
if self.queue_west > 0:
self.action_west()
self.queue_east = 0
self.queue_south = 0
self.queue_west = 0
self.queue_north = 0
def is_in_queue(self):
if (self.queue_north > 0) or (self.queue_south > 0) or (self.queue_east > 0) or (self.queue_west > 0):
return True
else:
return False