Преглед на файлове

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

SVI преди 3 години
родител
ревизия
9debca6041

+ 2 - 0
.gitignore

@@ -1,2 +1,4 @@
 libtui/v0/cover.out
 libtui/v0/cover.out
+
+libtui/v0/.vscode

+ 4 - 0
libtui/v0/Makefile

@@ -15,6 +15,10 @@ mod:
 	go mod tidy -compat=1.20
 	go mod vendor
 	go fmt ./...
+ex.app:
+	clear
+	cd ./examples/show_app && \
+	go run .
 SERVICEURL=./
 graph:
 	goda graph -f "{{.Package.Name}}" "shared($(SERVICEURL)... )" | dot -Tsvg -o ./docs/graph.svg

+ 9 - 0
libtui/v0/app/app.go

@@ -6,6 +6,7 @@ import (
 
 	"github.com/gdamore/tcell"
 
+	"p78git.ddns.net/svi/libtui/alias"
 	"p78git.ddns.net/svi/libtui/screen"
 	"p78git.ddns.net/svi/libtui/types"
 )
@@ -47,10 +48,18 @@ func (sf *App) Run() error {
 		switch ev := ev.(type) {
 		case *tcell.EventResize:
 			sf.scr.Sync()
+			x, y := ev.Size()
+			sf.screen.Resize(alias.SizeX(x), alias.SizeY(y))
 		case *tcell.EventKey:
 			if ev.Key() == tcell.KeyCtrlQ { // ev.Key() == tcell.KeyEscape
 				return nil
 			}
+			if ev.Key() == tcell.KeyCtrlD { // Показать отладочную информацию
+				sf.screen.IsDebug().Set()
+			}
+		}
+		if sf.screen.IsDebug().Get() {
+			sf.screen.WinDebug().Show()
 		}
 	}
 }

+ 0 - 0
libtui/v0/app/app_test.go → libtui/v0/app/app_test.go1


+ 37 - 0
libtui/v0/safe_bool/safe_bool.go

@@ -0,0 +1,37 @@
+// package safe_bool -- потокобезопасный булевый признак
+package safe_bool
+
+import "sync"
+
+// SafeBool -- потокобезопасный булевый признак
+type SafeBool struct {
+	val   bool
+	block sync.RWMutex
+}
+
+// NewSafeBool -- возвращает новый потокобезопасный булевый признак
+func NewSafeBool() *SafeBool {
+	sf := &SafeBool{}
+	return sf
+}
+
+// Get -- возвращает потокобезопасное хранимое значение
+func (sf *SafeBool) Get() bool {
+	sf.block.RLock()
+	defer sf.block.RUnlock()
+	return sf.val
+}
+
+// Set -- взводит потокобезопасное хранимое значение
+func (sf *SafeBool) Set() {
+	sf.block.Lock()
+	defer sf.block.Unlock()
+	sf.val = true
+}
+
+// Reset -- сбрасывает потокобезопасное хранимое значение
+func (sf *SafeBool) Reset() {
+	sf.block.Lock()
+	defer sf.block.Unlock()
+	sf.val = false
+}

+ 27 - 0
libtui/v0/safe_bool/safe_bool_test.go

@@ -0,0 +1,27 @@
+package safe_bool
+
+import (
+	"testing"
+)
+
+/*
+	Тест для потокобезопасного булевого значения
+*/
+
+func TestSafeBool(t *testing.T) {
+	sf := NewSafeBool()
+	if sf == nil {
+		t.Fatalf("safeBool==nil")
+	}
+	if sf.Get() {
+		t.Fatalf("safeBool.Get==true")
+	}
+	sf.Set()
+	if !sf.Get() {
+		t.Fatalf("safeBool.Get==false")
+	}
+	sf.Reset()
+	if sf.Get() {
+		t.Fatalf("safeBool.Get==true")
+	}
+}

+ 23 - 2
libtui/v0/screen/screen.go

