|
@@ -3,12 +3,14 @@ package screen
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
|
|
+ "log"
|
|
|
|
|
|
|
|
"github.com/gdamore/tcell"
|
|
"github.com/gdamore/tcell"
|
|
|
|
|
|
|
|
"p78git.ddns.net/svi/libtui/alias"
|
|
"p78git.ddns.net/svi/libtui/alias"
|
|
|
"p78git.ddns.net/svi/libtui/lib/line_cell/cell"
|
|
"p78git.ddns.net/svi/libtui/lib/line_cell/cell"
|
|
|
"p78git.ddns.net/svi/libtui/lib/pos"
|
|
"p78git.ddns.net/svi/libtui/lib/pos"
|
|
|
|
|
+ "p78git.ddns.net/svi/libtui/lib/tui_obj"
|
|
|
|
|
|
|
|
// "p78git.ddns.net/svi/libtui/screen/win_debug"
|
|
// "p78git.ddns.net/svi/libtui/screen/win_debug"
|
|
|
"p78git.ddns.net/svi/libtui/lib/size"
|
|
"p78git.ddns.net/svi/libtui/lib/size"
|
|
@@ -17,7 +19,8 @@ import (
|
|
|
|
|
|
|
|
// Screen -- объект экрана
|
|
// Screen -- объект экрана
|
|
|
type Screen struct {
|
|
type Screen struct {
|
|
|
- app types.IKernel
|
|
|
|
|
|
|
+ *tui_obj.TuiObj
|
|
|
|
|
+ kern types.IKernel
|
|
|
scr tcell.Screen // Библиотечный экран
|
|
scr tcell.Screen // Библиотечный экран
|
|
|
size types.ISize // Размер экрана
|
|
size types.ISize // Размер экрана
|
|
|
posShift types.IPos // Смещение начала координат
|
|
posShift types.IPos // Смещение начала координат
|
|
@@ -33,7 +36,7 @@ func NewScreen(app types.IKernel) (*Screen, error) {
|
|
|
return nil, fmt.Errorf("NewScreen(): in create tcell.Screen, err=\n\t%w", err)
|
|
return nil, fmt.Errorf("NewScreen(): in create tcell.Screen, err=\n\t%w", err)
|
|
|
}
|
|
}
|
|
|
sf := &Screen{
|
|
sf := &Screen{
|
|
|
- app: app,
|
|
|
|
|
|
|
+ kern: app,
|
|
|
scr: scr,
|
|
scr: scr,
|
|
|
size: size.NewSize(),
|
|
size: size.NewSize(),
|
|
|
posShift: pos.NewPos(),
|
|
posShift: pos.NewPos(),
|
|
@@ -42,13 +45,14 @@ func NewScreen(app types.IKernel) (*Screen, error) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Run -- запускает экран в работу
|
|
// Run -- запускает экран в работу
|
|
|
-func (sf *Screen) Run() error {
|
|
|
|
|
|
|
+func (sf *Screen) Run() {
|
|
|
defer func() {
|
|
defer func() {
|
|
|
sf.scr.Fini()
|
|
sf.scr.Fini()
|
|
|
- sf.app.CancelApp()
|
|
|
|
|
|
|
+ sf.kern.CancelApp()
|
|
|
}()
|
|
}()
|
|
|
if err := sf.scr.Init(); err != nil {
|
|
if err := sf.scr.Init(); err != nil {
|
|
|
- return fmt.Errorf("Screen.Run(): in init tcell.Screen, err=\n\t%w", err)
|
|
|
|
|
|
|
+ log.Printf("Screen.Run(): in init tcell.Screen, err=\n\t%v\n", err)
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
sf.scr.EnableMouse()
|
|
sf.scr.EnableMouse()
|
|
|
sf.scr.HideCursor()
|
|
sf.scr.HideCursor()
|
|
@@ -65,7 +69,7 @@ func (sf *Screen) Run() error {
|
|
|
sf.size.Set(alias.SizeX(x), alias.SizeY(y))
|
|
sf.size.Set(alias.SizeX(x), alias.SizeY(y))
|
|
|
case *tcell.EventKey:
|
|
case *tcell.EventKey:
|
|
|
if ev.Key() == tcell.KeyCtrlQ { // ev.Key() == tcell.KeyEscape
|
|
if ev.Key() == tcell.KeyCtrlQ { // ev.Key() == tcell.KeyEscape
|
|
|
- return nil
|
|
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
if ev.Key() == tcell.KeyCtrlD { // Показать отладочную информацию
|
|
if ev.Key() == tcell.KeyCtrlD { // Показать отладочную информацию
|
|
|
// if sf.screen.WinDebug().IsVisible() { // Переключение состояния показа окна отладки
|
|
// if sf.screen.WinDebug().IsVisible() { // Переключение состояния показа окна отладки
|
|
@@ -76,7 +80,7 @@ func (sf *Screen) Run() error {
|
|
|
}
|
|
}
|
|
|
case *tcell.EventMouse: // Мышка подвинулась
|
|
case *tcell.EventMouse: // Мышка подвинулась
|
|
|
x, y := ev.Position()
|
|
x, y := ev.Position()
|
|
|
- sf.app.Cursor().SetPos(alias.PosX(x), alias.PosY(y))
|
|
|
|
|
|
|
+ sf.kern.Cursor().SetPos(alias.PosX(x), alias.PosY(y))
|
|
|
}
|
|
}
|
|
|
sf.Draw()
|
|
sf.Draw()
|
|
|
}
|
|
}
|
|
@@ -125,7 +129,7 @@ func (sf *Screen) SetCell(cell types.ICell) {
|
|
|
func (sf *Screen) Draw() {
|
|
func (sf *Screen) Draw() {
|
|
|
sf.scr.Clear()
|
|
sf.scr.Clear()
|
|
|
// sf.winDebug.Draw()
|
|
// sf.winDebug.Draw()
|
|
|
- // sf.cursor.Draw()
|
|
|
|
|
|
|
+ sf.kern.Draw()
|
|
|
sf.scr.Show() // Обновить экран
|
|
sf.scr.Show() // Обновить экран
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -134,3 +138,36 @@ func (sf *Screen) Draw() {
|
|
|
func (sf *Screen) Clear() {
|
|
func (sf *Screen) Clear() {
|
|
|
sf.scr.Clear() // Зачистить экран перед началом работы
|
|
sf.scr.Clear() // Зачистить экран перед началом работы
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+// DrawText -- отрисовывает текст по требованию в произвольной точке
|
|
|
|
|
+func (sf *Screen) DrawText(posX0 alias.PosX, posY0 alias.PosY, text string) {
|
|
|
|
|
+ colorFg := tcell.NewRGBColor(200, 200, 200)
|
|
|
|
|
+ style := tcell.StyleDefault
|
|
|
|
|
+ colorBg := tcell.NewRGBColor(0, 0, 255)
|
|
|
|
|
+ style = style.Foreground(colorFg).Background(colorBg)
|
|
|
|
|
+ posX, posY := posX0, posY0
|
|
|
|
|
+ // Сначала вычислить квадрант экрана
|
|
|
|
|
+ sizeX, sizeY := sf.size.Get()
|
|
|
|
|
+ if alias.SizeX(posX) >= sizeX/2 { // Кусор в правой половине
|
|
|
|
|
+ posX -= 30
|
|
|
|
|
+ } else {
|
|
|
|
|
+ posX += 5
|
|
|
|
|
+ }
|
|
|
|
|
+ if alias.SizeY(posY) >= sizeY/2 { // Курсор в нижней половине
|
|
|
|
|
+ posY -= 5
|
|
|
|
|
+ } else {
|
|
|
|
|
+ posY += 5
|
|
|
|
|
+ }
|
|
|
|
|
+ for adr, r := range text {
|
|
|
|
|
+ cell := cell.NewCell()
|
|
|
|
|
+ cell.SetPos(posX+alias.PosX(adr), posY)
|
|
|
|
|
+ cell.SetLit(alias.Lit(r))
|
|
|
|
|
+ cell.SetStyle(alias.Style(style))
|
|
|
|
|
+ sf.SetCell(cell)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Plot -- отрисовывает точку на экане
|
|
|
|
|
+func (sf *Screen) Plot(posX alias.PosX, posY alias.PosY, lit alias.Lit, color alias.Color) {
|
|
|
|
|
+ sf.scr.SetContent(int(posX), int(posY), rune(lit), []rune{}, tcell.Style(color))
|
|
|
|
|
+}
|