Homepage/ezgg_website/components/news_post.py
David Rodenkirchen 8c3ef14769 add news 060624
2024-06-06 22:03:59 +02:00

63 lines
2.0 KiB
Python

from pathlib import Path
from typing import Optional
import rio
class NewsPost(rio.Component):
header: str
date: str
article_text_path_or_text: str | Path
images: list[Path]
article_text = ""
@rio.event.on_populate
def on_populate(self):
self.align_y = 0
self.margin_top = 0
self.margin_bottom = 2
self.margin_right = 1
if isinstance(self.article_text_path_or_text, str):
self.article_text = self.article_text_path_or_text
elif isinstance(self.article_text_path_or_text, Path):
with open(self.article_text_path_or_text, "r", encoding="utf-8") as f:
self.article_text = f.read()
def build(self) -> rio.Component:
image_column = rio.Column(margin=0.5)
for image_path in self.images:
image_column.add(rio.Image(image_path, fill_mode="fit", width=18, height=18, align_x=0.01))
return rio.Rectangle(
content=rio.Column(
rio.Row(
rio.Text(self.header, align_x=0.1, style="heading2"),
rio.Text(self.date, align_x=0.9, style=rio.TextStyle(italic=True)),
margin_top=0.5
),
rio.Column(
rio.Markdown(self.article_text, margin=1)
),
image_column
),
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_news_post(header: str, article_text_path_or_text: str | Path, date: str, images: Optional[list[Path]] = None) -> NewsPost:
if images is None:
images = []
return NewsPost(
header=header,
article_text_path_or_text=article_text_path_or_text,
images=images,
date=date,
align_y=0,
margin_top=0,
margin_bottom=2,
margin_right=1
)