aboutsummaryrefslogtreecommitdiffstats
path: root/commands/account/next.go
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2023-12-04 23:39:49 +0100
committerRobin Jarry <robin@jarry.cc>2024-01-20 21:56:25 +0100
commit159fb38daf5336758abc425447cf2c2ed51de59a (patch)
treee7be3bea878b12e441332f89d7bc3c63db477c05 /commands/account/next.go
parentd2817371867e94b621de4054b235d53312db8073 (diff)
downloadaerc-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.go54
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
}