screen.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from rich.syntax import Syntax
  2. from rich.traceback import Traceback
  3. from textual import on
  4. from textual.app import App
  5. from textual.containers import Horizontal
  6. from textual.screen import Screen
  7. from textual.widgets import Static
  8. from pybrary.makelib import parse
  9. from tx_widgets import SelectFuzzy
  10. class Main(Screen):
  11. CSS = '''
  12. #targets{
  13. width: 1fr;
  14. }
  15. #preview{
  16. width: 3fr;
  17. }
  18. '''
  19. def compose(self):
  20. try:
  21. self.makefile = parse()
  22. except FileNotFoundError:
  23. self.exit(message='\n ! makefile not found')
  24. with Horizontal():
  25. yield SelectFuzzy(self.makefile.keys(), id='targets')
  26. yield Static(id="preview", expand=True)
  27. def on_mount(self, event):
  28. self.query_one('#targets').focus()
  29. @on(SelectFuzzy.UpdateHighlighted)
  30. def highlight(self, event):
  31. event.stop()
  32. name = event.value
  33. target = self.makefile[name]
  34. target = f'{name}:\n'+'\n'.join(target)
  35. preview = self.query_one("#preview", Static)
  36. theme = self.app.config.theme
  37. try:
  38. syntax = Syntax(
  39. target,
  40. 'makefile',
  41. line_numbers=False,
  42. word_wrap=False,
  43. indent_guides=False,
  44. theme=theme,
  45. )
  46. preview.update(syntax)
  47. self.query_one("#preview").scroll_home(animate=False)
  48. except Exception:
  49. preview.update(Traceback(theme=theme, width=None))
  50. self.sub_title = "ERROR"
  51. @on(SelectFuzzy.UpdateSelected)
  52. def select(self, event):
  53. event.stop()
  54. selected = event.value
  55. cmd = f'make {selected}' if selected else None
  56. self.app.exit(cmd)