add additional info to seating plan

This commit is contained in:
David Rodenkirchen 2025-03-25 23:59:10 +01:00
parent 8aee3af9d7
commit 23e903a207
3 changed files with 54 additions and 16 deletions

View File

@ -1,6 +1,6 @@
from typing import Callable from typing import Callable
from rio import Component, Rectangle, Grid, Column, Row, Text, TextStyle, Color from rio import Component, Rectangle, Grid, Column, Row, Text, TextStyle, Color, PointerEventListener
from src.ez_lan_manager.components.SeatingPlanPixels import SeatPixel, WallPixel, InvisiblePixel, TextPixel from src.ez_lan_manager.components.SeatingPlanPixels import SeatPixel, WallPixel, InvisiblePixel, TextPixel
from src.ez_lan_manager.types.Seat import Seat from src.ez_lan_manager.types.Seat import Seat
@ -71,6 +71,7 @@ class SeatingPlanLegend(Component):
class SeatingPlan(Component): class SeatingPlan(Component):
seat_clicked_cb: Callable seat_clicked_cb: Callable
seating_info: list[Seat] seating_info: list[Seat]
info_clicked_cb: Callable
def get_seat(self, seat_id: str) -> Seat: def get_seat(self, seat_id: str) -> Seat:
seat = next(filter(lambda seat_: seat_.seat_id == seat_id, self.seating_info), None) seat = next(filter(lambda seat_: seat_.seat_id == seat_id, self.seating_info), None)
@ -208,23 +209,44 @@ class SeatingPlan(Component):
grid.add(SeatPixel("E15", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("E15")), row=25, column=17, width=3, height=2) grid.add(SeatPixel("E15", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("E15")), row=25, column=17, width=3, height=2)
# Stage # Stage
grid.add(TextPixel(text="Bühne"), row=16, column=1, width=29, height=4) grid.add(PointerEventListener(
# TextPixel(text="Bühne"),
on_press=lambda _: self.info_clicked_cb("Hier darf ab Freitag 20 Uhr ebenfalls geschlafen werden.")
), row=16, column=1, width=29, height=4)
# Drinks # Drinks
grid.add(TextPixel(text="G\ne\nt\nr\nä\nn\nk\ne"), row=20, column=30, width=4, height=12) grid.add(PointerEventListener(
TextPixel(text="G\ne\nt\nr\nä\nn\nk\ne"),
on_press=lambda _: self.info_clicked_cb("Ich mag Bier, B - I - R")
), row=20, column=30, width=4, height=12)
# Main Entrance # Main Entrance
grid.add(TextPixel(text="H\na\nl\nl\ne\nn\n\ne\ni\nn\ng\na\nn\ng"), row=33, column=56, width=4, height=27) grid.add(PointerEventListener(
# TextPixel(text="H\na\nl\nl\ne\nn\n\ne\ni\nn\ng\na\nn\ng"),
on_press=lambda _: self.info_clicked_cb("Hallo, ich bin ein Haupteingang")
), row=33, column=56, width=4, height=27)
# Sleeping # Sleeping
grid.add(TextPixel(icon_name="material/bed"), row=1, column=1, width=20, height=14) grid.add(PointerEventListener(
TextPixel(icon_name="material/bed"),
on_press=lambda _: self.info_clicked_cb("In diesem Raum kann geschlafen werden.\nAchtung: Hier werden nicht alle Teilnehmer Platz finden.")
), row=1, column=1, width=20, height=14)
# Toilet # Toilet
grid.add(TextPixel(icon_name="material/wc"), row=1, column=42, width=19, height=10) grid.add(PointerEventListener(
grid.add(TextPixel(icon_name="material/wc"), row=12, column=42, width=19, height=10) TextPixel(icon_name="material/wc"),
on_press=lambda _: self.info_clicked_cb("Damen Toilette")
), row=1, column=42, width=19, height=10)
grid.add(PointerEventListener(
TextPixel(icon_name="material/wc"),
on_press=lambda _: self.info_clicked_cb("Herren Toilette")
), row=12, column=42, width=19, height=10)
# Entry/Helpdesk # Entry/Helpdesk
grid.add(TextPixel(text="Einlass\n &Orga"), row=40, column=22, width=8, height=12) grid.add(PointerEventListener(
TextPixel(text="Einlass\n &Orga"),
on_press=lambda _: self.info_clicked_cb("Für alle Anliegen findest du hier rund um die Uhr jemanden vom Team.")
), row=40, column=22, width=8, height=12)
return Rectangle( return Rectangle(

View File

@ -16,8 +16,9 @@ class SeatingPlanInfoBox(Component):
seat_occupant: Optional[str] = None seat_occupant: Optional[str] = None
seat_price: Decimal = Decimal("0") seat_price: Decimal = Decimal("0")
is_blocked: bool = False is_blocked: bool = False
has_user_ticket = False has_user_ticket: bool = False
booking_button_text = "" booking_button_text: str = ""
override_text: str = "" # If this is set, all other functionality is disabled and the text is shown
@event.on_populate @event.on_populate
async def check_ticket(self) -> None: async def check_ticket(self) -> None:
@ -34,6 +35,11 @@ class SeatingPlanInfoBox(Component):
self.session.navigate_to("./buy_ticket") self.session.navigate_to("./buy_ticket")
def build(self) -> Component: def build(self) -> Component:
if self.override_text:
return Column(Text(self.override_text, margin=1,
style=TextStyle(fill=self.session.theme.neutral_color, font_size=1.4), overflow="wrap",
justify="center"), min_height=10)
if not self.show: if not self.show:
return Spacer() return Spacer()
if self.is_blocked: if self.is_blocked:
@ -69,7 +75,9 @@ class SeatingPlanInfoBox(Component):
grow_y=False, grow_y=False,
is_sensitive=not self.is_booking_blocked, is_sensitive=not self.is_booking_blocked,
on_press=self.purchase_clicked on_press=self.purchase_clicked
) if self.session[SessionStorage].user_id else Text(f"Du musst eingeloggt sein um einen Sitzplatz zu buchen", margin=1, ) if self.session[SessionStorage].user_id else Text(f"Du musst eingeloggt sein um einen Sitzplatz zu buchen",
style=TextStyle(fill=self.session.theme.neutral_color), overflow="wrap", justify="center"), margin=1,
style=TextStyle(fill=self.session.theme.neutral_color),
overflow="wrap", justify="center"),
min_height=10 min_height=10
) )

