summaryrefslogtreecommitdiff
path: root/internal/tui/tui.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-05 19:20:18 +0200
committerPaul Buetow <paul@buetow.org>2026-03-05 19:20:18 +0200
commitbab716a6a5931c211fad2f17ee2f67e8d182a7fc (patch)
tree89b16ed3bf85198dd63751d2e1e54537c9340a1b /internal/tui/tui.go
parent96225fb6159212a8851043a08d781aba721b4e78 (diff)
feat(tui): migrate Bubble Tea stack to charm.land v2
Diffstat (limited to 'internal/tui/tui.go')
-rw-r--r--internal/tui/tui.go44
1 files changed, 25 insertions, 19 deletions
diff --git a/internal/tui/tui.go b/internal/tui/tui.go
index bdd3ab5..24a8ba5 100644
--- a/internal/tui/tui.go
+++ b/internal/tui/tui.go
@@ -20,10 +20,10 @@ import (
"sync"
"time"
- "github.com/charmbracelet/bubbles/key"
- "github.com/charmbracelet/bubbles/spinner"
- tea "github.com/charmbracelet/bubbletea"
- "github.com/charmbracelet/lipgloss"
+ "charm.land/bubbles/v2/key"
+ "charm.land/bubbles/v2/spinner"
+ tea "charm.land/bubbletea/v2"
+ "charm.land/lipgloss/v2"
)
// Screen identifies the currently active TUI screen.
@@ -144,7 +144,7 @@ func Run() error {
func RunWithTraceStarter(starter TraceStarter) error {
cfg := flags.Get()
model := newModelWithRuntimeConfig(cfg.PidFilter, cfg.PidFilter, cfg.TUIExportEnable, starter)
- program := tea.NewProgram(model, tea.WithAltScreen())
+ program := tea.NewProgram(model)
_, err := program.Run()
return err
}
@@ -227,9 +227,9 @@ func newModelWithRuntimeConfig(initialPID, startupPidFilter int, exportEnabled b
func (m Model) Init() tea.Cmd {
sizeCmd := initialWindowSizeCmd()
if m.screen == ScreenDashboard && m.attaching {
- return tea.Batch(sizeCmd, tea.WindowSize(), m.spin.Tick, m.beginTraceCmd())
+ return tea.Batch(sizeCmd, tea.RequestWindowSize, m.spin.Tick, m.beginTraceCmd())
}
- return tea.Batch(sizeCmd, tea.WindowSize(), m.pidPicker.Init())
+ return tea.Batch(sizeCmd, tea.RequestWindowSize, m.pidPicker.Init())
}
func initialWindowSizeCmd() tea.Cmd {
@@ -455,40 +455,40 @@ func (m *Model) stopTrace() {
}
// View renders the currently active screen and startup overlay state.
-func (m Model) View() string {
+func (m Model) View() tea.View {
if m.quitting {
- return ""
+ return altScreenView("")
}
width, height := common.EffectiveViewport(m.width, m.height)
if m.attaching {
line := fmt.Sprintf("%s Attaching tracepoints...", m.spin.View())
- return placeToViewport(width, height, ScreenStyle.Render(PanelStyle.Render(line)))
+ return altScreenView(placeToViewport(width, height, ScreenStyle.Render(PanelStyle.Render(line))))
}
if m.lastErr != nil {
- return placeToViewport(width, height, ScreenStyle.Render(ErrorStyle.Render(m.lastErr.Error())))
+ return altScreenView(placeToViewport(width, height, ScreenStyle.Render(ErrorStyle.Render(m.lastErr.Error()))))
}
switch m.screen {
case ScreenPIDPicker:
- base := m.pidPicker.View()
+ base := m.pidPicker.View().Content
if m.exporter.Visible() {
- return placeToViewport(width, height, m.exporter.View(width, height)+"\n"+base)
+ return altScreenView(placeToViewport(width, height, m.exporter.View(width, height)+"\n"+base))
}
- return placeToViewport(width, height, base)
+ return altScreenView(placeToViewport(width, height, base))
case ScreenDashboard:
- base := m.dashboard.View()
+ base := m.dashboard.View().Content
if m.probeModal.Visible() {
- return placeToViewport(width, height, m.probeModal.View(width, height))
+ return altScreenView(placeToViewport(width, height, m.probeModal.View(width, height)))
}
if m.exporter.Visible() {
- return placeToViewport(width, height, m.exporter.View(width, height)+"\n"+base)
+ return altScreenView(placeToViewport(width, height, m.exporter.View(width, height)+"\n"+base))
}
- return placeToViewport(width, height, base)
+ return altScreenView(placeToViewport(width, height, base))
default:
- return ""
+ return altScreenView("")
}
}
@@ -657,3 +657,9 @@ func placeToViewport(width, height int, content string) string {
}
return lipgloss.Place(width, height, lipgloss.Left, lipgloss.Top, content)
}
+
+func altScreenView(content string) tea.View {
+ view := tea.NewView(content)
+ view.AltScreen = true
+ return view
+}