add Ticker
This commit is contained in:
parent
9cd9aa8a04
commit
de33e99703
@ -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
|
||||||
),
|
),
|
||||||
|
|||||||
60
ezgg_website/components/ticker.py
Normal file
60
ezgg_website/components/ticker.py
Normal 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)
|
||||||
Loading…
Reference in New Issue
Block a user