Спеца 12.8-12.9: интерфейс + Nil в internal/ui/log_panel.go, Fyne-реализация в internal/ui/desktop/log_panel.go, окно использует контракт вместо logsLbl.
49 lines
1.6 KiB
Go
49 lines
1.6 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"
|
||
)
|
||
|
||
// LogPanel — Fyne-реализация ui.LogPanel (спец 12.8, 12.9): поток системных логов.
|
||
//
|
||
// Внутри — widget.Label с ограниченным буфером (maxLogLen); Append обрезает
|
||
// строку до лимита. Вызовы Append приходят из горутин Hub, поэтому обновление
|
||
// виджета выполняется через fyne.Do (на потоке Fyne).
|
||
type LogPanel struct {
|
||
label *widget.Label
|
||
}
|
||
|
||
// maxLogLen — обрезка буфера панели «Логи», чтобы не расти бесконечно.
|
||
const maxLogLen = 200_000
|
||
|
||
// NewLogPanel создаёт LogPanel.
|
||
func NewLogPanel() *LogPanel {
|
||
l := widget.NewLabel("")
|
||
l.Wrapping = fyne.TextWrapWord
|
||
return &LogPanel{label: l}
|
||
}
|
||
|
||
// Widget возвращает контейнер панели для встраивания в окно (таб «Логи»).
|
||
func (p *LogPanel) Widget() fyne.CanvasObject {
|
||
return container.NewScroll(p.label)
|
||
}
|
||
|
||
// Append добавляет строку лога (спец 12.9), с ограничением буфера.
|
||
func (p *LogPanel) Append(text string) {
|
||
fyne.Do(func() {
|
||
s := p.label.Text + text + "\n"
|
||
if len(s) > maxLogLen {
|
||
s = s[len(s)-maxLogLen:]
|
||
}
|
||
p.label.SetText(s)
|
||
})
|
||
}
|
||
|
||
// compile-time проверка реализации контракта.
|
||
var _ ui.LogPanel = (*LogPanel)(nil) |