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