From 88afe7bb4a7425fbce767a64ed454151514fa4f2 Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Thu, 20 Oct 2022 16:43:43 +0200 Subject: [PATCH] store: implement the simplified index handling Simplify the index handling for moving to the next or previous message. Same for moving to the next or previous search results. Moving of the index variable relies on the iterator package's StartIndex and EndIndex functions. Signed-off-by: Koni Marti Acked-by: Robin Jarry --- lib/iterator/index.go | 3 ++ lib/msgstore.go | 64 +++++++++++++++++++++---------------------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/lib/iterator/index.go b/lib/iterator/index.go index dd66005..5dad4fe 100644 --- a/lib/iterator/index.go +++ b/lib/iterator/index.go @@ -21,6 +21,9 @@ func FixBounds(i, lower, upper int) int { // WrapBounds will wrap the index i around its upper- or lower-bound if // out-of-bound func WrapBounds(i, lower, upper int) int { + if upper <= 0 { + return lower + } switch { case i > upper: i = lower + (i-upper-1)%upper diff --git a/lib/msgstore.go b/lib/msgstore.go index 7b2fbbf..d6ca26e 100644 --- a/lib/msgstore.go +++ b/lib/msgstore.go @@ -593,29 +593,20 @@ func (store *MessageStore) NextPrev(delta int) { if len(uids) == 0 { return } + iter := store.iterFactory.NewIterator(uids) - uid := store.SelectedUid() - - newIdx := store.FindIndexByUid(uid) + newIdx := store.FindIndexByUid(store.SelectedUid()) if newIdx < 0 { store.Select(uids[iter.StartIndex()]) return } - - low, high := iter.EndIndex(), iter.StartIndex() - sign := -1 - if high < low { - low, high = high, low - sign = 1 - } - newIdx += sign * delta - if newIdx >= len(uids) { - newIdx = high - } else if newIdx < 0 { - newIdx = low - } - + newIdx = iterator.MoveIndex( + newIdx, + delta, + iter, + iterator.FixBounds, + ) store.Select(uids[newIdx]) if store.BuildThreads() && store.ThreadedView() { @@ -631,15 +622,7 @@ func (store *MessageStore) NextPrev(delta int) { if store.marker != nil { store.marker.UpdateVisualMark() } - - nextResultIndex := len(store.results) - store.resultIndex - 2*delta - if nextResultIndex < 0 || nextResultIndex >= len(store.results) { - return - } - nextResultUid := store.results[nextResultIndex] - if nextResultUid == store.SelectedUid() { - store.resultIndex += delta - } + store.updateResults() } func (store *MessageStore) Next() { @@ -690,18 +673,35 @@ func (store *MessageStore) ApplyClear() { store.Sort(nil, nil) } +func (store *MessageStore) updateResults() { + if len(store.results) == 0 || store.resultIndex < 0 { + return + } + uid := store.SelectedUid() + for i, u := range store.results { + if uid == u { + store.resultIndex = i + break + } + } +} + func (store *MessageStore) nextPrevResult(delta int) { if len(store.results) == 0 { return } - store.resultIndex += delta - if store.resultIndex >= len(store.results) { - store.resultIndex = 0 - } + iter := store.iterFactory.NewIterator(store.results) if store.resultIndex < 0 { - store.resultIndex = len(store.results) - 1 + store.resultIndex = iter.StartIndex() + } else { + store.resultIndex = iterator.MoveIndex( + store.resultIndex, + delta, + iter, + iterator.WrapBounds, + ) } - store.Select(store.results[len(store.results)-store.resultIndex-1]) + store.Select(store.results[store.resultIndex]) store.update(false) }