mirror of https://git.sr.ht/~michalr/menu
Initial screensaver support
This commit is contained in:
parent
c483d92a66
commit
607057868d
39
menu.py
39
menu.py
|
@ -4,7 +4,7 @@ import math
|
|||
import argparse
|
||||
import json
|
||||
from enum import Enum, auto
|
||||
from time import sleep
|
||||
from time import sleep, strftime
|
||||
from threading import Thread
|
||||
from queue import Queue, Empty
|
||||
from abc import abstractmethod
|
||||
|
@ -41,6 +41,26 @@ class IBoard:
|
|||
raise NotImplementedError()
|
||||
|
||||
|
||||
class Screensaver(IBoard):
|
||||
def handle_event(self, _):
|
||||
pass
|
||||
|
||||
|
||||
class ClockScreensaver(Screensaver):
|
||||
def __init__(self):
|
||||
self.font = pygame.freetype.SysFont(name="Sans", size=20)
|
||||
|
||||
def draw(self, screen: pygame.Surface):
|
||||
text = strftime("%H:%M:%S")
|
||||
screen.fill("black")
|
||||
pygame.Rect(0, 0, screen.get_width(), screen.get_height())
|
||||
text_rect = self.font.get_rect(text)
|
||||
text_pos = pygame.Rect((screen.get_width() - text_rect.width)/2,
|
||||
(screen.get_height() - text_rect.height)/2,
|
||||
text_rect.width, text_rect.height)
|
||||
self.font.render_to(screen, text_pos, text, fgcolor="pink")
|
||||
|
||||
|
||||
class Button:
|
||||
PRESS_OFFSET = 2
|
||||
|
||||
|
@ -140,6 +160,9 @@ class MenuBoard(IBoard):
|
|||
|
||||
|
||||
class App:
|
||||
FPS = 30
|
||||
TICKS_UNTIL_SCREENSAVER = 1 * FPS
|
||||
|
||||
def __init__(self, urls: List[Action], bg_color: str):
|
||||
pygame.init()
|
||||
info = pygame.display.Info()
|
||||
|
@ -151,6 +174,8 @@ class App:
|
|||
buttons.append(ButtonDef(text="Exit", cbk=self.quit))
|
||||
self.board: IBoard = MenuBoard(self.get_screen_rect(), buttons, bg_color)
|
||||
self.task_q = Queue()
|
||||
self.screensaver = ClockScreensaver()
|
||||
self.screensaver_ticks = self.TICKS_UNTIL_SCREENSAVER
|
||||
|
||||
def get_screen_rect(self) -> pygame.Rect:
|
||||
return pygame.Rect(0, 0, self.screen.get_width(), self.screen.get_height())
|
||||
|
@ -205,13 +230,19 @@ class App:
|
|||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
self.running = False
|
||||
self.board.handle_event(event)
|
||||
if self.screensaver_ticks != 0:
|
||||
self.board.handle_event(event)
|
||||
self.screensaver_ticks = self.TICKS_UNTIL_SCREENSAVER
|
||||
|
||||
self.board.draw(self.screen)
|
||||
if self.screensaver_ticks == 0:
|
||||
self.screensaver.draw(self.screen)
|
||||
else:
|
||||
self.board.draw(self.screen)
|
||||
self.screensaver_ticks -= 1
|
||||
|
||||
pygame.display.flip()
|
||||
|
||||
self.clock.tick(30)
|
||||
self.clock.tick(self.FPS)
|
||||
pygame.quit()
|
||||
|
||||
def quit(self):
|
||||
|
|
Loading…
Reference in New Issue