feat(demo): add HUD effect, resize handling, and tests

- Add HUD effect plugin showing FPS, effect name, intensity bar, pipeline
- Add pygame window resize handling (VIDEORESIZE event)
- Move HUD to end of chain so it renders on top
- Fix monitor stats API (returns dict, not object)
- Add tests/test_hud.py for HUD effect verification
This commit is contained in:
2026-03-16 01:25:08 -07:00
parent 0152e32115
commit e1408dcf16
4 changed files with 141 additions and 5 deletions

View File

@@ -36,6 +36,7 @@ class PygameDisplay:
self._pygame = None
self._screen = None
self._font = None
self._resized = False
def _get_font_path(self) -> str | None:
"""Get font path for rendering."""
@@ -110,7 +111,10 @@ class PygameDisplay:
pygame.init()
pygame.display.set_caption("Mainline")
self._screen = pygame.display.set_mode((self.window_width, self.window_height))
self._screen = pygame.display.set_mode(
(self.window_width, self.window_height),
pygame.RESIZABLE,
)
self._pygame = pygame
PygameDisplay._pygame_initialized = True
@@ -136,6 +140,12 @@ class PygameDisplay:
for event in self._pygame.event.get():
if event.type == self._pygame.QUIT:
sys.exit(0)
elif event.type == self._pygame.VIDEORESIZE:
self.window_width = event.w
self.window_height = event.h
self.width = max(1, self.window_width // self.cell_width)
self.height = max(1, self.window_height // self.cell_height)
self._resized = True
self._screen.fill((0, 0, 0))
@@ -175,6 +185,16 @@ class PygameDisplay:
self._screen.fill((0, 0, 0))
self._pygame.display.flip()
def get_dimensions(self) -> tuple[int, int]:
"""Get current terminal dimensions based on window size.
Returns:
(width, height) in character cells
"""
if self._resized:
self._resized = False
return self.width, self.height
def cleanup(self, quit_pygame: bool = True) -> None:
"""Cleanup display resources.