@@ -3,19 +3,25 @@ package screen
 
 import (
 	"p78git.ddns.net/svi/libtui/alias"
+	"p78git.ddns.net/svi/libtui/safe_bool"
+	"p78git.ddns.net/svi/libtui/screen/win_debug"
 	"p78git.ddns.net/svi/libtui/size"
 	"p78git.ddns.net/svi/libtui/types"
 )
 
 // Screen -- объект экрана
 type Screen struct {
-	size types.ISize // Размер экрана
+	size     types.ISize     // Размер экрана
+	isDebug  types.ISafeBool // Признак показа отладки
+	winDebug types.IWinDebug // Окно отладк
 }
 
 // NewScreen -- возвращаетновый экран
 func NewScreen() *Screen {
 	sf := &Screen{
-		size: size.NewSize(),
+		size:     size.NewSize(),
+		isDebug:  safe_bool.NewSafeBool(),
+		winDebug: win_debug.NewWinDebug(),
 	}
 	return sf
 }
@@ -24,3 +30,18 @@ func NewScreen() *Screen {
 func (sf *Screen) Size() (alias.SizeX, alias.SizeY) {
 	return sf.size.Get()
 }
+
+// IsDebug -- возвращает признак показа отладки
+func (sf *Screen) IsDebug() types.ISafeBool {
+	return sf.isDebug
+}
+
+// WinDebug -- возвращает объект окна отладки экрана
+func (sf *Screen) WinDebug() types.IWinDebug {
+	return sf.winDebug
+}
+
+// Resize -- изменяет размер экрана
+func (sf *Screen) Resize(x alias.SizeX, y alias.SizeY) {
+	sf.size.Set(x, y)
+}

+ 35 - 0
libtui/v0/screen/win_debug/win_debug.go

@@ -0,0 +1,35 @@
+// package win_debug -- окно отладки для экрана
+package win_debug
+
+import (
+	"p78git.ddns.net/svi/libtui/safe_bool"
+	"p78git.ddns.net/svi/libtui/types"
+)
+
+// WinDebug -- окно отладки для экрана
+type WinDebug struct {
+	isVisible types.ISafeBool
+}
+
+// NewWinDebug -- возвращает новое окно отладки для экрана
+func NewWinDebug() *WinDebug {
+	sf := &WinDebug{
+		isVisible: safe_bool.NewSafeBool(),
+	}
+	return sf
+}
+
+// IsVisible -- возвращает признак видимости окна экрана
+func (sf *WinDebug) IsVisible() bool {
+	return sf.isVisible.Get()
+}
+
+// Hide -- скрыть окно отладки экрана
+func (sf *WinDebug) Hide() {
+	sf.isVisible.Reset()
+}
+
+// Show -- показать окно отладки экрана
+func (sf *WinDebug) Show() {
+	sf.isVisible.Set()
+}

+ 11 - 0
libtui/v0/types/isafebool.go

@@ -0,0 +1,11 @@
+package types
+
+// ISafeBool -- потокобезопасный булевый признак
+type ISafeBool interface {
+	// Get -- возвращает хранимый потокобезопасный булевый признак
+	Get() bool
+	// Set -- взводит хранимый потокобезопасный булевый признак
+	Set()
+	// Reset -- сбрасывает хранимый потокобезопасный признак
+	Reset()
+}

+ 6 - 0
libtui/v0/types/iscreen.go

@@ -6,4 +6,10 @@ import "p78git.ddns.net/svi/libtui/alias"
 type IScreen interface {
 	// Size -- возвращает размер экрана
 	Size() (alias.SizeX, alias.SizeY)
+	// Resize -- изменить размеры экрана
+	Resize(alias.SizeX, alias.SizeY)
+	// IsDebug -- возвращает признак показа окна отладки
+	IsDebug() ISafeBool
+	// WinDebug -- возвращает объект окна отладки экрана
+	WinDebug() IWinDebug
 }

+ 13 - 0
libtui/v0/types/iwindebug.go

@@ -0,0 +1,13 @@
+package types
+
+// IWinDebug -- окно отладки экрана
+//
+//	Это окно показывается поверх всех окон
+type IWinDebug interface {
+	// Show -- показать окно отладки экрана
+	Show()
+	// Hide -- скрыть окно отладки экрана
+	Hide()
+	// IsVisible -- признак показа окна отладки экрана
+	IsVisible() bool
+}