perf(ui): инкрементальный рендер ленты логов (дельта вместо полного пересбора)
This commit is contained in:
@@ -116,21 +116,39 @@ func (p *LogPanel) flush() {
|
||||
}
|
||||
}
|
||||
|
||||
// render перестраивает текст ленты из буфера с учётом выбранного набора
|
||||
// уровней. Пустой набор → пустая лента (без ошибок).
|
||||
// render перерисовывает ленту: дописывает в label только новые видимые
|
||||
// записи (RenderNew). Если вытеснение задело уже выведенные записи (stale),
|
||||
// RenderNew возвращает полный текст — пересобираем label целиком. Так при
|
||||
// росте ленты мимо лимита флаш дешёвый (только дельта), а полная пересборка
|
||||
// происходит лишь по вытеснению/смене фильтра.
|
||||
func (p *LogPanel) render() {
|
||||
p.label.SetText(p.buf.Render(p.selected))
|
||||
delta, full := p.buf.RenderNew(p.selected)
|
||||
if full {
|
||||
p.label.SetText(delta)
|
||||
return
|
||||
}
|
||||
if delta == "" {
|
||||
return
|
||||
}
|
||||
cur := p.label.Text
|
||||
if cur == "" {
|
||||
p.label.SetText(delta)
|
||||
} else {
|
||||
p.label.SetText(cur + delta)
|
||||
}
|
||||
}
|
||||
|
||||
// setLevel включает/выключает показ уровня и сразу обновляет ленту.
|
||||
// Вызывается только с потока Fyne (колбэки чекбоксов).
|
||||
// Вызывается только с потока Fyne (колбэки чекбоксов). Смена набора уровней
|
||||
// меняет видимость уже выведенных записей, поэтому — полный пересбор.
|
||||
func (p *LogPanel) setLevel(level string, on bool) {
|
||||
if p.selected[level] == on {
|
||||
return
|
||||
}
|
||||
p.selected[level] = on
|
||||
p.btn.SetText(p.filterCaption())
|
||||
p.render()
|
||||
p.label.SetText(p.buf.Render(p.selected))
|
||||
p.buf.ResetRendered()
|
||||
}
|
||||
|
||||
// filterCaption — подпись кнопки-дропдауна: текущий выбранный набор уровней.
|
||||
|
||||
Reference in New Issue
Block a user