ezgg-lan-manager/src/ez_lan_manager/components/NewsPost.py
2025-07-26 12:23:26 +00:00

151 lines
5.4 KiB
Python

from datetime import datetime
from functools import partial
from typing import Optional, Callable
from rio import Component, Rectangle, Text, TextStyle, Column, Row, TextInput, DateInput, MultiLineTextInput, IconButton, Color, Button, ThemeContextSwitcher
class NewsPost(Component):
title: str = ""
text: str = ""
date: str = ""
subtitle: str = ""
author: str = ""
def build(self) -> Component:
return Rectangle(
content=Column(
Row(
Text(
self.title,
grow_x=True,
margin=2,
margin_bottom=0,
fill=self.session.theme.background_color,
style=TextStyle(
font_size=1.3
),
overflow="ellipsize"
),
Text(
self.date,
margin=2,
align_x=1,
fill=self.session.theme.background_color,
style=TextStyle(
font_size=0.6
),
overflow="wrap"
)
),
Text(
self.subtitle,
grow_x=True,
margin=2,
margin_top=0,
margin_bottom=0,
fill=self.session.theme.background_color,
style=TextStyle(
font_size=0.8
),
overflow="ellipsize"
),
Text(
self.text,
margin=2,
fill=self.session.theme.background_color,
overflow="wrap"
),
Text(
f"Geschrieben von {self.author}",
align_x=0,
grow_x=True,
margin=2,
margin_top=0,
margin_bottom=1,
fill=self.session.theme.background_color,
style=TextStyle(
font_size=0.5,
italic=True
),
overflow="nowrap"
)
),
fill=self.session.theme.primary_color,
margin_left=1,
margin_right=1,
margin_top=2,
margin_bottom=1,
shadow_radius=0.5,
shadow_color=self.session.theme.hud_color,
shadow_offset_y=0,
corner_radius=0.2
)
class EditableNewsPost(NewsPost):
news_id: int = -1
save_cb: Callable = lambda _: None
delete_cb: Callable = lambda _: None
def set_prop(self, prop, value) -> None:
self.__setattr__(prop, value)
def build(self) -> Component:
return ThemeContextSwitcher(
content=Rectangle(
content=Column(
Row(
TextInput(
text=self.title,
label="Titel",
style="rounded",
min_width=15,
on_change=lambda e: self.set_prop("title", e.text)
),
DateInput(
value=datetime.strptime(self.date, "%d.%m.%Y"),
style="rounded",
on_change=lambda e: self.set_prop("date", e.value.strftime("%d.%m.%Y"))
)
),
TextInput(
text=self.subtitle,
label="Untertitel",
style="rounded",
grow_x=True,
on_change=lambda e: self.set_prop("subtitle", e.text)
),
MultiLineTextInput(
text=self.text,
label="Text",
style="rounded",
grow_x=True,
min_height=12,
on_change=lambda e: self.set_prop("text", e.text)
),
Row(
TextInput(
text=self.author,
label="Autor",
style="rounded",
grow_x=True,
on_change=lambda e: self.set_prop("author", e.text)
),
Rectangle(content=Button(icon="material/delete", style="major", color="danger", shape="rectangle", on_press=partial(self.delete_cb, self.news_id)), fill=Color.from_hex("0b7372")),
Rectangle(content=Button(icon="material/save", style="major", color="success", shape="rectangle", on_press=partial(self.save_cb, self)), fill=Color.from_hex("0b7372"))
)
),
fill=self.session.theme.primary_color,
margin_left=1,
margin_right=1,
margin_top=2,
margin_bottom=1,
shadow_radius=0.2,
shadow_color=self.session.theme.background_color,
shadow_offset_y=0,
corner_radius=0.2
),
color="primary"
)