diff --git a/widgets/headerlayout.go b/widgets/headerlayout.go index c6e6161..7f6b93d 100644 --- a/widgets/headerlayout.go +++ b/widgets/headerlayout.go @@ -7,15 +7,19 @@ import ( type HeaderLayout [][]string +type HeaderLayoutFilter struct { + layout HeaderLayout + keep func(msg *models.MessageInfo, header string) bool // filter criteria +} + // forMessage returns a filtered header layout, removing rows whose headers // do not appear in the provided message. -func (layout HeaderLayout) forMessage(msg *models.MessageInfo) HeaderLayout { - headers := msg.RFC822Headers - result := make(HeaderLayout, 0, len(layout)) - for _, row := range layout { +func (filter HeaderLayoutFilter) forMessage(msg *models.MessageInfo) HeaderLayout { + result := make(HeaderLayout, 0, len(filter.layout)) + for _, row := range filter.layout { // To preserve layout alignment, only hide rows if all columns are empty for _, col := range row { - if headers.Get(col) != "" { + if filter.keep(msg, col) { result = append(result, row) break } diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go index ee7dd50..25bebfa 100644 --- a/widgets/msgviewer.go +++ b/widgets/msgviewer.go @@ -52,7 +52,16 @@ type PartSwitcher struct { func NewMessageViewer(acct *AccountView, conf *config.AercConfig, store *lib.MessageStore, msg *models.MessageInfo) *MessageViewer { - layout := HeaderLayout(conf.Viewer.HeaderLayout).forMessage(msg) + hf := HeaderLayoutFilter{ + layout: HeaderLayout(conf.Viewer.HeaderLayout), + keep: func(msg *models.MessageInfo, header string) bool { + if fmtHeader(msg, header, "2") != "" { + return true + } + return false + }, + } + layout := hf.forMessage(msg) header, headerHeight := layout.grid( func(header string) ui.Drawable { return &HeaderView{ @@ -109,6 +118,8 @@ func fmtHeader(msg *models.MessageInfo, header string, timefmt string) string { return msg.Envelope.Date.Local().Format(timefmt) case "Subject": return msg.Envelope.Subject + case "Labels": + return strings.Join(msg.Labels, ", ") default: return msg.RFC822Headers.Get(header) } @@ -580,6 +591,11 @@ func (pv *PartViewer) attemptCopy() { "%s: %s\n", fields.Key(), fields.Value()) pv.sink.Write([]byte(field)) } + // virtual header + if len(pv.msg.Labels) != 0 { + labels := fmtHeader(pv.msg, "Labels", "") + pv.sink.Write([]byte(fmt.Sprintf("Labels: %s\n", labels))) + } pv.sink.Write([]byte{'\n'}) }