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" }