summaryrefslogtreecommitdiff
path: root/internal/tui/flamegraph/controls.go
blob: 240ba9046a67ac0793505c461d1cb42eb44987d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package flamegraph

import (
	"fmt"
	common "ior/internal/tui/common"
	"strings"

	"charm.land/lipgloss/v2"
)

func (m *Model) togglePause() {
	m.paused = !m.paused
}

func (m *Model) resetBaseline() {
	if m.liveTrie != nil {
		m.liveTrie.Reset()
	}
	m.zoomRoot = nil
	m.zoomPath = ""
	m.zoomStack = nil
	m.selectedIdx = 0
	m.snapshot = nil
	m.frames = nil
	m.targetFrames = nil
	m.searchQuery = ""
	m.matchIndices = make(map[int]bool)
	m.subtreeSet = make(map[int]bool)
	m.statusMessage = "Baseline reset"
}

func (m *Model) cycleFieldOrder() {
	if len(m.fieldPresets) == 0 {
		return
	}
	m.fieldIndex = (m.fieldIndex + 1) % len(m.fieldPresets)
	nextPreset := m.fieldPresets[m.fieldIndex]
	if m.liveTrie != nil {
		if err := m.liveTrie.Reconfigure(nextPreset); err != nil {
			m.statusMessage = "Field order error: " + err.Error()
			return
		}
	}
	m.zoomRoot = nil
	m.zoomPath = ""
	m.zoomStack = nil
	m.selectedIdx = 0
	m.snapshot = nil
	m.frames = nil
	m.targetFrames = nil
	m.subtreeSet = make(map[int]bool)
	m.statusMessage = "Order: " + strings.Join(nextPreset, "/")
}

func (m *Model) toggleHelp() {
	m.showHelp = !m.showHelp
}

func (m Model) toolbarLine() string {
	state := lipgloss.NewStyle().Foreground(common.ColorPrimary).Render("[LIVE]")
	if m.paused {
		state = lipgloss.NewStyle().Foreground(common.ColorDanger).Bold(true).Render("[PAUSED]")
	}
	order := m.currentFieldPresetLabel()
	line := fmt.Sprintf("%s | o:order(%s) | /:search | enter:zoom | u:undo | r:reset | p:pause", state, order)
	if m.statusMessage != "" {
		line += " | " + m.statusMessage
	}
	width := m.width
	if width <= 0 {
		width = 80
	}
	return padOrTrim(line, width)
}

func (m Model) helpOverlay() string {
	width := m.width
	if width <= 0 {
		width = 80
	}
	help := "Flame help: j/k depth  h/l sibling  enter zoom  u/backspace undo  esc reset  / search  n/N matches  p pause  r reset baseline  o order  ? help"
	return common.HelpBarStyle.Width(width).Render(padOrTrim(help, width))
}

func (m Model) currentFieldPresetLabel() string {
	if len(m.fieldPresets) == 0 {
		return "n/a"
	}
	idx := m.fieldIndex
	if idx < 0 {
		idx = 0
	}
	if idx >= len(m.fieldPresets) {
		idx = len(m.fieldPresets) - 1
	}
	return strings.Join(m.fieldPresets[idx], "/")
}