Files
2026-07-16 08:31:52 +08:00

74 lines
2.4 KiB
Python

import json
from pathlib import Path
from led_platform.domain import PhysicalOutput, Tile
class TileStore:
def __init__(self, config_path: Path, wall_width: int, wall_height: int) -> None:
self.config_path = config_path
self.wall_width = wall_width
self.wall_height = wall_height
self._tiles: dict[str, Tile] = {}
self.reload()
def reload(self) -> None:
if self.config_path.exists():
data = json.loads(self.config_path.read_text(encoding="utf-8"))
tiles = [Tile(**item) for item in data["tiles"]]
else:
tiles = self._default_tiles()
self._tiles = {tile.id: tile for tile in tiles}
def all(self) -> list[Tile]:
return list(self._tiles.values())
def get(self, tile_id: str) -> Tile:
if tile_id not in self._tiles:
raise KeyError(tile_id)
return self._tiles[tile_id]
def ids(self) -> list[str]:
return list(self._tiles.keys())
def _default_tiles(self) -> list[Tile]:
half_width = self.wall_width // 2
return [
Tile(
id="left",
name="Left output server",
x=0,
y=0,
width=half_width,
height=self.wall_height,
wall_width=self.wall_width,
wall_height=self.wall_height,
desktop_width=7680,
desktop_height=4320,
physical_outputs=self._default_outputs("left"),
),
Tile(
id="right",
name="Right output server",
x=half_width,
y=0,
width=self.wall_width - half_width,
height=self.wall_height,
wall_width=self.wall_width,
wall_height=self.wall_height,
desktop_width=7680,
desktop_height=4320,
physical_outputs=self._default_outputs("right"),
),
]
@staticmethod
def _default_outputs(prefix: str) -> list[PhysicalOutput]:
return [
PhysicalOutput(id=f"{prefix}-1", index=1, x=0, y=0),
PhysicalOutput(id=f"{prefix}-2", index=2, x=3840, y=0),
PhysicalOutput(id=f"{prefix}-3", index=3, x=0, y=2160),
PhysicalOutput(id=f"{prefix}-4", index=4, x=3840, y=2160),
]