Спеца 12.13: интерфейс + Nil + чистые хелперы (StateText/TraceLine/ ActivityLine/TaskStatusText/StatusBadge/Itoa) в internal/ui/state_panel.go, Fyne-реализация в internal/ui/desktop/state_panel.go. window.go — чистая компоновка: все 5 панелей вынесены как контракты.
50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
//go:build cgo
|
|
|
|
package desktop
|
|
|
|
import (
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/widget"
|
|
|
|
"github.com/kamelion/ratatoskr-go/internal/ui"
|
|
)
|
|
|
|
// stateLimit — обрезка буфера панели «Состояние» (спец 12.13).
|
|
const stateLimit = 200_000
|
|
|
|
// StatePanel — Fyne-реализация ui.StatePanel (спец 12.8, 12.13): агенты и
|
|
// трейсы выбранной задачи (таб «Состояние»).
|
|
type StatePanel struct {
|
|
stateLbl *widget.Label
|
|
}
|
|
|
|
// NewStatePanel создаёт StatePanel.
|
|
func NewStatePanel() *StatePanel {
|
|
p := &StatePanel{}
|
|
p.stateLbl = widget.NewLabel("")
|
|
p.stateLbl.Wrapping = fyne.TextWrapWord
|
|
return p
|
|
}
|
|
|
|
// Widget возвращает контейнер панели для встраивания в таб «Состояние».
|
|
func (p *StatePanel) Widget() fyne.CanvasObject {
|
|
return container.NewScroll(p.stateLbl)
|
|
}
|
|
|
|
// SetText заменяет содержимое снимком трасс (спец 12.13).
|
|
func (p *StatePanel) SetText(text string) {
|
|
p.stateLbl.SetText(text)
|
|
}
|
|
|
|
// Append добавляет live-строку (буфер ограничен).
|
|
func (p *StatePanel) Append(text string) {
|
|
s := p.stateLbl.Text + text + "\n"
|
|
if len(s) > stateLimit {
|
|
s = s[len(s)-stateLimit:]
|
|
}
|
|
p.stateLbl.SetText(s)
|
|
}
|
|
|
|
// compile-time проверка реализации контракта.
|
|
var _ ui.StatePanel = (*StatePanel)(nil) |