Selfish manta ray
This commit is contained in:
59
ui/model.go
59
ui/model.go
@@ -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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user