win_debug.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // package win_debug -- окно отладки для экрана
  2. package win_debug
  3. import (
  4. "fmt"
  5. "github.com/gdamore/tcell"
  6. "p78git.ddns.net/svi/libtui/alias"
  7. "p78git.ddns.net/svi/libtui/lib/line_cell/cell"
  8. "p78git.ddns.net/svi/libtui/types"
  9. "p78git.ddns.net/svi/libtui/lib/widget"
  10. )
  11. // WinDebug -- окно отладки для экрана
  12. type WinDebug struct {
  13. *widget.Widget
  14. app types.IKernel
  15. screen types.IScreen
  16. }
  17. // NewWinDebug -- возвращает новое окно отладки для экрана
  18. func NewWinDebug(app types.IKernel) (*WinDebug, error) {
  19. if app == nil {
  20. return nil, fmt.Errorf("NewWinDebug(): IApp==nil")
  21. }
  22. widget, err := widget.NewWidget(app)
  23. if err != nil {
  24. return nil, fmt.Errorf("NewWinDebug(): in create IWidget, err=\n\t%w", err)
  25. }
  26. sf := &WinDebug{
  27. Widget: widget,
  28. app: app,
  29. screen: app.Screen(),
  30. }
  31. return sf, nil
  32. }
  33. // Hide -- скрыть окно отладки экрана
  34. func (sf *WinDebug) Hide() {
  35. sf.Widget.Hide()
  36. }
  37. // Show -- показать окно отладки экрана
  38. func (sf *WinDebug) Show() {
  39. sf.Widget.Show()
  40. }
  41. // SetPos -- устанавливает позицию окна отладки
  42. func (sf *WinDebug) SetPos(x alias.PosX, y alias.PosY) {
  43. // Сначала вычислить квадрант экрана
  44. sizeX, sizeY := sf.app.Screen().Size()
  45. if alias.SizeX(x) >= sizeX/2 { // Кусор в правой половине
  46. x -= 30
  47. } else {
  48. x += 5
  49. }
  50. if alias.SizeY(y) >= sizeY/2 { // Курсор в нижней половине
  51. y -= 5
  52. } else {
  53. y += 5
  54. }
  55. sf.Widget.SetPos(x, y)
  56. }
  57. // Draw -- перерисовывает окноотладки по требованию
  58. func (sf *WinDebug) Draw() {
  59. if !sf.Widget.IsVisible() {
  60. return
  61. }
  62. sf.Widget.Draw()
  63. posX, posY := sf.app.Cursor().Pos()
  64. strOut := fmt.Sprintf("WinDebug.Draw(): pos=%v:%v", posX, posY)
  65. colorFg := tcell.NewRGBColor(200, 200, 200)
  66. style1 := tcell.StyleDefault
  67. colorBg := tcell.NewRGBColor(0, 0, 255)
  68. style1 = style1.Foreground(colorFg).Background(colorBg)
  69. sf.drawText(alias.Style(style1), strOut)
  70. }
  71. func (sf *WinDebug) drawText(style alias.Style, text string) {
  72. posX, posY := sf.Pos()
  73. for adr, r := range text {
  74. cell := cell.NewCell()
  75. cell.SetPos(posX+alias.PosX(adr), posY)
  76. cell.SetLit(alias.Lit(r))
  77. cell.SetStyle(style)
  78. sf.screen.SetCell(cell)
  79. }
  80. }