From 607057868d2376f3392c5ca80e2c248bd6678a56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Rudowicz?= Date: Mon, 9 Sep 2024 19:56:38 +0200 Subject: [PATCH] Initial screensaver support --- menu.py | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/menu.py b/menu.py index 3c7a045..d68d935 100644 --- a/menu.py +++ b/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):