msgviewer: Add Labels as a virtual header
In order to accommodate for that, the headerlayout needed to be rewritten to pass the filter criteria back to the msgviewer, instead of just using the normal headers.
This commit is contained in:
parent
63391b7dca
commit
b360cca977
2 changed files with 26 additions and 6 deletions
|
@ -7,15 +7,19 @@ import (
|
||||||
|
|
||||||
type HeaderLayout [][]string
|
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
|
// forMessage returns a filtered header layout, removing rows whose headers
|
||||||
// do not appear in the provided message.
|
// do not appear in the provided message.
|
||||||
func (layout HeaderLayout) forMessage(msg *models.MessageInfo) HeaderLayout {
|
func (filter HeaderLayoutFilter) forMessage(msg *models.MessageInfo) HeaderLayout {
|
||||||
headers := msg.RFC822Headers
|
result := make(HeaderLayout, 0, len(filter.layout))
|
||||||
result := make(HeaderLayout, 0, len(layout))
|
for _, row := range filter.layout {
|
||||||
for _, row := range layout {
|
|
||||||
// To preserve layout alignment, only hide rows if all columns are empty
|
// To preserve layout alignment, only hide rows if all columns are empty
|
||||||
for _, col := range row {
|
for _, col := range row {
|
||||||
if headers.Get(col) != "" {
|
if filter.keep(msg, col) {
|
||||||
result = append(result, row)
|
result = append(result, row)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,16 @@ type PartSwitcher struct {
|
||||||
func NewMessageViewer(acct *AccountView, conf *config.AercConfig,
|
func NewMessageViewer(acct *AccountView, conf *config.AercConfig,
|
||||||
store *lib.MessageStore, msg *models.MessageInfo) *MessageViewer {
|
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(
|
header, headerHeight := layout.grid(
|
||||||
func(header string) ui.Drawable {
|
func(header string) ui.Drawable {
|
||||||
return &HeaderView{
|
return &HeaderView{
|
||||||
|
@ -109,6 +118,8 @@ func fmtHeader(msg *models.MessageInfo, header string, timefmt string) string {
|
||||||
return msg.Envelope.Date.Local().Format(timefmt)
|
return msg.Envelope.Date.Local().Format(timefmt)
|
||||||
case "Subject":
|
case "Subject":
|
||||||
return msg.Envelope.Subject
|
return msg.Envelope.Subject
|
||||||
|
case "Labels":
|
||||||
|
return strings.Join(msg.Labels, ", ")
|
||||||
default:
|
default:
|
||||||
return msg.RFC822Headers.Get(header)
|
return msg.RFC822Headers.Get(header)
|
||||||
}
|
}
|
||||||
|
@ -580,6 +591,11 @@ func (pv *PartViewer) attemptCopy() {
|
||||||
"%s: %s\n", fields.Key(), fields.Value())
|
"%s: %s\n", fields.Key(), fields.Value())
|
||||||
pv.sink.Write([]byte(field))
|
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'})
|
pv.sink.Write([]byte{'\n'})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue