From 23e903a207dcc582f1ad22311ddbfb8e601d7ed9 Mon Sep 17 00:00:00 2001 From: David Rodenkirchen Date: Tue, 25 Mar 2025 23:59:10 +0100 Subject: [PATCH] add additional info to seating plan --- src/ez_lan_manager/components/SeatingPlan.py | 42 ++++++++++++++----- .../components/SeatingPlanInfoBox.py | 16 +++++-- src/ez_lan_manager/pages/SeatingPlanPage.py | 12 +++++- 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/ez_lan_manager/components/SeatingPlan.py b/src/ez_lan_manager/components/SeatingPlan.py index e8bb7d3..f95afd9 100644 --- a/src/ez_lan_manager/components/SeatingPlan.py +++ b/src/ez_lan_manager/components/SeatingPlan.py @@ -1,6 +1,6 @@ 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.types.Seat import Seat @@ -71,6 +71,7 @@ class SeatingPlanLegend(Component): class SeatingPlan(Component): seat_clicked_cb: Callable seating_info: list[Seat] + info_clicked_cb: Callable def get_seat(self, seat_id: str) -> Seat: 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) # 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 - 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 - 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 - 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 - grid.add(TextPixel(icon_name="material/wc"), row=1, column=42, width=19, height=10) - grid.add(TextPixel(icon_name="material/wc"), row=12, column=42, width=19, height=10) + grid.add(PointerEventListener( + 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 - 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( diff --git a/src/ez_lan_manager/components/SeatingPlanInfoBox.py b/src/ez_lan_manager/components/SeatingPlanInfoBox.py index e9ee57e..48cdd89 100644 --- a/src/ez_lan_manager/components/SeatingPlanInfoBox.py +++ b/src/ez_lan_manager/components/SeatingPlanInfoBox.py @@ -16,8 +16,9 @@ class SeatingPlanInfoBox(Component): seat_occupant: Optional[str] = None seat_price: Decimal = Decimal("0") is_blocked: bool = False - has_user_ticket = False - booking_button_text = "" + has_user_ticket: bool = False + booking_button_text: str = "" + override_text: str = "" # If this is set, all other functionality is disabled and the text is shown @event.on_populate async def check_ticket(self) -> None: @@ -34,6 +35,11 @@ class SeatingPlanInfoBox(Component): self.session.navigate_to("./buy_ticket") 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: return Spacer() if self.is_blocked: @@ -69,7 +75,9 @@ class SeatingPlanInfoBox(Component): grow_y=False, is_sensitive=not self.is_booking_blocked, 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, - style=TextStyle(fill=self.session.theme.neutral_color), overflow="wrap", justify="center"), + ) if self.session[SessionStorage].user_id else Text(f"Du musst eingeloggt sein um einen Sitzplatz zu buchen", + margin=1, + style=TextStyle(fill=self.session.theme.neutral_color), + overflow="wrap", justify="center"), min_height=10 ) diff --git a/src/ez_lan_manager/pages/SeatingPlanPage.py b/src/ez_lan_manager/pages/SeatingPlanPage.py index cd63a08..d12d03a 100644 --- a/src/ez_lan_manager/pages/SeatingPlanPage.py +++ b/src/ez_lan_manager/pages/SeatingPlanPage.py @@ -30,6 +30,7 @@ class SeatingPlanPage(Component): purchase_box_loading: bool = False purchase_box_success_msg: Optional[str] = None purchase_box_error_msg: Optional[str] = None + seating_info_text = "" is_booking_blocked: bool = False @event.on_populate @@ -47,6 +48,7 @@ class SeatingPlanPage(Component): self.is_booking_blocked = True async def on_seat_clicked(self, seat_id: str, _: PressEvent) -> None: + self.seating_info_text = "" self.show_info_box = True self.show_purchase_box = False seat = next(filter(lambda s: s.seat_id == seat_id, self.seating_info), None) @@ -62,6 +64,12 @@ class SeatingPlanPage(Component): else: 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: self.purchase_box_error_msg = msg self.purchase_box_success_msg = None @@ -119,7 +127,7 @@ class SeatingPlanPage(Component): Column( 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, - purchase_cb=self.on_purchase_clicked), + purchase_cb=self.on_purchase_clicked, override_text=self.seating_info_text), SeatingPurchaseBox( show=self.show_purchase_box, seat_id=self.current_seat_id, @@ -132,7 +140,7 @@ class SeatingPlanPage(Component): ) ), 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), Text("Sitzplan wird geladen", style=TextStyle(fill=self.session.theme.neutral_color), align_x=0.5, margin=1)) ),