|
|
@@ -0,0 +1,92 @@
|
|
|
+// 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)
|
|
|
+ }
|
|
|
+}
|