39 lines
1.3 KiB
Python
39 lines
1.3 KiB
Python
from asyncio import sleep
|
|
|
|
from rio import Text, Component, TextStyle
|
|
|
|
|
|
class AnimatedText(Component):
|
|
def __post_init__(self) -> None:
|
|
self._display_printing: list[bool] = [False]
|
|
self.text_comp = Text("")
|
|
|
|
async def display_text(self, success: bool, text: str, speed: float = 0.06, font_size: float = 0.9) -> None:
|
|
if self._display_printing[0]:
|
|
return
|
|
else:
|
|
self._display_printing[0] = True
|
|
self.text_comp.text = ""
|
|
if success:
|
|
self.text_comp.style = TextStyle(
|
|
fill=self.session.theme.success_color,
|
|
font_size=font_size
|
|
)
|
|
for c in text:
|
|
self.text_comp.text = self.text_comp.text + c
|
|
await self.text_comp.force_refresh()
|
|
await sleep(speed)
|
|
else:
|
|
self.text_comp.style = TextStyle(
|
|
fill=self.session.theme.danger_color,
|
|
font_size=font_size
|
|
)
|
|
for c in text:
|
|
self.text_comp.text = self.text_comp.text + c
|
|
await self.text_comp.force_refresh()
|
|
await sleep(speed)
|
|
self._display_printing[0] = False
|
|
|
|
def build(self) -> Component:
|
|
return self.text_comp
|