55 lines
2.1 KiB
Go
55 lines
2.1 KiB
Go
package tui
|
||
|
||
import (
|
||
"github.com/charmbracelet/bubbles/viewport"
|
||
tea "github.com/charmbracelet/bubbletea"
|
||
)
|
||
|
||
// dashboardModel — вкладка Dashboard. Сама по себе не знает ни про
|
||
// атаки, ни про прокси, ни про краулинг — это намеренно: сбор метрики
|
||
// требует доступа к m.attacks/m.proxyView/m.spiderView корневой Model,
|
||
// поэтому рендер содержимого живёт в Model.renderDashboard (model.go),
|
||
// а dashboardModel — просто прокручиваемая витрина для готовой строки.
|
||
type dashboardModel struct {
|
||
viewport viewport.Model
|
||
}
|
||
|
||
func newDashboardView() dashboardModel {
|
||
return dashboardModel{viewport: viewport.New(0, 0)}
|
||
}
|
||
|
||
func (m *dashboardModel) SetSize(width, height int) {
|
||
if width < 0 {
|
||
width = 0
|
||
}
|
||
if height < 0 {
|
||
height = 0
|
||
}
|
||
m.viewport.Width = width
|
||
// 3 строки футера, которые View() добавляет сам: пустая строка +
|
||
// две строки подсказки (теперь гарантированно на двух строках, не
|
||
// на одной — см. комментарий у View()). Раньше здесь не вычиталось
|
||
// вообще ничего (тот же класс бага, что был у Proxy) — "работало"
|
||
// только по случайному совпадению с тем, что снаружи model.go
|
||
// передавал заведомо урезанную высоту.
|
||
vh := height - 3
|
||
if vh < 3 {
|
||
vh = 3
|
||
}
|
||
m.viewport.Height = vh
|
||
}
|
||
|
||
// SetContent обновляет отображаемый текст — вызывается из Model по тикеру.
|
||
func (m *dashboardModel) SetContent(s string) {
|
||
m.viewport.SetContent(s)
|
||
}
|
||
|
||
func (m dashboardModel) Update(msg tea.Msg) (dashboardModel, tea.Cmd) {
|
||
var cmd tea.Cmd
|
||
m.viewport, cmd = m.viewport.Update(msg)
|
||
return m, cmd
|
||
}
|
||
|
||
func (m dashboardModel) View() string {
|
||
return m.viewport.View() + "\n\n↑/↓ — прокрутка · обновляется раз в секунду\nf1-f12, pgup — вкладки\n"
|
||
}
|