summaryrefslogtreecommitdiff
path: root/widgets/msgviewer.go
diff options
context:
space:
mode:
authorReto Brunner <reto@labrat.space>2020-05-27 07:37:02 +0200
committerReto Brunner <reto@labrat.space>2020-05-27 07:57:10 +0200
commit0f78f06610c0e8887aba2ae50e99b86477a384b3 (patch)
treeff4cd6581d3af0911954a37550602366d2bb0e2f /widgets/msgviewer.go
parent6c4ed3cfe2fe66a1e5f26c404ea90e048142db72 (diff)
downloadaerc-0f78f06610c0e8887aba2ae50e99b86477a384b3.zip
Add Style configuration
The following functionalities are added to configure aerc ui styles. - Read stylesets from file with very basic fnmatch wildcard matching - Add default styleset - Support different stylesets as part of UiConfig allowing contextual styles. - Move widgets/ui elements to use the stylesets. - Add configuration manual for the styleset
Diffstat (limited to 'widgets/msgviewer.go')
-rw-r--r--widgets/msgviewer.go63
1 files changed, 39 insertions, 24 deletions
diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go
index ce85970..6544ddd 100644
--- a/widgets/msgviewer.go
+++ b/widgets/msgviewer.go
@@ -32,6 +32,7 @@ type MessageViewer struct {
grid *ui.Grid
switcher *PartSwitcher
msg lib.MessageView
+ uiConfig config.UIConfig
}
type PartSwitcher struct {
@@ -61,9 +62,11 @@ func NewMessageViewer(acct *AccountView,
header, headerHeight := layout.grid(
func(header string) ui.Drawable {
return &HeaderView{
+ conf: conf,
Name: header,
Value: fmtHeader(msg.MessageInfo(), header,
acct.UiConfig().TimestampFormat),
+ uiConfig: acct.UiConfig(),
}
},
)
@@ -93,15 +96,16 @@ func NewMessageViewer(acct *AccountView,
err := createSwitcher(acct, switcher, conf, msg)
if err != nil {
return &MessageViewer{
- err: err,
- grid: grid,
- msg: msg,
+ err: err,
+ grid: grid,
+ msg: msg,
+ uiConfig: acct.UiConfig(),
}
}
grid.AddChild(header).At(0, 0)
if msg.PGPDetails() != nil {
- grid.AddChild(NewPGPInfo(msg.PGPDetails())).At(1, 0)
+ grid.AddChild(NewPGPInfo(msg.PGPDetails(), acct.UiConfig())).At(1, 0)
grid.AddChild(ui.NewFill(' ')).At(2, 0)
grid.AddChild(switcher).At(3, 0)
} else {
@@ -115,6 +119,7 @@ func NewMessageViewer(acct *AccountView,
grid: grid,
msg: msg,
switcher: switcher,
+ uiConfig: acct.UiConfig(),
}
switcher.mv = mv
@@ -223,8 +228,9 @@ func createSwitcher(acct *AccountView, switcher *PartSwitcher,
func (mv *MessageViewer) Draw(ctx *ui.Context) {
if mv.err != nil {
- ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
- ctx.Printf(0, 0, tcell.StyleDefault, "%s", mv.err.Error())
+ style := mv.acct.UiConfig().GetStyle(config.STYLE_DEFAULT)
+ ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', style)
+ ctx.Printf(0, 0, style, "%s", mv.err.Error())
return
}
mv.grid.Draw(ctx)
@@ -346,7 +352,10 @@ func (ps *PartSwitcher) Draw(ctx *ui.Context) {
ps.height = ctx.Height()
y := ctx.Height() - height
for i, part := range ps.parts {
- style := tcell.StyleDefault.Reverse(ps.selected == i)
+ style := ps.mv.uiConfig.GetStyle(config.STYLE_DEFAULT)
+ if ps.selected == i {
+ style = ps.mv.uiConfig.GetStyleSelected(config.STYLE_DEFAULT)
+ }
ctx.Fill(0, y+i, ctx.Width(), 1, ' ', style)
name := fmt.Sprintf("%s/%s",
strings.ToLower(part.part.MIMEType),
@@ -435,6 +444,7 @@ func (mv *MessageViewer) Focus(focus bool) {
type PartViewer struct {
ui.Invalidatable
+ conf *config.AercConfig
err error
fetched bool
filter *exec.Cmd
@@ -449,6 +459,7 @@ type PartViewer struct {
term *Terminal
selecter *Selecter
grid *ui.Grid
+ uiConfig config.UIConfig
}
func NewPartViewer(acct *AccountView, conf *config.AercConfig,
@@ -518,7 +529,8 @@ func NewPartViewer(acct *AccountView, conf *config.AercConfig,
{ui.SIZE_WEIGHT, 1},
})
- selecter := NewSelecter([]string{"Save message", "Pipe to command"}, 0).
+ selecter := NewSelecter([]string{"Save message", "Pipe to command"},
+ 0, acct.UiConfig()).
OnChoose(func(option string) {
switch option {
case "Save message":
@@ -531,6 +543,7 @@ func NewPartViewer(acct *AccountView, conf *config.AercConfig,
grid.AddChild(selecter).At(2, 0)
pv := &PartViewer{
+ conf: conf,
filter: filter,
index: index,
msg: msg,
@@ -542,6 +555,7 @@ func NewPartViewer(acct *AccountView, conf *config.AercConfig,
term: term,
selecter: selecter,
grid: grid,
+ uiConfig: acct.UiConfig(),
}
if term != nil {
@@ -639,14 +653,16 @@ func (pv *PartViewer) Invalidate() {
}
func (pv *PartViewer) Draw(ctx *ui.Context) {
+ style := pv.uiConfig.GetStyle(config.STYLE_DEFAULT)
+ styleError := pv.uiConfig.GetStyle(config.STYLE_ERROR)
if pv.filter == nil {
// TODO: Let them download it directly or something
- ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
- ctx.Printf(0, 0, tcell.StyleDefault.Foreground(tcell.ColorRed),
+ ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', style)
+ ctx.Printf(0, 0, styleError,
"No filter configured for this mimetype ('%s/%s')",
pv.part.MIMEType, pv.part.MIMESubType,
)
- ctx.Printf(0, 2, tcell.StyleDefault,
+ ctx.Printf(0, 2, style,
"You can still :save the message or :pipe it to an external command")
pv.selecter.Focus(true)
pv.grid.Draw(ctx)
@@ -657,8 +673,8 @@ func (pv *PartViewer) Draw(ctx *ui.Context) {
pv.fetched = true
}
if pv.err != nil {
- ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
- ctx.Printf(0, 0, tcell.StyleDefault, "%s", pv.err.Error())
+ ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', style)
+ ctx.Printf(0, 0, style, "%s", pv.err.Error())
return
}
pv.term.Draw(ctx)
@@ -680,8 +696,10 @@ func (pv *PartViewer) Event(event tcell.Event) bool {
type HeaderView struct {
ui.Invalidatable
- Name string
- Value string
+ conf *config.AercConfig
+ Name string
+ Value string
+ uiConfig config.UIConfig
}
func (hv *HeaderView) Draw(ctx *ui.Context) {
@@ -689,18 +707,15 @@ func (hv *HeaderView) Draw(ctx *ui.Context) {
size := runewidth.StringWidth(name)
lim := ctx.Width() - size - 1
value := runewidth.Truncate(" "+hv.Value, lim, "…")
- var (
- hstyle tcell.Style
- vstyle tcell.Style
- )
+
+ vstyle := hv.uiConfig.GetStyle(config.STYLE_DEFAULT)
+ hstyle := hv.uiConfig.GetStyle(config.STYLE_HEADER)
+
// TODO: Make this more robust and less dumb
if hv.Name == "PGP" {
- vstyle = tcell.StyleDefault.Foreground(tcell.ColorGreen)
- hstyle = tcell.StyleDefault.Bold(true)
- } else {
- vstyle = tcell.StyleDefault
- hstyle = tcell.StyleDefault.Bold(true)
+ vstyle = hv.uiConfig.GetStyle(config.STYLE_SUCCESS)
}
+
ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', vstyle)
ctx.Printf(0, 0, hstyle, "%s", name)
ctx.Printf(size, 0, vstyle, "%s", value)