diff options
| -rw-r--r-- | internal/tui/flamegraph/model.go | 43 | ||||
| -rw-r--r-- | internal/tui/flamegraph/model_test.go | 2 | ||||
| -rw-r--r-- | internal/tui/flamegraph/renderer.go | 34 | ||||
| -rw-r--r-- | internal/tui/flamegraph/renderer_test.go | 9 |
4 files changed, 12 insertions, 76 deletions
diff --git a/internal/tui/flamegraph/model.go b/internal/tui/flamegraph/model.go index f65925a..bb1f5af 100644 --- a/internal/tui/flamegraph/model.go +++ b/internal/tui/flamegraph/model.go @@ -798,12 +798,6 @@ func (m *Model) applyTargetFrames(targetFrames []tuiFrame, ancestry frameAncestr m.FrameAnimator.applyTargetFrames(targetFrames, ancestry, prevPath, animate, &m.SelectionManager, &m.SearchController, m.height) } -// restoreSelectionByPath delegates to SelectionManager to restore the selection -// after a frame layout swap. -func (m *Model) restoreSelectionByPath(path string) { - m.SelectionManager.restoreByPath(m.frames, path) -} - func (m Model) frameIndexByPath(path string) int { for idx, frame := range m.frames { if frame.Path == path { @@ -887,22 +881,6 @@ func (m Model) currentRootPath() string { return m.ZoomNavigator.currentRootPath(m.frames) } -// filterActive reports whether a search filter is applied. -func (m Model) filterActive() bool { - return filterActive(m.searchQuery) -} - -// navigableFrameSet returns the filter-visible set when a filter is active, else nil. -func (m Model) navigableFrameSet() map[int]bool { - return navigableSet(m.searchQuery, m.filterVisible) -} - -// framesAtDepth returns frame indices at the given depth filtered by the -// current search. -func (m Model) framesAtDepth(depth int) []int { - return framesAtDepthFiltered(m.frames, depth, m.navigableFrameSet()) -} - // frameNavigable reports whether a frame can be selected under the current filter. func (m Model) frameNavigable(idx int) bool { return frameNavigable(idx, m.frames, m.searchQuery, m.filterVisible) @@ -930,27 +908,6 @@ func (m *Model) recordKeyDebug(msg tea.KeyPressMsg, handled, moved bool) { m.lastKeyDebug = fmt.Sprintf("dbg frames=%d idx=%d key=%q code=%d handled=%t moved=%t sel=%s", len(m.frames), selIdx, keyID, msg.Code, handled, moved, sel) } -// moveTraversal delegates depth-then-column traversal to SelectionManager. -func (m *Model) moveTraversal(delta int) { - m.SelectionManager.moveTraversal(m.frames, delta, m.searchQuery, m.filterVisible) -} - -// visibleTraversalOrder delegates to SelectionManager for the sorted traversal order. -func (m Model) visibleTraversalOrder() []int { - return visibleTraversalOrder(m.frames, m.searchQuery, m.filterVisible) -} - -// visibleRowOffset delegates row offset calculation to SelectionManager. -func (m Model) visibleRowOffset() int { - return visibleRowOffset(m.frames, m.height, m.searchQuery, m.filterVisible) -} - -// ensureSelectionVisible delegates to SelectionManager to adjust the selection -// so it falls within the visible rendered rows. -func (m *Model) ensureSelectionVisible() { - m.SelectionManager.ensureVisible(m.frames, m.height, m.searchQuery, m.filterVisible) -} - func (m *Model) handleMouseClick(msg tea.MouseClickMsg) bool { if msg.Button != tea.MouseLeft { return false diff --git a/internal/tui/flamegraph/model_test.go b/internal/tui/flamegraph/model_test.go index 5445896..3efe589 100644 --- a/internal/tui/flamegraph/model_test.go +++ b/internal/tui/flamegraph/model_test.go @@ -1278,7 +1278,7 @@ func TestRebuildKeepsSelectionOnVisibleRowsWhenTruncated(t *testing.T) { if len(m.frames) == 0 { t.Fatalf("expected rebuilt frames") } - rowOffset := m.visibleRowOffset() + rowOffset := visibleRowOffset(m.frames, m.height, m.searchQuery, m.filterVisible) if m.frames[m.selectedIdx].Row < rowOffset { t.Fatalf("expected selected frame row %d to be visible (offset=%d)", m.frames[m.selectedIdx].Row, rowOffset) } diff --git a/internal/tui/flamegraph/renderer.go b/internal/tui/flamegraph/renderer.go index 5edf527..e88fec3 100644 --- a/internal/tui/flamegraph/renderer.go +++ b/internal/tui/flamegraph/renderer.go @@ -296,7 +296,6 @@ type renderRowsContext struct { selectedIdx int heightMetricActive bool isDark bool - filterActive bool } // computeRenderParams derives the row-layout parameters for a given frame set @@ -549,7 +548,6 @@ func RenderTerminalView(ctx RenderContext) string { selectedIdx: selectedIdx, heightMetricActive: heightMetricActive, isDark: isDark, - filterActive: filterIsActive, }) return renderViewRows(toolbar, status, rows, width) } @@ -587,7 +585,6 @@ func buildRenderRows(ctx renderRowsContext) []string { selectedIdx := ctx.selectedIdx heightMetricActive := ctx.heightMetricActive isDark := ctx.isDark - filterActive := ctx.filterActive rowsByDepth := make(map[int][]indexedFrame) for idx, frame := range frames { @@ -611,13 +608,13 @@ func buildRenderRows(ctx renderRowsContext) []string { frameHeights := leafFrameHeights(framesAtRow, leafBarHeight) for h := leafBarHeight - 1; h >= 0; h-- { showLabels := h == 0 - rows = append(rows, renderLeafRowBand(framesAtRow, frameHeights, h, width, selectedPath, subtreeSet, matchSet, selectedIdx, isDark, filterActive, showLabels)) + rows = append(rows, renderLeafRowBand(framesAtRow, frameHeights, h, width, selectedPath, subtreeSet, matchSet, selectedIdx, isDark, showLabels)) } continue } for repeat := 0; repeat < barHeight; repeat++ { showLabels := repeat == barHeight/2 - rows = append(rows, renderRow(framesAtRow, width, selectedPath, subtreeSet, matchSet, selectedIdx, isDark, filterActive, showLabels)) + rows = append(rows, renderRow(framesAtRow, width, selectedPath, subtreeSet, matchSet, selectedIdx, isDark, showLabels)) } } @@ -662,17 +659,17 @@ func leafFrameHeights(frames []indexedFrame, leafBarHeight int) map[int]int { return heights } -func renderLeafRowBand(frames []indexedFrame, frameHeights map[int]int, band, width int, selectedPath string, subtreeSet, matchSet map[int]bool, selectedIdx int, isDark, filterActive, showLabels bool) string { +func renderLeafRowBand(frames []indexedFrame, frameHeights map[int]int, band, width int, selectedPath string, subtreeSet, matchSet map[int]bool, selectedIdx int, isDark, showLabels bool) string { visible := make([]indexedFrame, 0, len(frames)) for _, item := range frames { if frameHeights[item.idx] > band { visible = append(visible, item) } } - return renderRow(visible, width, selectedPath, subtreeSet, matchSet, selectedIdx, isDark, filterActive, showLabels) + return renderRow(visible, width, selectedPath, subtreeSet, matchSet, selectedIdx, isDark, showLabels) } -func renderRow(frames []indexedFrame, width int, selectedPath string, subtreeSet, matchSet map[int]bool, selectedIdx int, isDark, filterActive, showLabels bool) string { +func renderRow(frames []indexedFrame, width int, selectedPath string, subtreeSet, matchSet map[int]bool, selectedIdx int, isDark, showLabels bool) string { if len(frames) == 0 { return strings.Repeat(" ", width) } @@ -701,7 +698,7 @@ func renderRow(frames []indexedFrame, width int, selectedPath string, subtreeSet if showLabels { label = frameLabel(frame.Name, cellWidth, item.idx == selectedIdx, matchSet != nil && matchSet[item.idx]) } - style := styleForFrame(item.idx, frame, selectedPath, subtreeSet, matchSet, selectedIdx, isDark, filterActive) + style := styleForFrame(item.idx, frame, selectedPath, subtreeSet, matchSet, selectedIdx, isDark) cell := style.Render(label) b.WriteString(cell) cursor = frame.Col + cellWidth @@ -780,7 +777,7 @@ func computeFilterVisibleSetInto(frames []tuiFrame, matchSet, visible map[int]bo return visible } -func styleForFrame(idx int, frame tuiFrame, selectedPath string, subtreeSet, matchSet map[int]bool, selectedIdx int, isDark, filterActive bool) lipgloss.Style { +func styleForFrame(idx int, frame tuiFrame, selectedPath string, subtreeSet, matchSet map[int]bool, selectedIdx int, isDark bool) lipgloss.Style { base := lipgloss.NewStyle(). Foreground(common.ColorBackground). Background(frame.Fill) @@ -797,10 +794,6 @@ func styleForFrame(idx int, frame tuiFrame, selectedPath string, subtreeSet, mat if isSelected { selectedBg := lipgloss.Color("129") selectedFg := lipgloss.Color("15") - if !isDark { - selectedBg = lipgloss.Color("129") - selectedFg = lipgloss.Color("15") - } return base.Background(selectedBg).Foreground(selectedFg).Bold(true) } @@ -812,10 +805,6 @@ func styleForFrame(idx int, frame tuiFrame, selectedPath string, subtreeSet, mat return style.Faint(true) } - if filterActive { - return base.Background(common.ColorPanel).Foreground(common.ColorMuted).Faint(true) - } - if inSubtree { if frameRelation(frame.Path, selectedPath) == relationAncestor { return base.BorderLeft(true).BorderForeground(common.ColorAccent) @@ -877,10 +866,6 @@ func frameRelation(path, selectedPath string) relation { return relationNone } -func maxFrameRow(frames []tuiFrame) int { - return maxFrameRowForSet(frames, nil) -} - func maxFrameRowForSet(frames []tuiFrame, include map[int]bool) int { maxRow := 0 for idx, frame := range frames { @@ -924,11 +909,6 @@ func normalizeSelectedIndex(frames []tuiFrame, selectedIdx int, include map[int] return 0 } -func filterSampleCoverage(frames []tuiFrame, matchSet map[int]bool, totalBase uint64) float64 { - coveredTotal, rootTotal := filterCoverageTotals(frames, matchSet, totalBase) - return percentOfTotal(coveredTotal, rootTotal) -} - func computeBarHeight(availableRows, depthRows, maxHeight int) int { if availableRows <= 0 || depthRows <= 0 { return 1 diff --git a/internal/tui/flamegraph/renderer_test.go b/internal/tui/flamegraph/renderer_test.go index 8626c39..b078532 100644 --- a/internal/tui/flamegraph/renderer_test.go +++ b/internal/tui/flamegraph/renderer_test.go @@ -278,7 +278,6 @@ func TestSelectedFrameStyleDoesNotUnderline(t *testing.T) { nil, 1, true, - false, ) rendered := style.Render(" child ") if strings.Contains(rendered, "\x1b[4m") || strings.Contains(rendered, "[4;") || strings.Contains(rendered, ";4m") { @@ -407,7 +406,8 @@ func TestFilterSampleCoverageAvoidsDoubleCountingNestedMatches(t *testing.T) { 1: true, // A 2: true, // A1 (nested under A) } - if got := filterSampleCoverage(frames, matchSet, 100); got != 60 { + coveredTotal, rootTotal := filterCoverageTotals(frames, matchSet, 100) + if got := percentOfTotal(coveredTotal, rootTotal); got != 60 { t.Fatalf("expected nested matches to count once at 60%%, got %.1f%%", got) } } @@ -513,7 +513,7 @@ func TestRenderLeafRowBandFiltersFramesByBand(t *testing.T) { 1: 2, } - topBand := renderLeafRowBand(frames, heights, 3, 10, "root"+pathSeparator+"A", nil, nil, 0, true, false, true) + topBand := renderLeafRowBand(frames, heights, 3, 10, "root"+pathSeparator+"A", nil, nil, 0, true, true) if !strings.Contains(topBand, "A") { t.Fatalf("expected top band to render taller frame A, got %q", topBand) } @@ -521,7 +521,7 @@ func TestRenderLeafRowBandFiltersFramesByBand(t *testing.T) { t.Fatalf("expected top band to hide shorter frame B, got %q", topBand) } - lowerBand := renderLeafRowBand(frames, heights, 1, 10, "root"+pathSeparator+"A", nil, nil, 0, true, false, true) + lowerBand := renderLeafRowBand(frames, heights, 1, 10, "root"+pathSeparator+"A", nil, nil, 0, true, true) if !strings.Contains(lowerBand, "A") || !strings.Contains(lowerBand, "B") { t.Fatalf("expected lower band to render both frames, got %q", lowerBand) } @@ -548,7 +548,6 @@ func TestBuildRenderRowsHeightMetricUsesLeafBandsAndViewportRows(t *testing.T) { selectedIdx: 0, heightMetricActive: true, // heightMetricActive isDark: true, // isDark - filterActive: false, // filterActive }) if got, want := len(rows), 5; got != want { |
