diff --git a/ui/model.go b/ui/model.go index 235c0f5..641eb3f 100644 --- a/ui/model.go +++ b/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)) } diff --git a/ui/styles.go b/ui/styles.go index 85e6601..5680a8f 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -54,4 +54,7 @@ var ( DividerStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("#333333")) + + ColumnHeaderStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#555555")) ) diff --git a/woke b/woke index 28eb52f..25d6630 100755 Binary files a/woke and b/woke differ