from typing import Callable from rio import Component, Rectangle, Grid, Column, Row, Text, TextStyle, Color, PointerEventListener, Spacer from src.ezgg_lan_manager.components.SeatingPlanPixels import SeatPixel, WallPixel, InvisiblePixel, TextPixel from src.ezgg_lan_manager.types.Seat import Seat MAX_GRID_WIDTH_PIXELS = 34 MAX_GRID_HEIGHT_PIXELS = 60 class SeatingPlanLegend(Component): def build(self) -> Component: return Column( Text("Legende", style=TextStyle(fill=self.session.theme.neutral_color), justify="center", margin=1), Row( Spacer(), Rectangle( content=Text("Deluxe Platz", style=TextStyle(fill=self.session.theme.neutral_color, font_size=0.7), margin=0.2, justify="center"), fill=Color.TRANSPARENT, stroke_width=0.2, stroke_color=Color.from_hex("66ff99"), min_width=20 ), Spacer() ), Row( Rectangle( content=Column( Text(f"Freier Platz", style=TextStyle(fill=self.session.theme.primary_color, font_size=0.7), align_x=0.5, selectable=False), Text(f"", style=TextStyle(fill=self.session.theme.primary_color, font_size=0.9), align_x=0.5, selectable=False, overflow="wrap") ), min_width=1, min_height=1, fill=self.session.theme.success_color, grow_x=False, grow_y=False, hover_fill=self.session.theme.success_color, transition_time=0.4, ripple=True ), Rectangle( content=Column( Text(f"Belegter Platz", style=TextStyle(fill=self.session.theme.primary_color, font_size=0.7), align_x=0.5, selectable=False), Text(f"", style=TextStyle(fill=self.session.theme.primary_color, font_size=0.9), align_x=0.5, selectable=False, overflow="wrap") ), min_width=1, min_height=1, fill=self.session.theme.danger_color, grow_x=False, grow_y=False, hover_fill=self.session.theme.danger_color, transition_time=0.4, ripple=True ), Rectangle( content=Column( Text(f"Eigener Platz", style=TextStyle(fill=self.session.theme.primary_color, font_size=0.7), align_x=0.5, selectable=False), Text(f"", style=TextStyle(fill=self.session.theme.primary_color, font_size=0.9), align_x=0.5, selectable=False, overflow="wrap") ), min_width=1, min_height=1, fill=Color.from_hex("800080"), grow_x=False, grow_y=False, hover_fill=Color.from_hex("800080"), transition_time=0.4, ripple=True ), margin=1, spacing=1 ) ) 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) return seat if seat else Seat(seat_id="Z99", is_blocked=True, category="LUXUS", user=None) """ This seating plan is for the community center "Donsbach" """ def build(self) -> Component: grid = Grid() # Outlines for x in range(0, MAX_GRID_WIDTH_PIXELS): grid.add(WallPixel(), row=0, column=x) for y in range(0, MAX_GRID_HEIGHT_PIXELS): grid.add(WallPixel(), row=y, column=0) for x in range(0, MAX_GRID_WIDTH_PIXELS): grid.add(WallPixel(), row=MAX_GRID_HEIGHT_PIXELS, column=x) for y in range(0, 39): grid.add(WallPixel(), row=y, column=MAX_GRID_WIDTH_PIXELS) for y in range(43, MAX_GRID_HEIGHT_PIXELS + 1): grid.add(WallPixel(), row=y, column=MAX_GRID_WIDTH_PIXELS) for x in range(19, MAX_GRID_WIDTH_PIXELS): grid.add(WallPixel(), row=37, column=x) for x in range(19, MAX_GRID_WIDTH_PIXELS): grid.add(WallPixel(), row=46, column=x) for x in range(1, 15): grid.add(WallPixel(), row=46, column=x) # Gaderobe grid.add(PointerEventListener( TextPixel(text="Gaderobe"), on_press=lambda _: self.info_clicked_cb("Gaderobe") ), row=44, column=19, width=15, height=2) for x in range(19, MAX_GRID_WIDTH_PIXELS): grid.add(WallPixel(), row=28, column=x) for x in range(1, 15): grid.add(WallPixel(), row=28, column=x) # # Toilet grid.add(PointerEventListener( TextPixel(icon_name="material/wc"), on_press=lambda _: self.info_clicked_cb("Toilette") ), row=29, column=1, width=14, height=17) grid.add(PointerEventListener( TextPixel(text="Orga & Technik"), on_press=lambda _: self.info_clicked_cb("Hier bauen wir die Technik auf.") ), row=29, column=19, width=15, height=8) grid.add(PointerEventListener( TextPixel(text="Bar & Schnarchbereich"), on_press=lambda _: self.info_clicked_cb("Bier.") ), row=47, column=1, width=MAX_GRID_WIDTH_PIXELS-1, height=13) # # Block A grid.add(SeatPixel("A\n0\n1", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A01"), seat_orientation="left"), row=2, column=5, width=2, height=4) grid.add(SeatPixel("A\n0\n2", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A02"), seat_orientation="left"), row=6, column=5, width=2, height=4) grid.add(SeatPixel("A\n0\n3", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A03"), seat_orientation="left"), row=10, column=5, width=2, height=4) grid.add(SeatPixel("A\n0\n4", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A04"), seat_orientation="left"), row=15, column=5, width=2, height=4) grid.add(SeatPixel("A\n0\n5", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A05"), seat_orientation="left"), row=19, column=5, width=2, height=4) grid.add(SeatPixel("A\n0\n6", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A06"), seat_orientation="left"), row=23, column=5, width=2, height=4) grid.add(SeatPixel("A\n1\n0", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A10"), seat_orientation="left"), row=2, column=7, width=2, height=4) grid.add(SeatPixel("A\n1\n1", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A11"), seat_orientation="left"), row=6, column=7, width=2, height=4) grid.add(SeatPixel("A\n1\n2", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A12"), seat_orientation="left"), row=10, column=7, width=2, height=4) grid.add(SeatPixel("A\n1\n3", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A13"), seat_orientation="left"), row=15, column=7, width=2, height=4) grid.add(SeatPixel("A\n1\n4", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A14"), seat_orientation="left"), row=19, column=7, width=2, height=4) grid.add(SeatPixel("A\n1\n5", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("A15"), seat_orientation="left"), row=23, column=7, width=2, height=4) grid.add(SeatPixel("B\n0\n1", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B01"), seat_orientation="left"), row=2, column=26, width=2, height=4) grid.add(SeatPixel("B\n0\n2", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B02"), seat_orientation="left"), row=6, column=26, width=2, height=4) grid.add(SeatPixel("B\n0\n3", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B03"), seat_orientation="left"), row=10, column=26, width=2, height=4) grid.add(SeatPixel("B\n0\n4", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B04"), seat_orientation="left"), row=15, column=26, width=2, height=4) grid.add(SeatPixel("B\n0\n5", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B05"), seat_orientation="left"), row=19, column=26, width=2, height=4) grid.add(SeatPixel("B\n0\n6", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B06"), seat_orientation="left"), row=23, column=26, width=2, height=4) grid.add(SeatPixel("B\n1\n0", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B10"), seat_orientation="left"), row=2, column=28, width=2, height=4) grid.add(SeatPixel("B\n1\n1", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B11"), seat_orientation="left"), row=6, column=28, width=2, height=4) grid.add(SeatPixel("B\n1\n2", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B12"), seat_orientation="left"), row=10, column=28, width=2, height=4) grid.add(SeatPixel("B\n1\n3", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B13"), seat_orientation="left"), row=15, column=28, width=2, height=4) grid.add(SeatPixel("B\n1\n4", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B14"), seat_orientation="left"), row=19, column=28, width=2, height=4) grid.add(SeatPixel("B\n1\n5", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("B15"), seat_orientation="left"), row=23, column=28, width=2, height=4) return Rectangle( content=grid, grow_x=True, grow_y=True, stroke_color=self.session.theme.neutral_color, stroke_width=0.1, fill=self.session.theme.primary_color, margin=0.5 )