View File

@ -30,6 +30,7 @@ class SeatingPlanPage(Component):
purchase_box_loading: bool = False purchase_box_loading: bool = False
purchase_box_success_msg: Optional[str] = None purchase_box_success_msg: Optional[str] = None
purchase_box_error_msg: Optional[str] = None purchase_box_error_msg: Optional[str] = None
seating_info_text = ""
is_booking_blocked: bool = False is_booking_blocked: bool = False
@event.on_populate @event.on_populate
@ -47,6 +48,7 @@ class SeatingPlanPage(Component):
self.is_booking_blocked = True self.is_booking_blocked = True
async def on_seat_clicked(self, seat_id: str, _: PressEvent) -> None: async def on_seat_clicked(self, seat_id: str, _: PressEvent) -> None:
self.seating_info_text = ""
self.show_info_box = True self.show_info_box = True
self.show_purchase_box = False self.show_purchase_box = False
seat = next(filter(lambda s: s.seat_id == seat_id, self.seating_info), None) seat = next(filter(lambda s: s.seat_id == seat_id, self.seating_info), None)
@ -62,6 +64,12 @@ class SeatingPlanPage(Component):
else: else:
self.current_seat_occupant = None self.current_seat_occupant = None
async def on_info_clicked(self, text: str) -> None:
self.show_info_box = True
self.show_purchase_box = False
self.current_seat_id = None
self.seating_info_text = text
def set_error(self, msg: str) -> None: def set_error(self, msg: str) -> None:
self.purchase_box_error_msg = msg self.purchase_box_error_msg = msg
self.purchase_box_success_msg = None self.purchase_box_success_msg = None
@ -119,7 +127,7 @@ class SeatingPlanPage(Component):
Column( Column(
SeatingPlanInfoBox(seat_id=self.current_seat_id, seat_occupant=self.current_seat_occupant, seat_price=self.current_seat_price, SeatingPlanInfoBox(seat_id=self.current_seat_id, seat_occupant=self.current_seat_occupant, seat_price=self.current_seat_price,
is_blocked=self.current_seat_is_blocked, is_booking_blocked=self.is_booking_blocked, show=self.show_info_box, is_blocked=self.current_seat_is_blocked, is_booking_blocked=self.is_booking_blocked, show=self.show_info_box,
purchase_cb=self.on_purchase_clicked), purchase_cb=self.on_purchase_clicked, override_text=self.seating_info_text),
SeatingPurchaseBox( SeatingPurchaseBox(
show=self.show_purchase_box, show=self.show_purchase_box,
seat_id=self.current_seat_id, seat_id=self.current_seat_id,
@ -132,7 +140,7 @@ class SeatingPlanPage(Component):
) )
), ),
MainViewContentBox( MainViewContentBox(
SeatingPlan(seat_clicked_cb=self.on_seat_clicked, seating_info=self.seating_info) if self.seating_info else SeatingPlan(seat_clicked_cb=self.on_seat_clicked, seating_info=self.seating_info, info_clicked_cb=self.on_info_clicked) if self.seating_info else
Column(ProgressCircle(color=self.session.theme.secondary_color, margin=3), Column(ProgressCircle(color=self.session.theme.secondary_color, margin=3),
Text("Sitzplan wird geladen", style=TextStyle(fill=self.session.theme.neutral_color), align_x=0.5, margin=1)) Text("Sitzplan wird geladen", style=TextStyle(fill=self.session.theme.neutral_color), align_x=0.5, margin=1))
), ),