Files
mopidy-touchscreen/mopidy_touchscreen/input/input_manager.py
2015-05-24 23:46:44 +02:00

156 lines
5.7 KiB
Python

import logging
import time
import pygame
logger = logging.getLogger(__name__)
class InputManager():
click = 1
swipe = 2
long_click = 3
key = 4
long_click_min_time = 0.3
up = 0
down = 1
left = 2
right = 3
enter = 4
special_keys = [pygame.K_DOWN, pygame.K_UP, pygame.K_LEFT,
pygame.K_RIGHT, pygame.K_RETURN]
def __init__(self, size):
self.down_pos = (0, 0)
self.up_pos = (0, 0)
self.screen_size = size
self.max_move_margin = self.screen_size[1] / 6
self.min_swipe_move = self.screen_size[1] / 3
self.down_button = -1
self.down_time = -1
self.last_key = -1
def event(self, event):
if event.type == pygame.MOUSEBUTTONUP:
if event.button == 4:
touch_event = InputEvent(InputManager.swipe,
self.down_pos,
self.up_pos, True,
InputManager.up, None)
return touch_event
elif event.button == 5:
touch_event = InputEvent(InputManager.swipe,
self.down_pos,
self.up_pos, True,
InputManager.down, None)
return touch_event
elif event.button == 1 and self.down_button == 1:
touch_event = self.mouse_up(event)
return touch_event
elif event.button == 3 and self.down_button == 3:
touch_event = InputEvent(InputManager.long_click,
self.down_pos, self.up_pos,
None, None, None)
return touch_event
else:
return None
elif event.type == pygame.MOUSEBUTTONDOWN:
self.mouse_down(event)
return None
elif event.type == pygame.KEYDOWN:
return self.key_down(event)
elif event.type == pygame.KEYUP:
return self.key_up(event)
def key_down(self, event):
if event.unicode is not None\
and len(event.unicode) > 0 and event.key not in \
InputManager.special_keys:
return InputEvent(InputManager.key, None, None, None,
None, event.unicode)
else:
self.last_key = event.key
self.down_time = time.time()
return None
def key_up(self, event):
if self.last_key == event.key:
if self.last_key == pygame.K_DOWN:
direction = InputManager.down
elif self.last_key == pygame.K_UP:
direction = InputManager.up
elif self.last_key == pygame.K_LEFT:
direction = InputManager.left
elif self.last_key == pygame.K_RIGHT:
direction = InputManager.right
elif self.last_key == pygame.K_RETURN:
direction = InputManager.enter
else:
return None
if direction is not None:
if time.time() - self.down_time > \
InputManager.long_click_min_time:
longpress = True
else:
longpress = False
return InputEvent(InputManager.key, None, None, None,
direction, self.last_key,
longpress=longpress)
def mouse_down(self, event):
self.down_pos = event.pos
self.down_button = event.button
self.down_time = time.time()
def mouse_up(self, event):
self.up_pos = event.pos
if abs(self.down_pos[0] -
self.up_pos[0]) < self.max_move_margin:
if abs(self.down_pos[1] -
self.up_pos[1]) < self.max_move_margin:
if time.time() - InputManager.long_click_min_time > \
self.down_time:
return InputEvent(InputManager.long_click,
self.down_pos,
self.up_pos, None, None)
else:
return InputEvent(InputManager.click,
self.down_pos,
self.up_pos, None, None)
elif abs(self.down_pos[1] - self.up_pos[1])\
> self.min_swipe_move:
return InputEvent(InputManager.swipe, self.down_pos,
self.up_pos, True, None)
elif self.down_pos[1] - self.up_pos[1] < self.max_move_margin:
if abs(self.down_pos[0] - self.up_pos[0]) > \
self.min_swipe_move:
return InputEvent(InputManager.swipe, self.down_pos,
self.up_pos, False, None)
class InputEvent:
def __init__(self, event_type, down_pos, current_pos, vertical,
direction, unicode=None, longpress=False):
self.type = event_type
self.down_pos = down_pos
self.current_pos = current_pos
self.unicode = unicode
self.longpress = longpress
if event_type is InputManager.swipe and direction is None:
if vertical:
if self.down_pos[1] < self.current_pos[1]:
self.direction = InputManager.down
else:
self.direction = InputManager.up
else:
if self.down_pos[0] < self.current_pos[0]:
self.direction = InputManager.right
else:
self.direction = InputManager.left
else:
self.direction = direction