From de33e99703bcaf146c30f4a093574383d6e98293 Mon Sep 17 00:00:00 2001 From: David Rodenkirchen Date: Mon, 27 May 2024 06:59:02 +0200 Subject: [PATCH] add Ticker --- ezgg_website/components/header.py | 24 ++++++++++--- ezgg_website/components/ticker.py | 60 +++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 ezgg_website/components/ticker.py diff --git a/ezgg_website/components/header.py b/ezgg_website/components/header.py index 0e4f167..d73538a 100644 --- a/ezgg_website/components/header.py +++ b/ezgg_website/components/header.py @@ -1,7 +1,8 @@ -from pathlib import Path - import rio from from_root import from_root +from rio import TextStyle + +from ezgg_website.components.ticker import Ticker class Header(rio.Component): @@ -9,9 +10,24 @@ class Header(rio.Component): return rio.Column( rio.Rectangle( content=rio.Column( + rio.Row( 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 ), diff --git a/ezgg_website/components/ticker.py b/ezgg_website/components/ticker.py new file mode 100644 index 0000000..d98e970 --- /dev/null +++ b/ezgg_website/components/ticker.py @@ -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)