menu.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #!./bin/python3
  2. import os
  3. import yaml
  4. import pygame # type: ignore
  5. from typing import Dict
  6. import random
  7. import eyed3
  8. import tempfile
  9. import handler
  10. import handler.stream
  11. class Menu:
  12. '''
  13. Control object which holds the menu state.
  14. '''
  15. def __init__(self, config, display):
  16. self._display = display # Display object
  17. self._current_item = None # Current item with display control
  18. # Register default handlers
  19. self.handler = {
  20. "stream" : handler.stream.StreamHandler(config, display)
  21. }
  22. # Playlist data
  23. playlistsFile = config.get("playlists", "music.yml")
  24. self.playlists = yaml.safe_load(open(playlistsFile)).get("playlist", [])
  25. self.playlists_pointer = 0
  26. self.update()
  27. def update(self):
  28. # Delegate to the current item if there is one
  29. if self._current_item is not None:
  30. self._current_item.update()
  31. return
  32. # Show the slice of the main menu which is relevant
  33. playlist_display = []
  34. maxlines = self._display.drawlines
  35. for i, item in enumerate(self.playlists):
  36. if len(playlist_display) <= maxlines:
  37. if i >= self.playlists_pointer - maxlines and i <= self.playlists_pointer + maxlines:
  38. playlist_display.append(item.get("name", "<unknown>"))
  39. else:
  40. break
  41. playlist_pointer = self.playlists_pointer
  42. self._display.update(playlist_display, min(playlist_pointer, maxlines))
  43. def emitEvent(self, event):
  44. # Delegate to the current item if there is one
  45. if self._current_item is not None:
  46. try:
  47. self._current_item.emitEvent(event)
  48. except handler.HandlerExit as e:
  49. self._current_item = None
  50. self.update()
  51. return
  52. if event == handler.EVENT_RIGHT:
  53. self.selectPlaylistItem(self.playlists[self.playlists_pointer])
  54. if event == handler.EVENT_UP:
  55. self.playlists_pointer -=1
  56. if event == handler.EVENT_DOWN:
  57. self.playlists_pointer +=1
  58. if self.playlists_pointer >= len(self.playlists):
  59. self.playlists_pointer = 0
  60. if self.playlists_pointer < 0:
  61. self.playlists_pointer = len(self.playlists) - 1
  62. self.update()
  63. def selectPlaylistItem(self, item):
  64. handler = self.handler.get(item["type"])
  65. print("Selecting:", item)
  66. if handler is not None:
  67. handler.setPlaylistItem(item)
  68. self._current_item = handler