Bladeren bron

Добавление кода

SVI 3 jaren geleden
bovenliggende
commit
671029126d

+ 3 - 1
libtui/v0/examples/show_app/main.go

@@ -11,7 +11,9 @@ import (
 )
 
 func main() {
-	app, err := kernel.NewKernel(nil)
+	params:=make(map[string]string)
+	params["mock_screen"]="true"
+	app, err := kernel.NewKernel(params)
 	if err != nil {
 		log.Printf("main(): in create IApp, err=\n\t%v\n", err)
 		os.Exit(1)

+ 7 - 0
libtui/v0/lib/kernel/kernel.go

@@ -8,6 +8,7 @@ import (
 	"p78git.ddns.net/svi/libtui/alias"
 	"p78git.ddns.net/svi/libtui/lib/color"
 	"p78git.ddns.net/svi/libtui/lib/cursor"
+	"p78git.ddns.net/svi/libtui/lib/kernel/lst_drawer"
 	"p78git.ddns.net/svi/libtui/lib/line"
 	"p78git.ddns.net/svi/libtui/lib/pos"
 	"p78git.ddns.net/svi/libtui/lib/screen"
@@ -24,6 +25,7 @@ type Kernel struct {
 	ctxBg    context.Context // Неотменяемый контекст ядра
 	ctx      context.Context // Контекст ядра
 	fnCancel func()
+	lstDraw *lst_drawer.LstDrawer // Список объектов для отрисовки
 }
 
 // NewKernel -- возвращает новый объект приложения
@@ -39,6 +41,7 @@ func NewKernel(params map[string]string) (*Kernel, error) {
 		ctxBg:    ctxBg,
 		ctx:      ctx,
 		fnCancel: fnCancel,
+		lstDraw: lst_drawer.NewLstDrawer(),
 	}
 	var err error
 	mockScreen, isOk := params["mock_screen"]
@@ -94,6 +97,9 @@ func (sf *Kernel) MakeLine(beg, end types.IPos, color types.IColor) (types.ILine
 	if err != nil {
 		return nil, fmt.Errorf("Kernel.MakeLine(); in make ILine, err=\n\t%w", err)
 	}
+	if err:=sf.lstDraw.Add(line);err!=nil{
+		return nil, fmt.Errorf("Kernel.MakeLine(); in add ILine to LstDrawer, err=\n\t%w", err)
+	}
 	return line, nil
 }
 
@@ -113,5 +119,6 @@ func (sf *Kernel) MakeColor(r, g, b uint8) types.IColor {
 
 // Draw -- отрисовывает приложение
 func (sf *Kernel)Draw(){
+	sf.lstDraw.Draw()
 	sf.cursor.Draw()
 }

+ 4 - 0
libtui/v0/lib/kernel/lst_drawer/lst_drawer.go

@@ -20,6 +20,7 @@ type LstDrawer struct {
 func NewLstDrawer() *LstDrawer {
 	sf := &LstDrawer{
 		dict: make(map[alias.ObjID]types.IDrawer, 0),
+		lstZ: make([]alias.ObjID, 0),
 	}
 	return sf
 }
@@ -28,6 +29,9 @@ func NewLstDrawer() *LstDrawer {
 func (sf *LstDrawer) Add(dr types.IDrawer) error {
 	sf.block.Lock()
 	defer sf.block.Unlock()
+	if dr == nil {
+		return fmt.Errorf("LstDrawer.Add(): drawer==nil")
+	}
 	_, isOk := sf.dict[dr.Id()]
 	if isOk {
 		return fmt.Errorf("LstDriwer.Add(): DrawerID(%v) already exists", dr.Id())

+ 1 - 0
libtui/v0/lib/line/line.go

@@ -39,6 +39,7 @@ func NewLine(kern types.IKernel, posBeg types.IPos, posEnd types.IPos, color typ
 	sf := &Line{
 		TuiObj: tui_obj.NewTuiObj(),
 		kern:   kern,
+		screen: kern.Screen(),
 		posBeg: posBeg,
 		posEnd: posEnd,
 		color:  color,

+ 12 - 13
libtui/v0/lib/screen/screen.go

@@ -57,9 +57,9 @@ func (sf *Screen) Run() {
 	sf.scr.EnableMouse()
 	sf.scr.HideCursor()
 	sf.setGeomShift()
-	sf.Clear()
-	sf.Draw() // sf.scr.Show()  // Обновить экран
-	for {     // Главный цикл работы
+	sf.scr.Clear()
+	sf.Flush() // sf.scr.Show()  // Обновить экран
+	for {      // Главный цикл работы
 		event := sf.scr.PollEvent() // Получить событие
 		// Process event
 		switch ev := event.(type) {
@@ -82,7 +82,10 @@ func (sf *Screen) Run() {
 			x, y := ev.Position()
 			sf.kern.Cursor().SetPos(alias.PosX(x), alias.PosY(y))
 		}
-		sf.Draw()
+		sf.scr.Clear()
+		// sf.winDebug.Draw()
+		sf.kern.Draw()
+		sf.Flush() // Обновить экран
 	}
 }
 
@@ -125,15 +128,6 @@ func (sf *Screen) SetCell(cell types.ICell) {
 	sf.scr.SetCell(int(x), int(y), tcell.Style(style), rune(lit))
 }
 
-// Draw -- отрисовка экранасебя по требованию
-func (sf *Screen) Draw() {
-	sf.scr.Clear()
-	// sf.winDebug.Draw()
-	sf.kern.Draw()
-	sf.scr.Show() // Обновить экран
-
-}
-
 // Clear -- очистка экрана
 func (sf *Screen) Clear() {
 	sf.scr.Clear() // Зачистить экран перед началом работы
@@ -171,3 +165,8 @@ func (sf *Screen) DrawText(posX0 alias.PosX, posY0 alias.PosY, text string) {
 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))
 }
+
+// Flush -- нмедленное обновление экрана
+func (sf *Screen) Flush() {
+	sf.scr.Show()
+}

+ 45 - 3
libtui/v0/mock/mock_screen/mock_screen.go

@@ -3,6 +3,9 @@ package mock_screen
 
 import (
 	"fmt"
+	"os"
+	"os/exec"
+	"time"
 
 	"p78git.ddns.net/svi/libtui/alias"
 	"p78git.ddns.net/svi/libtui/types"
@@ -11,6 +14,7 @@ import (
 // MockScreen -- мок-экран для тестов
 type MockScreen struct {
 	kern types.IKernel
+	scr  [][]string
 }
 
 // NewMockScreen -- возвращает новый мок-экран для тестов
@@ -20,6 +24,14 @@ func NewMockScreen(kern types.IKernel) (*MockScreen, error) {
 	}
 	sf := &MockScreen{
 		kern: kern,
+		scr:  make([][]string, 0),
+	}
+	for x := 0; x < 80; x++ {
+		row := make([]string, 0)
+		for y := 0; y < 40; y++ {
+			row = append(row, "")
+		}
+		sf.scr = append(sf.scr, row)
 	}
 	return sf, nil
 }
@@ -28,7 +40,9 @@ func NewMockScreen(kern types.IKernel) (*MockScreen, error) {
 func (sf *MockScreen) Clear() {}
 
 // Draw -- отрисовывает экран
-func (sf *MockScreen) Draw() {}
+func (sf *MockScreen) Draw() {
+	sf.kern.Draw()
+}
 
 // DrawText -- отрисовывает текст по заданной позиции
 func (sf *MockScreen) DrawText(posX alias.PosX, posy alias.PosY, text string) {}
@@ -43,7 +57,10 @@ func (sf *MockScreen) Resize(sizeX alias.SizeX, sizeY alias.SizeY) {}
 
 // Run -- типа запускает экран в работу
 func (sf *MockScreen) Run() {
-
+	for {
+		time.Sleep(time.Millisecond * 500)
+		sf.Draw()
+	}
 }
 
 // SetCell -- печатает ячейку на экране
@@ -57,4 +74,29 @@ func (sf *MockScreen) Size() (alias.SizeX, alias.SizeY) {
 }
 
 // Plot -- рисует точку на экране
-func (sf *MockScreen) Plot(posX alias.PosX, posY alias.PosY, lit alias.Lit, color alias.Color) {}
+func (sf *MockScreen) Plot(posX alias.PosX, posY alias.PosY, lit alias.Lit, color alias.Color) {
+	strLit := string(lit)
+	if strLit == " " {
+		strLit = "."
+	}
+	sf.scr[posX][posY] = strLit
+}
+
+// Flush -- сбрасывает содержимое буфера на экран
+func (sf *MockScreen) Flush() {
+	cmd := exec.Command("clear")
+	cmd.Stdout = os.Stdout
+	cmd.Run()
+	for _, row := range sf.scr {
+		strOut := ""
+		for _, strLit := range row {
+			if strLit==""{
+				strLit=" "
+			}
+			strOut += strLit
+		}
+		fmt.Printf(strOut + "\n")
+	}
+	// Очистка буфера
+
+}

+ 2 - 2
libtui/v0/types/iscreen.go

@@ -12,8 +12,6 @@ type IScreen interface {
 	Resize(alias.SizeX, alias.SizeY)
 	// SetCell -- отрисовывает знакоместо на экране
 	SetCell(ICell)
-	// Draw -- отрисовывает себя по  требованию
-	Draw()
 	// DrawText -- отображает текст в заданной позиции
 	DrawText(alias.PosX, alias.PosY, string)
 	// Clear -- очистка экрана
@@ -24,4 +22,6 @@ type IScreen interface {
 	Run()
 	// Plot -- отрисовывает точку на экране
 	Plot(alias.PosX, alias.PosY, alias.Lit, alias.Color)
+	// Flush -- сбросить буфер на экран
+	Flush()
 }