app.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 *screen.Screen // Объект приложения
  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.screen.Clear()
  42. sf.screen.Draw() // 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.screen.Draw()
  68. }
  69. }
  70. // Включение экрана терминала
  71. func (sf *App) run_init() error {
  72. var err error
  73. if err = sf.scr.Init(); err != nil {
  74. return fmt.Errorf("App.run_init(): in init tcell.Screen, err=\n\t%w", err)
  75. }
  76. return nil
  77. }
  78. // Scr -- возвращает аппаратный экран
  79. func (sf *App) Scr() tcell.Screen {
  80. return sf.scr
  81. }