Selfish manta ray

This commit is contained in:
2026-02-01 21:31:25 +02:00
parent f283c5e99e
commit b8506eb929
3 changed files with 33 additions and 29 deletions

View File

@@ -10,7 +10,6 @@ import (
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/mattn/go-runewidth"
)
// View modes
@@ -299,19 +298,13 @@ func (m Model) View() string {
}
const (
alarmColPrefix = 6 // "▸ ● " = 4 display cols + 2 padding
alarmColTrigger = 18 // enough for cron like "30 7 * * 1-5"
alarmColName = 22
alarmColDesc = 30
)
// padRight pads s to exactly width display columns using runewidth.
func padRight(s string, width int) string {
w := runewidth.StringWidth(s)
if w >= width {
return runewidth.Truncate(s, width, "…")
}
return s + strings.Repeat(" ", width-w)
}
// Total row width: 6 (prefix) + 18 (trigger) + 22 (name) + 30 (desc) = 76
const alarmRowWidth = 6 + alarmColTrigger + alarmColName + alarmColDesc
func (m Model) renderAlarmList() string {
if len(m.alarms) == 0 {
@@ -320,28 +313,24 @@ func (m Model) renderAlarmList() string {
title := TitleStyle.Render("Alarms")
// Header — prefix padded to same display width as row prefixes
header := padRight("", alarmColPrefix) +
padRight("Time/Trigger", alarmColTrigger) +
padRight("Name", alarmColName) +
"Description"
header := fmt.Sprintf(" %-*s %-*s %-*s",
alarmColTrigger, "Time/Trigger",
alarmColName, "Name",
alarmColDesc, "Description")
var lines []string
lines = append(lines, title, "")
lines = append(lines, DividerStyle.Render(header))
lines = append(lines, fmt.Sprintf("%-*s", alarmRowWidth, title), "")
lines = append(lines, ColumnHeaderStyle.Render(fmt.Sprintf("%-*s", alarmRowWidth, header)))
for i, a := range m.alarms {
var prefix string
cursor := " "
if i == m.cursor {
prefix = "▸ "
} else {
prefix = " "
cursor = "▸ "
}
if a.Enabled {
prefix += "● "
} else {
prefix += "○ "
status := " ● "
if !a.Enabled {
status = " ○ "
}
var style lipgloss.Style
@@ -358,10 +347,22 @@ func (m Model) renderAlarmList() string {
trigger = a.Trigger
}
line := padRight(prefix, alarmColPrefix) +
padRight(trigger, alarmColTrigger) +
padRight(a.Name, alarmColName) +
a.Description
name := a.Name
if len(name) > alarmColName-1 {
name = name[:alarmColName-2] + "~"
}
desc := a.Description
if len(desc) > alarmColDesc-1 {
desc = desc[:alarmColDesc-2] + "~"
}
// Build line and pad to fixed total width so centering treats all rows equally
raw := fmt.Sprintf("%s%s %-*s %-*s %-*s",
cursor, status,
alarmColTrigger, trigger,
alarmColName, name,
alarmColDesc, desc)
line := fmt.Sprintf("%-*s", alarmRowWidth, raw)
lines = append(lines, style.Render(line))
}