diff options
author | Robin Jarry <robin@jarry.cc> | 2023-12-04 23:39:49 +0100 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2024-01-20 21:56:25 +0100 |
commit | 159fb38daf5336758abc425447cf2c2ed51de59a (patch) | |
tree | e7be3bea878b12e441332f89d7bc3c63db477c05 /commands/account/next.go | |
parent | d2817371867e94b621de4054b235d53312db8073 (diff) | |
download | aerc-159fb38daf5336758abc425447cf2c2ed51de59a.tar.gz |
commands: refactor registration
Register all commands with the same function and store them in the same
map.
Use bit flags to determine in which contexts each command should be
available.
Remove duplicate commands now that the same command can be exposed in
multiple contexts.
Refactor API to allow executing commands from other commands without
import cycles.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Tested-by: Johannes Thyssen Tishman <johannes@thyssentishman.com>
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 } |