From d941960fe175fd89b08b5a3f1bd073e0ecaf2d59 Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Tue, 26 Jul 2022 11:30:27 +0200 Subject: [PATCH] delete: improve find next function Improve the function to find the next valid message after the delete operation. This ensures that messages at the end or when marked in the visual mode are properly dealt with. Signed-off-by: Koni Marti Tested-by: Tim Culverhouse Acked-by: Robin Jarry --- commands/msg/delete.go | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/commands/msg/delete.go b/commands/msg/delete.go index d144388..ce5c4ca 100644 --- a/commands/msg/delete.go +++ b/commands/msg/delete.go @@ -89,16 +89,24 @@ func (Delete) Execute(aerc *widgets.Aerc, args []string) error { } func findNextNonDeleted(deleted []uint32, store *lib.MessageStore) *models.MessageInfo { - selected := store.Selected() - if !contains(deleted, selected.Uid) { - return selected + var next, previous *models.MessageInfo + stepper := []func(){store.Next, store.Prev} + for _, stepFn := range stepper { + for { + next = store.Selected() + if next != nil && !contains(deleted, next.Uid) { + return next + } + if next == nil || previous == next { + break + } + stepFn() + previous = next + } } - store.Next() - next := store.Selected() - if next == selected || next == nil { - // the last message is in the deleted state or doesn't exist - return nil + if next != nil { + store.Select(next.Uid) } return next }