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