app.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // package app -- главный объект приложения
  2. package app
  3. import (
  4. "fmt"
  5. "github.com/gdamore/tcell"
  6. "p78git.ddns.net/svi/libtui/alias"
  7. "p78git.ddns.net/svi/libtui/screen"
  8. "p78git.ddns.net/svi/libtui/types"
  9. )
  10. // App -- объектприложения
  11. type App struct {
  12. screen types.IScreen // Объект приложения
  13. scr tcell.Screen // Библиотечный экран
  14. }
  15. // NewApp -- возвращает новый объект приложения
  16. func NewApp() (*App, error) {
  17. sf := &App{}
  18. var err error
  19. sf.scr, err = tcell.NewScreen()
  20. if err != nil {
  21. return nil, fmt.Errorf("NewApp(): in create tcell.Screen, err=\n\t%w", err)
  22. }
  23. sf.screen, err = screen.NewScreen(sf)
  24. if err != nil {
  25. return nil, fmt.Errorf("NewApp(): i create IScreen, err=\n\t%w", err)
  26. }
  27. return sf, nil
  28. }
  29. // Screen -- возвращает объект экрана
  30. func (sf *App) Screen() types.IScreen {
  31. return sf.screen
  32. }
  33. // Run -- запускает объект приложения в работу
  34. func (sf *App) Run() error {
  35. defer func() {
  36. sf.scr.Fini() // Завершить работу с экраном
  37. }()
  38. if err := sf.run_init(); err != nil {
  39. return fmt.Errorf("App.Run(): ininit screen, err=\n\t%w", err)
  40. }
  41. sf.scr.Clear() // Зачистить экран перед началом работы
  42. sf.scr.Show() // Обновить экран
  43. sf.scr.EnableMouse()
  44. for { // Главный цикл работы
  45. ev := sf.scr.PollEvent() // Получить событие
  46. // Process event
  47. switch ev := ev.(type) {
  48. case *tcell.EventResize:
  49. sf.scr.Sync()
  50. x, y := ev.Size()
  51. sf.screen.Resize(alias.SizeX(x), alias.SizeY(y))
  52. case *tcell.EventKey:
  53. if ev.Key() == tcell.KeyCtrlQ { // ev.Key() == tcell.KeyEscape
  54. return nil
  55. }
  56. if ev.Key() == tcell.KeyCtrlD { // Показать отладочную информацию
  57. if sf.screen.WinDebug().IsVisible() { // Переключение состояния показа окна отладки
  58. sf.screen.WinDebug().Hide()
  59. } else {
  60. sf.screen.WinDebug().Show()
  61. }
  62. }
  63. case *tcell.EventMouse: // Мышка подвинулась
  64. x, y := ev.Position()
  65. sf.screen.SetMousePos(alias.PosX(x), alias.PosY(y))
  66. }
  67. sf.scr.Clear()
  68. sf.screen.WinDebug().Draw()
  69. sf.scr.Show() // Обновить экран
  70. }
  71. }
  72. // Включение экрана терминала
  73. func (sf *App) run_init() error {
  74. var err error
  75. if err = sf.scr.Init(); err != nil {
  76. return fmt.Errorf("App.run_init(): in init tcell.Screen, err=\n\t%w", err)
  77. }
  78. return nil
  79. }
  80. // Scr -- возвращает аппаратный экран
  81. func (sf *App) Scr() tcell.Screen {
  82. return sf.scr
  83. }