aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/msgviewer.go
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/msgviewer.go')
-rw-r--r--widgets/msgviewer.go101
1 files changed, 61 insertions, 40 deletions
diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go
index f15fbae4..19de4b83 100644
--- a/widgets/msgviewer.go
+++ b/widgets/msgviewer.go
@@ -45,53 +45,26 @@ type PartSwitcher struct {
func NewMessageViewer(acct *AccountView, conf *config.AercConfig,
store *lib.MessageStore, msg *models.MessageInfo) *MessageViewer {
+ header, headerHeight := createHeader(msg, conf.Viewer.HeaderLayout)
grid := ui.NewGrid().Rows([]ui.GridSpec{
- {ui.SIZE_EXACT, 4}, // TODO: Based on number of header rows
+ {ui.SIZE_EXACT, headerHeight},
{ui.SIZE_WEIGHT, 1},
}).Columns([]ui.GridSpec{
{ui.SIZE_WEIGHT, 1},
})
- // TODO: let user specify additional headers to show by default
- headers := ui.NewGrid().Rows([]ui.GridSpec{
- {ui.SIZE_EXACT, 1},
- {ui.SIZE_EXACT, 1},
- {ui.SIZE_EXACT, 1},
- {ui.SIZE_EXACT, 1},
- }).Columns([]ui.GridSpec{
- {ui.SIZE_WEIGHT, 1},
- {ui.SIZE_WEIGHT, 1},
- })
- headers.AddChild(
- &HeaderView{
- Name: "From",
- Value: models.FormatAddresses(msg.Envelope.From),
- }).At(0, 0)
- headers.AddChild(
- &HeaderView{
- Name: "To",
- Value: models.FormatAddresses(msg.Envelope.To),
- }).At(0, 1)
- headers.AddChild(
- &HeaderView{
- Name: "Date",
- Value: msg.Envelope.Date.Format("Mon Jan 2, 2006 at 3:04 PM"),
- }).At(1, 0).Span(1, 2)
- headers.AddChild(
- &HeaderView{
- Name: "Subject",
- Value: msg.Envelope.Subject,
- }).At(2, 0).Span(1, 2)
- headers.AddChild(ui.NewFill(' ')).At(3, 0).Span(1, 2)
-
switcher := &PartSwitcher{}
err := createSwitcher(switcher, conf, store, msg, conf.Viewer.ShowHeaders)
if err != nil {
- goto handle_error
+ return &MessageViewer{
+ err: err,
+ grid: grid,
+ msg: msg,
+ }
}
- grid.AddChild(headers).At(0, 0)
+ grid.AddChild(header).At(0, 0)
grid.AddChild(switcher).At(1, 0)
return &MessageViewer{
@@ -102,12 +75,60 @@ func NewMessageViewer(acct *AccountView, conf *config.AercConfig,
store: store,
switcher: switcher,
}
+}
-handle_error:
- return &MessageViewer{
- err: err,
- grid: grid,
- msg: msg,
+func createHeader(msg *models.MessageInfo, layout [][]string) (grid *ui.Grid, height int) {
+ presentHeaders := presentHeaders(msg, layout)
+ rowCount := len(presentHeaders) + 1 // extra row for spacer
+ grid = ui.MakeGrid(rowCount, 1, ui.SIZE_EXACT, ui.SIZE_WEIGHT)
+ for i, cols := range presentHeaders {
+ r := ui.MakeGrid(1, len(cols), ui.SIZE_EXACT, ui.SIZE_WEIGHT)
+ for j, col := range cols {
+ r.AddChild(
+ &HeaderView{
+ Name: col,
+ Value: fmtHeader(msg, col),
+ }).At(0, j)
+ }
+ grid.AddChild(r).At(i, 0)
+ }
+ grid.AddChild(ui.NewFill(' ')).At(rowCount-1, 0)
+ return grid, rowCount
+}
+
+// presentHeaders returns a filtered header layout, removing rows whose headers
+// do not appear in the provided message.
+func presentHeaders(msg *models.MessageInfo, layout [][]string) [][]string {
+ headers := msg.RFC822Headers
+ result := make([][]string, 0, len(layout))
+ for _, row := range layout {
+ // To preserve layout alignment, only hide rows if all columns are empty
+ for _, col := range row {
+ if headers.Get(col) != "" {
+ result = append(result, row)
+ break
+ }
+ }
+ }
+ return result
+}
+
+func fmtHeader(msg *models.MessageInfo, header string) string {
+ switch header {
+ case "From":
+ return models.FormatAddresses(msg.Envelope.From)
+ case "To":
+ return models.FormatAddresses(msg.Envelope.To)
+ case "Cc":
+ return models.FormatAddresses(msg.Envelope.Cc)
+ case "Bcc":
+ return models.FormatAddresses(msg.Envelope.Bcc)
+ case "Date":
+ return msg.Envelope.Date.Format("Mon Jan 2, 2006 at 3:04 PM")
+ case "Subject":
+ return msg.Envelope.Subject
+ default:
+ return msg.RFC822Headers.Get(header)
}
}