from pathlib import Path from dataclasses import dataclass from typing import Optional import rio @dataclass class MemberInfo: picture_path: Path name: str position: str entry_date: str contact_mail: Optional[str] contact_steam: Optional[str] class MemberCard(rio.Component): info: MemberInfo def build(self) -> rio.Component: contact_row = rio.Row() content = rio.Column( rio.Image(self.info.picture_path, height=9, margin_bottom=1.3, margin_top=0.8), rio.Text(self.info.name, margin_bottom=0.4, style=rio.TextStyle(font_weight="bold")), rio.Text(self.info.position, margin_bottom=0.4, style=rio.TextStyle(italic=True)), rio.Text(f"Mitglied seit {self.info.entry_date}", style=rio.TextStyle(italic=True), margin_bottom=0.4), contact_row ) # @Todo: Icon alignment broken if only one icon should be shown. if self.info.contact_mail: contact_row.add(rio.Link(rio.Icon("material/mail"), f"mailto://{self.info.contact_mail}", open_in_new_tab=True, margin_top=1, margin_bottom=1, align_x=0.9)) if self.info.contact_steam: contact_row.add(rio.Link(rio.Icon("custom/steam"), self.info.contact_steam, open_in_new_tab=True, margin_top=1, margin_bottom=1, align_x=0.1)) if not self.info.contact_steam and not self.info.contact_mail: contact_row.add(rio.Text("", margin_top=2)) return rio.Rectangle( content=content, fill=self.session.theme.neutral_color, corner_radius=self.session.theme.corner_radius_medium, shadow_radius=0.5, shadow_color=self.session.theme.hud_color, shadow_offset_y=0 ) def build_member_card(info: MemberInfo) -> MemberCard: return MemberCard( info=info, align_y=0, margin_top=0, margin_bottom=2, margin_right=1 )