//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)