mirror of
https://github.com/Febbweiss/mopidy-touchscreen.git
synced 2026-03-05 06:35:43 +00:00
Key presses detection
This commit is contained in:
@@ -6,10 +6,11 @@ import pygame
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class TouchManager():
|
class InputManager():
|
||||||
click = 1
|
click = 1
|
||||||
swipe = 2
|
swipe = 2
|
||||||
long_click = 3
|
long_click = 3
|
||||||
|
key = 4
|
||||||
|
|
||||||
long_click_min_time = 0.3
|
long_click_min_time = 0.3
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@ class TouchManager():
|
|||||||
down = 1
|
down = 1
|
||||||
left = 2
|
left = 2
|
||||||
right = 3
|
right = 3
|
||||||
|
enter = 4
|
||||||
|
|
||||||
def __init__(self, size):
|
def __init__(self, size):
|
||||||
self.down_pos = (0, 0)
|
self.down_pos = (0, 0)
|
||||||
@@ -26,32 +28,57 @@ class TouchManager():
|
|||||||
self.min_swipe_move = self.screen_size[1] / 3
|
self.min_swipe_move = self.screen_size[1] / 3
|
||||||
self.down_button = -1
|
self.down_button = -1
|
||||||
self.down_time = -1
|
self.down_time = -1
|
||||||
|
self.last_key = -1
|
||||||
|
|
||||||
def event(self, event):
|
def event(self, event):
|
||||||
|
|
||||||
if event.type == pygame.MOUSEBUTTONUP:
|
if event.type == pygame.MOUSEBUTTONUP:
|
||||||
if event.button == 4:
|
if event.button == 4:
|
||||||
touch_event = TouchEvent(TouchManager.swipe, self.down_pos,
|
touch_event = InputEvent(InputManager.swipe, self.down_pos,
|
||||||
self.up_pos, True)
|
self.up_pos, True, InputManager.up)
|
||||||
touch_event.direction = TouchManager.up
|
|
||||||
return touch_event
|
return touch_event
|
||||||
elif event.button == 5:
|
elif event.button == 5:
|
||||||
touch_event = TouchEvent(TouchManager.swipe, self.down_pos,
|
touch_event = InputEvent(InputManager.swipe, self.down_pos,
|
||||||
self.up_pos, True)
|
self.up_pos, True, InputManager.down)
|
||||||
touch_event.direction = TouchManager.down
|
|
||||||
return touch_event
|
return touch_event
|
||||||
elif event.button == 1 and self.down_button == 1:
|
elif event.button == 1 and self.down_button == 1:
|
||||||
touch_event = self.mouse_up(event)
|
touch_event = self.mouse_up(event)
|
||||||
return touch_event
|
return touch_event
|
||||||
elif event.button == 3 and self.down_button == 3:
|
elif event.button == 3 and self.down_button == 3:
|
||||||
touch_event = TouchEvent(TouchManager.long_click,
|
touch_event = InputEvent(InputManager.long_click,
|
||||||
self.down_pos, self.up_pos, None)
|
self.down_pos, self.up_pos, None, None)
|
||||||
return touch_event
|
return touch_event
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
elif event.type == pygame.MOUSEBUTTONDOWN:
|
elif event.type == pygame.MOUSEBUTTONDOWN:
|
||||||
self.mouse_down(event)
|
self.mouse_down(event)
|
||||||
return None
|
return None
|
||||||
|
elif event.type == pygame.KEYDOWN:
|
||||||
|
self.key_down(event)
|
||||||
|
return None
|
||||||
|
elif event.type == pygame.KEYUP:
|
||||||
|
return self.key_up(event)
|
||||||
|
|
||||||
|
def key_down(self, event):
|
||||||
|
self.last_key = event.key
|
||||||
|
self.down_time = time.time()
|
||||||
|
|
||||||
|
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:
|
||||||
|
return InputEvent(InputManager.key, None, None, None, direction)
|
||||||
|
|
||||||
def mouse_down(self, event):
|
def mouse_down(self, event):
|
||||||
self.down_pos = event.pos
|
self.down_pos = event.pos
|
||||||
@@ -62,35 +89,37 @@ class TouchManager():
|
|||||||
self.up_pos = event.pos
|
self.up_pos = event.pos
|
||||||
if abs(self.down_pos[0] - self.up_pos[0]) < self.max_move_margin:
|
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 abs(self.down_pos[1] - self.up_pos[1]) < self.max_move_margin:
|
||||||
if time.time() - TouchManager.long_click_min_time > \
|
if time.time() - InputManager.long_click_min_time > \
|
||||||
self.down_time:
|
self.down_time:
|
||||||
return TouchEvent(TouchManager.long_click, self.down_pos,
|
return InputEvent(InputManager.long_click, self.down_pos,
|
||||||
self.up_pos, None)
|
self.up_pos, None, None)
|
||||||
else:
|
else:
|
||||||
return TouchEvent(TouchManager.click, self.down_pos,
|
return InputEvent(InputManager.click, self.down_pos,
|
||||||
self.up_pos, None)
|
self.up_pos, None, None)
|
||||||
elif abs(self.down_pos[1] - self.up_pos[1]) > self.min_swipe_move:
|
elif abs(self.down_pos[1] - self.up_pos[1]) > self.min_swipe_move:
|
||||||
return TouchEvent(TouchManager.swipe, self.down_pos,
|
return InputEvent(InputManager.swipe, self.down_pos,
|
||||||
self.up_pos, True)
|
self.up_pos, True, None)
|
||||||
elif self.down_pos[1] - self.up_pos[1] < self.max_move_margin:
|
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:
|
if abs(self.down_pos[0] - self.up_pos[0]) > self.min_swipe_move:
|
||||||
return TouchEvent(TouchManager.swipe, self.down_pos,
|
return InputEvent(InputManager.swipe, self.down_pos,
|
||||||
self.up_pos, False)
|
self.up_pos, False, None)
|
||||||
|
|
||||||
|
|
||||||
class TouchEvent():
|
class InputEvent():
|
||||||
def __init__(self, event_type, down_pos, current_pos, vertical):
|
def __init__(self, event_type, down_pos, current_pos, vertical, direction):
|
||||||
self.type = event_type
|
self.type = event_type
|
||||||
self.down_pos = down_pos
|
self.down_pos = down_pos
|
||||||
self.current_pos = current_pos
|
self.current_pos = current_pos
|
||||||
if event_type is TouchManager.swipe:
|
if event_type is InputManager.swipe and direction is None:
|
||||||
if vertical:
|
if vertical:
|
||||||
if self.down_pos[1] < self.current_pos[1]:
|
if self.down_pos[1] < self.current_pos[1]:
|
||||||
self.direction = TouchManager.down
|
self.direction = InputManager.down
|
||||||
else:
|
else:
|
||||||
self.direction = TouchManager.up
|
self.direction = InputManager.up
|
||||||
else:
|
else:
|
||||||
if self.down_pos[0] < self.current_pos[0]:
|
if self.down_pos[0] < self.current_pos[0]:
|
||||||
self.direction = TouchManager.right
|
self.direction = InputManager.right
|
||||||
else:
|
else:
|
||||||
self.direction = TouchManager.left
|
self.direction = InputManager.left
|
||||||
|
else:
|
||||||
|
self.direction = direction
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import logging
|
|||||||
import mopidy.models
|
import mopidy.models
|
||||||
|
|
||||||
from .list_view import ListView
|
from .list_view import ListView
|
||||||
from .touch_manager import TouchManager
|
from .input_manager import InputManager
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ class LibraryScreen():
|
|||||||
def touch_event(self, touch_event):
|
def touch_event(self, touch_event):
|
||||||
clicked = self.list_view.touch_event(touch_event)
|
clicked = self.list_view.touch_event(touch_event)
|
||||||
if clicked is not None:
|
if clicked is not None:
|
||||||
if touch_event.type == TouchManager.long_click:
|
if touch_event.type == InputManager.long_click:
|
||||||
if self.current_directory is not None:
|
if self.current_directory is not None:
|
||||||
if clicked == 0:
|
if clicked == 0:
|
||||||
self.go_up_directory()
|
self.go_up_directory()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from .screen_objects import ScreenObjectsManager, ScrollBar, TouchAndTextItem
|
from .screen_objects import ScreenObjectsManager, ScrollBar, TouchAndTextItem
|
||||||
from .touch_manager import TouchManager
|
from .input_manager import InputManager
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -60,8 +60,8 @@ class ListView():
|
|||||||
self.screen_objects.render(surface)
|
self.screen_objects.render(surface)
|
||||||
|
|
||||||
def touch_event(self, touch_event):
|
def touch_event(self, touch_event):
|
||||||
if touch_event.type == TouchManager.click \
|
if touch_event.type == InputManager.click \
|
||||||
or touch_event.type == TouchManager.long_click:
|
or touch_event.type == InputManager.long_click:
|
||||||
objects = self.screen_objects.get_touch_objects_in_pos(
|
objects = self.screen_objects.get_touch_objects_in_pos(
|
||||||
touch_event.current_pos)
|
touch_event.current_pos)
|
||||||
if objects is not None:
|
if objects is not None:
|
||||||
@@ -73,10 +73,10 @@ class ListView():
|
|||||||
self.move_to(direction)
|
self.move_to(direction)
|
||||||
else:
|
else:
|
||||||
return int(key)
|
return int(key)
|
||||||
elif touch_event.type == TouchManager.swipe:
|
elif touch_event.type == InputManager.swipe:
|
||||||
if touch_event.direction == TouchManager.up:
|
if touch_event.direction == InputManager.up:
|
||||||
self.move_to(-1)
|
self.move_to(-1)
|
||||||
elif touch_event.direction == TouchManager.down:
|
elif touch_event.direction == InputManager.down:
|
||||||
self.move_to(1)
|
self.move_to(1)
|
||||||
|
|
||||||
# Scroll to direction
|
# Scroll to direction
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import pygame
|
|||||||
|
|
||||||
from .screen_objects import (Progressbar, ScreenObjectsManager, TextItem,
|
from .screen_objects import (Progressbar, ScreenObjectsManager, TextItem,
|
||||||
TouchAndTextItem)
|
TouchAndTextItem)
|
||||||
from .touch_manager import TouchManager
|
from .input_manager import InputManager
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -211,7 +211,7 @@ class MainScreen():
|
|||||||
(size, size))
|
(size, size))
|
||||||
|
|
||||||
def touch_event(self, event):
|
def touch_event(self, event):
|
||||||
if event.type == TouchManager.click:
|
if event.type == InputManager.click:
|
||||||
objects = self.touch_text_manager.get_touch_objects_in_pos(
|
objects = self.touch_text_manager.get_touch_objects_in_pos(
|
||||||
event.current_pos)
|
event.current_pos)
|
||||||
if objects is not None:
|
if objects is not None:
|
||||||
@@ -224,19 +224,19 @@ class MainScreen():
|
|||||||
self.core.playback.previous()
|
self.core.playback.previous()
|
||||||
elif key == "next":
|
elif key == "next":
|
||||||
self.core.playback.next()
|
self.core.playback.next()
|
||||||
elif event.type == TouchManager.swipe:
|
elif event.type == InputManager.swipe:
|
||||||
if event.direction == TouchManager.left:
|
if event.direction == InputManager.left:
|
||||||
self.core.playback.next()
|
self.core.playback.next()
|
||||||
elif event.direction == TouchManager.right:
|
elif event.direction == InputManager.right:
|
||||||
self.core.playback.previous()
|
self.core.playback.previous()
|
||||||
elif event.direction == TouchManager.up:
|
elif event.direction == InputManager.up:
|
||||||
volume = self.core.playback.volume.get() + 10
|
volume = self.core.playback.volume.get() + 10
|
||||||
if volume > 100:
|
if volume > 100:
|
||||||
volume = 100
|
volume = 100
|
||||||
self.manager.backend.tell(
|
self.manager.backend.tell(
|
||||||
{'action': 'volume', 'value': volume})
|
{'action': 'volume', 'value': volume})
|
||||||
self.manager.volume_changed(volume)
|
self.manager.volume_changed(volume)
|
||||||
elif event.direction == TouchManager.down:
|
elif event.direction == InputManager.down:
|
||||||
volume = self.core.playback.volume.get() - 10
|
volume = self.core.playback.volume.get() - 10
|
||||||
if volume < 0:
|
if volume < 0:
|
||||||
volume = 0
|
volume = 0
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from .main_screen import MainScreen
|
|||||||
from .menu_screen import MenuScreen
|
from .menu_screen import MenuScreen
|
||||||
from .playlist_screen import PlaylistScreen
|
from .playlist_screen import PlaylistScreen
|
||||||
from .screen_objects import Progressbar, ScreenObjectsManager, TouchAndTextItem
|
from .screen_objects import Progressbar, ScreenObjectsManager, TouchAndTextItem
|
||||||
from .touch_manager import TouchManager
|
from .input_manager import InputManager
|
||||||
from .tracklist import Tracklist
|
from .tracklist import Tracklist
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -40,7 +40,7 @@ class ScreenManager():
|
|||||||
except:
|
except:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
self.track = None
|
self.track = None
|
||||||
self.touch_manager = TouchManager(size)
|
self.input_manager = InputManager(size)
|
||||||
self.screen_objects_manager = ScreenObjectsManager()
|
self.screen_objects_manager = ScreenObjectsManager()
|
||||||
|
|
||||||
# Top bar
|
# Top bar
|
||||||
@@ -147,17 +147,17 @@ class ScreenManager():
|
|||||||
self.screens[0].track_playback_ended(tl_track, time_position)
|
self.screens[0].track_playback_ended(tl_track, time_position)
|
||||||
|
|
||||||
def event(self, event):
|
def event(self, event):
|
||||||
touch_event = self.touch_manager.event(event)
|
event = self.input_manager.event(event)
|
||||||
if touch_event is not None:
|
if event is not None:
|
||||||
if touch_event.type == TouchManager.click:
|
if event.type == InputManager.click:
|
||||||
objects = self.screen_objects_manager.get_touch_objects_in_pos(
|
objects = self.screen_objects_manager.get_touch_objects_in_pos(
|
||||||
touch_event.current_pos)
|
event.current_pos)
|
||||||
if objects is not None:
|
if objects is not None:
|
||||||
for key in objects:
|
for key in objects:
|
||||||
if key == "volume":
|
if key == "volume":
|
||||||
manager = self.screen_objects_manager
|
manager = self.screen_objects_manager
|
||||||
volume = manager.get_touch_object(key)
|
volume = manager.get_touch_object(key)
|
||||||
pos = touch_event.current_pos
|
pos = event.current_pos
|
||||||
value = volume.get_pos_value(pos)
|
value = volume.get_pos_value(pos)
|
||||||
self.backend.tell(
|
self.backend.tell(
|
||||||
{'action': 'volume', 'value': value})
|
{'action': 'volume', 'value': value})
|
||||||
@@ -186,7 +186,7 @@ class ScreenManager():
|
|||||||
self.screens[4].check_connection()
|
self.screens[4].check_connection()
|
||||||
elif key[:-1] == "menu_":
|
elif key[:-1] == "menu_":
|
||||||
self.change_screen(int(key[-1:]))
|
self.change_screen(int(key[-1:]))
|
||||||
self.screens[self.current_screen].touch_event(touch_event)
|
self.screens[self.current_screen].touch_event(event)
|
||||||
|
|
||||||
def volume_changed(self, volume):
|
def volume_changed(self, volume):
|
||||||
if not self.core.playback.mute.get():
|
if not self.core.playback.mute.get():
|
||||||
|
|||||||
Reference in New Issue
Block a user