Co-authored-by: David Rodenkirchen <drodenkirchen@linetco.com> Reviewed-on: #32
61 lines
2.9 KiB
Python
61 lines
2.9 KiB
Python
from typing import Literal, Callable
|
|
|
|
from rio import Component, PointerEventListener, Rectangle, Image, Text, Tooltip, TextStyle, Color, Icon, Row, PointerEvent
|
|
|
|
from from_root import from_root
|
|
|
|
from src.ezgg_lan_manager.types.TournamentBase import TournamentStatus
|
|
|
|
|
|
class TournamentPageRow(Component):
|
|
tournament_id: int
|
|
tournament_name: str
|
|
game_image_name: str
|
|
current_participants: int
|
|
max_participants: int
|
|
tournament_status: TournamentStatus
|
|
clicked_cb: Callable
|
|
|
|
def handle_click(self, _: PointerEvent) -> None:
|
|
self.clicked_cb(self.tournament_id)
|
|
|
|
def determine_tournament_status_icon_color_and_text(self) -> tuple[str, Literal["success", "warning", "danger"], str]:
|
|
if self.tournament_status == TournamentStatus.OPEN:
|
|
return "material/lock_open", "success", "Anmeldung geöffnet"
|
|
elif self.tournament_status == TournamentStatus.CLOSED:
|
|
return "material/lock", "danger", "Anmeldung geschlossen"
|
|
elif self.tournament_status == TournamentStatus.ONGOING:
|
|
return "material/autoplay", "warning", "Turnier läuft"
|
|
elif self.tournament_status == TournamentStatus.COMPLETED:
|
|
return "material/check_circle", "success", "Turnier beendet"
|
|
elif self.tournament_status == TournamentStatus.CANCELED:
|
|
return "material/cancel", "danger", "Turnier abgesagt"
|
|
elif self.tournament_status == TournamentStatus.INVITE_ONLY:
|
|
return "material/person_cancel", "warning", "Teilnahme nur per Einladung"
|
|
else:
|
|
raise RuntimeError(f"Unknown tournament status: {str(self.tournament_status)}")
|
|
|
|
def build(self) -> Component:
|
|
icon_name, color, text = self.determine_tournament_status_icon_color_and_text()
|
|
return PointerEventListener(
|
|
content=Rectangle(
|
|
content=Row(
|
|
Image(image=from_root(f"src/ezgg_lan_manager/assets/img/games/{self.game_image_name}")),
|
|
Text(self.tournament_name, style=TextStyle(fill=self.session.theme.background_color, font_size=1)),
|
|
Text(f"{self.current_participants}/{self.max_participants}", style=TextStyle(fill=self.session.theme.background_color, font_size=1), justify="right", margin_right=0.5),
|
|
Tooltip(anchor=Icon(icon_name, min_width=1, min_height=1, fill=color), position="top",
|
|
tip=Text(text, style=TextStyle(fill=self.session.theme.background_color, font_size=0.7))),
|
|
proportions=[1, 4, 1, 1],
|
|
margin=.5
|
|
),
|
|
fill=self.session.theme.hud_color,
|
|
margin=1,
|
|
margin_bottom=0,
|
|
stroke_color=Color.TRANSPARENT,
|
|
stroke_width=0.2,
|
|
hover_stroke_color=self.session.theme.background_color,
|
|
cursor="pointer"
|
|
),
|
|
on_press=self.handle_click
|
|
)
|