mirror of
https://github.com/anotherhadi/settuings.git
synced 2026-10-05 08:18:23 +02:00
86 lines
2.1 KiB
Go
86 lines
2.1 KiB
Go
package audio
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
tea "charm.land/bubbletea/v2"
|
|
"charm.land/lipgloss/v2"
|
|
ilovetui "github.com/anotherhadi/ilovetui"
|
|
"github.com/anotherhadi/settuings/internal/audio"
|
|
)
|
|
|
|
func windowStyle() lipgloss.Style {
|
|
return lipgloss.NewStyle().
|
|
Border(lipgloss.RoundedBorder()).
|
|
BorderForeground(ilovetui.S.Subtle).
|
|
Padding(1, 2)
|
|
}
|
|
|
|
func (m Model) View() tea.View {
|
|
statusBar := m.renderStatusBar()
|
|
statusH := strings.Count(statusBar, "\n") + 1
|
|
|
|
frameW := windowStyle().GetHorizontalFrameSize()
|
|
frameH := windowStyle().GetVerticalFrameSize()
|
|
innerW := m.width - frameW
|
|
|
|
tabBar := m.renderTabBar(innerW)
|
|
tabBarH := lipgloss.Height(tabBar)
|
|
|
|
innerH := m.height - tabBarH - frameH - statusH
|
|
|
|
var body string
|
|
switch {
|
|
case !m.checked:
|
|
body = ilovetui.S.Faint.Render("Checking wpctl…")
|
|
case m.checkErr != nil:
|
|
body = m.renderUnavailable()
|
|
default:
|
|
body = m.renderActiveTab(innerW, innerH)
|
|
}
|
|
|
|
box := lipgloss.NewStyle().Width(innerW).Height(innerH).Render(body)
|
|
content := windowStyle().Render(lipgloss.JoinVertical(lipgloss.Left, tabBar, box))
|
|
|
|
return tea.NewView(lipgloss.JoinVertical(lipgloss.Left, content, statusBar))
|
|
}
|
|
|
|
func (m Model) renderStatusBar() string {
|
|
km := audioKeyMap{m: m, width: m.width}
|
|
return lipgloss.NewStyle().Padding(0, 1).Render(m.help.View(km))
|
|
}
|
|
|
|
func (m Model) renderActiveTab(width, height int) string {
|
|
switch m.active {
|
|
case tabOutput:
|
|
return m.renderOutput(width, height)
|
|
case tabInput:
|
|
return m.renderInput(width, height)
|
|
case tabApps:
|
|
return m.renderApps(width, height)
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
func (m Model) renderUnavailable() string {
|
|
title := lipgloss.NewStyle().Bold(true).Foreground(ilovetui.S.Error).Render("Audio page unavailable")
|
|
|
|
var hint string
|
|
switch {
|
|
case errors.Is(m.checkErr, audio.ErrNotFound):
|
|
hint = "wpctl was not found in PATH. Install PipeWire/WirePlumber to use this page."
|
|
default:
|
|
hint = m.checkErr.Error()
|
|
}
|
|
|
|
return lipgloss.JoinVertical(lipgloss.Left,
|
|
title,
|
|
"",
|
|
subtleStyle().Render(hint),
|
|
"",
|
|
mutedStyle().Render("Press r to try again once fixed."),
|
|
)
|
|
}
|