// package win_debug -- окно отладки для экрана package win_debug import ( "fmt" "github.com/gdamore/tcell" "p78git.ddns.net/svi/libtui/alias" "p78git.ddns.net/svi/libtui/lib/line_cell/cell" "p78git.ddns.net/svi/libtui/types" "p78git.ddns.net/svi/libtui/lib/widget" ) // WinDebug -- окно отладки для экрана type WinDebug struct { *widget.Widget app types.IKernel screen types.IScreen } // NewWinDebug -- возвращает новое окно отладки для экрана func NewWinDebug(app types.IKernel) (*WinDebug, error) { if app == nil { return nil, fmt.Errorf("NewWinDebug(): IApp==nil") } widget, err := widget.NewWidget(app) if err != nil { return nil, fmt.Errorf("NewWinDebug(): in create IWidget, err=\n\t%w", err) } sf := &WinDebug{ Widget: widget, app: app, screen: app.Screen(), } return sf, nil } // Hide -- скрыть окно отладки экрана func (sf *WinDebug) Hide() { sf.Widget.Hide() } // Show -- показать окно отладки экрана func (sf *WinDebug) Show() { sf.Widget.Show() } // SetPos -- устанавливает позицию окна отладки func (sf *WinDebug) SetPos(x alias.PosX, y alias.PosY) { // Сначала вычислить квадрант экрана sizeX, sizeY := sf.app.Screen().Size() if alias.SizeX(x) >= sizeX/2 { // Кусор в правой половине x -= 30 } else { x += 5 } if alias.SizeY(y) >= sizeY/2 { // Курсор в нижней половине y -= 5 } else { y += 5 } sf.Widget.SetPos(x, y) } // Draw -- перерисовывает окноотладки по требованию func (sf *WinDebug) Draw() { if !sf.Widget.IsVisible() { return } sf.Widget.Draw() posX, posY := sf.app.Cursor().Pos() strOut := fmt.Sprintf("WinDebug.Draw(): pos=%v:%v", posX, posY) colorFg := tcell.NewRGBColor(200, 200, 200) style1 := tcell.StyleDefault colorBg := tcell.NewRGBColor(0, 0, 255) style1 = style1.Foreground(colorFg).Background(colorBg) sf.drawText(alias.Style(style1), strOut) } func (sf *WinDebug) drawText(style alias.Style, text string) { posX, posY := sf.Pos() for adr, r := range text { cell := cell.NewCell() cell.SetPos(posX+alias.PosX(adr), posY) cell.SetLit(alias.Lit(r)) cell.SetStyle(style) sf.screen.SetCell(cell) } }