151 lines
5.4 KiB
Python
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"
|
|
)
|