diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-06 18:30:23 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-06 18:30:23 +0200 |
| commit | b3bbf184dcdff908abbd4413c77e1455b24de0c9 (patch) | |
| tree | 27012d656db8b010c75c5367f95c20064720e7aa /internal/tui/dashboard/model.go | |
| parent | bd076884619c8f4d9e76ef8bc67b3bfd8b83235a (diff) | |
feat(tui): add syscalls treemap visualization mode (task 383)
Diffstat (limited to 'internal/tui/dashboard/model.go')
| -rw-r--r-- | internal/tui/dashboard/model.go | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/internal/tui/dashboard/model.go b/internal/tui/dashboard/model.go index 0eef629..c0bcc11 100644 --- a/internal/tui/dashboard/model.go +++ b/internal/tui/dashboard/model.go @@ -46,6 +46,7 @@ type tabVizMode uint8 const ( tabVizModeTable tabVizMode = iota tabVizModeBubbles + tabVizModeTreemap ) // Model is the dashboard tab framework model. @@ -59,25 +60,26 @@ type Model struct { width int height int - refreshEvery time.Duration - keys common.KeyMap - pidFilter int - syscallsOffset int - filesOffset int - filesDirGrouped bool - filesDirOffset int - processesOffset int - syscallsVizMode tabVizMode - filesVizMode tabVizMode - processesVizMode tabVizMode - streamModel eventstream.Model - flamegraphModel flamegraphtui.Model - syscallsChart bubbleChart - filesChart bubbleChart - processesChart bubbleChart - showHelp bool - isDark bool - focused bool + refreshEvery time.Duration + keys common.KeyMap + pidFilter int + syscallsOffset int + syscallsTreemapSelection int + filesOffset int + filesDirGrouped bool + filesDirOffset int + processesOffset int + syscallsVizMode tabVizMode + filesVizMode tabVizMode + processesVizMode tabVizMode + streamModel eventstream.Model + flamegraphModel flamegraphtui.Model + syscallsChart bubbleChart + filesChart bubbleChart + processesChart bubbleChart + showHelp bool + isDark bool + focused bool } // NewModel creates a dashboard model with default refresh cadence. @@ -193,6 +195,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case messages.StatsTickMsg: m.latest = msg.Snap m.syscallsOffset = clampOffset(m.syscallsOffset, m.maxSyscallsRows()) + m.syscallsTreemapSelection = clampOffset(m.syscallsTreemapSelection, m.maxSyscallsRows()) m.filesOffset = clampOffset(m.filesOffset, m.maxFilesRows()) m.filesDirOffset = clampOffset(m.filesDirOffset, m.maxFilesDirRows()) m.processesOffset = clampOffset(m.processesOffset, m.maxProcessesRows()) @@ -336,6 +339,9 @@ func (m *Model) handleScrollKey(msg tea.KeyPressMsg) (bool, tea.Cmd) { } switch m.activeTab { case TabSyscalls: + if m.syscallsVizMode == tabVizModeTreemap { + return scrollOffset(keyStr, &m.syscallsTreemapSelection, m.maxSyscallsRows()), nil + } return scrollOffset(keyStr, &m.syscallsOffset, m.maxSyscallsRows()), nil case TabFiles: if m.filesDirGrouped { @@ -513,6 +519,9 @@ func (m Model) View() tea.View { } func (m Model) renderActiveContent(width, activeHeight int, streamModel *eventstream.Model) string { + if m.activeTab == TabSyscalls && m.syscallsVizMode == tabVizModeTreemap { + return renderSyscallsTreemap(m.latest, width, activeHeight, m.syscallsChart.Metric(), m.syscallsTreemapSelection, m.isDark) + } if m.bubbleEnabledForTab(m.activeTab) { switch m.activeTab { case TabSyscalls: @@ -711,7 +720,9 @@ func (m *Model) setTabVizMode(tab Tab, mode tabVizMode) { func (m Model) allowedVizModes(tab Tab) []tabVizMode { switch tab { - case TabSyscalls, TabProcesses: + case TabSyscalls: + return []tabVizMode{tabVizModeTable, tabVizModeBubbles, tabVizModeTreemap} + case TabProcesses: return []tabVizMode{tabVizModeTable, tabVizModeBubbles} case TabFiles: if m.filesDirGrouped { |
