diff options
Diffstat (limited to 'commands/account/next.go')
-rw-r--r-- | commands/account/next.go | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/commands/account/next.go b/commands/account/next.go index 142f6151..262e308d 100644 --- a/commands/account/next.go +++ b/commands/account/next.go @@ -2,11 +2,16 @@ package account import ( "errors" + "fmt" "strconv" "strings" "git.sr.ht/~rjarry/aerc/app" + "git.sr.ht/~rjarry/aerc/commands" + "git.sr.ht/~rjarry/aerc/lib" "git.sr.ht/~rjarry/aerc/lib/ui" + "git.sr.ht/~rjarry/aerc/models" + "git.sr.ht/~rjarry/aerc/worker/types" ) type NextPrevMsg struct { @@ -15,7 +20,11 @@ type NextPrevMsg struct { } func init() { - register(NextPrevMsg{}) + commands.Register(NextPrevMsg{}) +} + +func (NextPrevMsg) Context() commands.CommandContext { + return commands.ACCOUNT | commands.MESSAGE_VIEWER } func (np *NextPrevMsg) ParseAmount(arg string) error { @@ -40,23 +49,48 @@ func (np NextPrevMsg) Execute(args []string) error { if acct == nil { return errors.New("No account selected") } + store := acct.Store() + if store == nil { + return fmt.Errorf("No message store set.") + } n := np.Amount if np.Percent { n = int(float64(acct.Messages().Height()) * (float64(n) / 100.0)) } if args[0] == "prev-message" || args[0] == "prev" { - store := acct.Store() - if store != nil { - store.NextPrev(-n) - ui.Invalidate() - } + store.NextPrev(-n) } else { - store := acct.Store() - if store != nil { - store.NextPrev(n) - ui.Invalidate() + store.NextPrev(n) + } + + if mv, ok := app.SelectedTabContent().(*app.MessageViewer); ok { + reloadViewer := func(nextMsg *models.MessageInfo) { + lib.NewMessageStoreView(nextMsg, mv.MessageView().SeenFlagSet(), + store, app.CryptoProvider(), app.DecryptKeys, + func(view lib.MessageView, err error) { + if err != nil { + app.PushError(err.Error()) + return + } + nextMv := app.NewMessageViewer(acct, view) + app.ReplaceTab(mv, nextMv, + nextMsg.Envelope.Subject, true) + }) + } + if nextMsg := store.Selected(); nextMsg != nil { + reloadViewer(nextMsg) + } else { + store.FetchHeaders([]uint32{store.SelectedUid()}, + func(msg types.WorkerMessage) { + if m, ok := msg.(*types.MessageInfo); ok { + reloadViewer(m.Info) + } + }) } } + + ui.Invalidate() + return nil } |