add Ticker

This commit is contained in:
David Rodenkirchen 2024-05-27 06:59:02 +02:00
parent 9cd9aa8a04
commit de33e99703
2 changed files with 80 additions and 4 deletions

View File

@ -1,7 +1,8 @@
from pathlib import Path
import rio import rio
from from_root import from_root from from_root import from_root
from rio import TextStyle
from ezgg_website.components.ticker import Ticker
class Header(rio.Component): class Header(rio.Component):
@ -9,9 +10,24 @@ class Header(rio.Component):
return rio.Column( return rio.Column(
rio.Rectangle( rio.Rectangle(
content=rio.Column( content=rio.Column(
rio.Row(
rio.Link( rio.Link(
rio.Image(from_root("ezgg_website/assets/placeholder_logo_grey.png"), align_x=0, width=8), rio.Image(from_root("ezgg_website/assets/placeholder_logo_grey.png"), align_x=0, width=8),
"/" "/"
),
Ticker(
texts=[
"Can this Tick?",
"Yes it can!",
"Rio is awesome",
"Look at them suckers still using JS"
],
refresh_interval=5,
tick_in_order=True,
style=TextStyle(italic=True),
width="grow",
justify="right"
)
), ),
margin=1 margin=1
), ),

View File

@ -0,0 +1,60 @@
import asyncio
import logging
from random import randint
from rio import Text, Component, TextStyle
class Ticker(Component):
def __init__(self, texts: list[str], refresh_interval: float, style: TextStyle, tick_in_order: bool, **kwargs) -> None:
super().__init__()
if refresh_interval <= 0:
raise ValueError("refresh_interval must be greater than zero")
self.kwargs = kwargs
self.kwargs.pop("text", None)
self.kwargs.pop("style", None)
self.texts = texts
self.refresh_interval = refresh_interval
self.style = style
self._tick_in_order = tick_in_order
self._last_text = -1
self.task = asyncio.get_event_loop().create_task(self._set_next_text())
def stop_ticking(self) -> None:
self.task.cancel()
def start_ticking(self) -> None:
if not self.task.cancelled():
self.task.cancel()
self.task = asyncio.get_event_loop().create_task(self._set_next_text())
def set_new_texts(self, new_texts: list[str]) -> None:
self.stop_ticking()
self._last_text = -1
self.texts = new_texts
self.start_ticking()
def add_text(self, text: str) -> None:
self.texts.append(text)
def build(self) -> Component:
try:
self.kwargs["text"] = self.texts[self._last_text]
return Text(**self.kwargs, style=self.style)
except Exception as e:
logging.error(e)
logging.error("Ticker stopped due to an exception")
self.stop_ticking()
async def _set_next_text(self) -> None:
while True:
if self._tick_in_order:
self._last_text += 1
if self._last_text >= len(self.texts):
self._last_text = 0
else:
self._last_text = randint(0, len(self.texts) - 1)
await self.force_refresh()
await asyncio.sleep(self.refresh_interval)