summary refs log tree commit diff stats
path: root/widgets/msgviewer.go
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/msgviewer.go')
-rw-r--r--widgets/msgviewer.go47
1 files changed, 10 insertions, 37 deletions
diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go
index 7d92861..5b97f6f 100644
--- a/widgets/msgviewer.go
+++ b/widgets/msgviewer.go
@@ -46,7 +46,16 @@ type PartSwitcher struct {
 
 func NewMessageViewer(acct *AccountView, conf *config.AercConfig,
 	store *lib.MessageStore, msg *models.MessageInfo) *MessageViewer {
-	header, headerHeight := createHeader(msg, conf.Viewer.HeaderLayout)
+
+	layout := HeaderLayout(conf.Viewer.HeaderLayout).forMessage(msg)
+	header, headerHeight := layout.grid(
+		func(header string) ui.Drawable {
+			return &HeaderView{
+				Name:  header,
+				Value: fmtHeader(msg, header),
+			}
+		},
+	)
 
 	grid := ui.NewGrid().Rows([]ui.GridSpec{
 		{ui.SIZE_EXACT, headerHeight},
@@ -78,42 +87,6 @@ func NewMessageViewer(acct *AccountView, conf *config.AercConfig,
 	}
 }
 
-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":