58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
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
|
|
)
|