ui: runtime-scaled layout for 640x480 and 720x720 displays

This commit is contained in:
Matteo Benedetto
2026-03-22 16:57:24 +01:00
parent 527e63a769
commit 544ed8bc6d
5 changed files with 270 additions and 115 deletions
+41 -3
View File
@@ -1,5 +1,6 @@
from __future__ import annotations
import ctypes
from queue import Queue
from r36s_dlna_browser.dlna.browser_state import BrowserState
@@ -12,12 +13,13 @@ from r36s_dlna_browser.ui.sdl_app import SDLApp, Screen
class DummyPlayer:
def __init__(self) -> None:
self._new_frame = False
self.viewport = None
def attach_window(self, _window) -> None:
pass
def set_viewport(self, *_args) -> None:
pass
def set_viewport(self, *args) -> None:
self.viewport = args
def has_new_frame(self) -> bool:
return self._new_frame
@@ -119,4 +121,40 @@ def test_paused_playback_keeps_hud_visible_in_auto_mode(monkeypatch) -> None:
app._refresh_playback_hud_visibility()
assert app._state.playback_hud_visible is True
assert app._state.playback_hud_visible is True
def test_layout_scales_for_square_display() -> None:
compact = theme.get_layout(640, 480)
square = theme.get_layout(720, 720)
assert square.visible_items > compact.visible_items
assert square.list_item_h > compact.list_item_h
assert square.playback_hud_top > compact.playback_hud_top
def test_sync_player_viewport_uses_runtime_layout(monkeypatch) -> None:
app = _make_app()
app._window = object()
def fake_get_window_size(_window, width_ptr, height_ptr):
width = ctypes.cast(width_ptr, ctypes.POINTER(ctypes.c_int))
height = ctypes.cast(height_ptr, ctypes.POINTER(ctypes.c_int))
width.contents.value = 720
height.contents.value = 720
monkeypatch.setattr(sdl_app_module.sdl2, "SDL_GetWindowSize", fake_get_window_size)
app._sync_player_viewport()
layout = app._layout
assert layout.width == 720
assert layout.height == 720
assert app._player.viewport == (
720,
720,
layout.playback_hud_top,
720 - layout.playback_video_bottom,
layout.playback_video_left,
720 - layout.playback_video_right,
)