Advertisement
javajeff13

slim_tui.py

Feb 10th, 2022 (edited)
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.12 KB | None | 0 0
  1. from __future__ import annotations
  2.  
  3. import lorem
  4. from ansi.colour import fg
  5. from ansi.colour.fx import reset
  6.  
  7. from random import choice
  8. from rich.panel import Panel
  9. from rich.text import Text
  10. from textual import events
  11. from textual.app import App
  12. from textual.widget import Widget
  13. from textual.widgets import Header, Footer
  14. from textual.reactive import Reactive
  15.  
  16. sections = 4 * [lorem.paragraph(), lorem.sentence(), lorem.text()]
  17. colours = ["red", "yellow", "green", "blue", "cyan", "magenta"]
  18. coloured_sections = []
  19. for section in sections:
  20.     foreground = choice(colours)
  21.     coloured_section = (eval(f"fg.{foreground}"), section, reset)
  22.     coloured_sections.append("".join(map(str, coloured_section)))
  23.  
  24.  
  25. class Hover(Widget):
  26.     mouse_over = Reactive(False)
  27.     folded = Reactive(False)
  28.  
  29.     def __init__(self, size: tuple = (0,0), text: str = "") -> None:
  30.         super().__init__(size)
  31.         self.text = text
  32.         self.panel = Panel(self.text)
  33.         self.folded = True
  34.         self.collapsed_size = 4
  35.         self.full_size = 6
  36.  
  37.     def render(self) -> Panel:
  38.         return Panel(
  39.             self.text,
  40.             style=("italic" if not self.mouse_over else "bold"),
  41.             height=self.collapsed_size if self.folded else self.full_size,
  42.         )
  43.  
  44.     def on_enter(self) -> None:
  45.         self.mouse_over = True
  46.  
  47.     def on_click(self) -> None:
  48.         self.folded = not (self.folded)
  49.  
  50.     def on_leave(self) -> None:
  51.         self.mouse_over = False
  52.  
  53.  
  54. class HoverApp(App):
  55.     async def on_load(self, event: events.Load) -> None:
  56.         await self.bind("t", "view.toggle('topbar')", "Toggle Overview")
  57.         await self.bind("q", "quit", "Quit")
  58.  
  59.     async def on_mount(self) -> None:
  60.         await self.view.dock(Header(), edge="top", size=1)
  61.         await self.view.dock(Footer(), edge="bottom")
  62.  
  63.         hovers = [
  64.             Hover(text=Text.from_ansi(coloured_section))
  65.             for coloured_section in coloured_sections
  66.         ]
  67.         await self.view.dock(*hovers, edge="top")
  68.  
  69.  
  70. def main():
  71.     HoverApp.run(log="textual.log")
  72.  
  73. if __name__ == "__main__":
  74.     main()
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement