aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffas <dev@jeffas.io>2019-10-02 17:16:15 +0100
committerDrew DeVault <sir@cmpwn.com>2019-10-09 19:46:43 -0400
commitd3379dd7f0d2e5caffeda4a97fc72649421cccca (patch)
tree4ee6a1bfb24636cc511eb6e528817eeb46faf258
parent1339faf7881f33762c6e0a4915404e362fc51de1 (diff)
Preserve sorting order in search results
This ensures that the search results follow the order of the current sort so that cycling throught the results proceeds in displayed order.
-rw-r--r--lib/msgstore.go2
-rw-r--r--lib/sort/sort.go16
2 files changed, 18 insertions, 0 deletions
diff --git a/lib/msgstore.go b/lib/msgstore.go
index 8cceed8..68e20d5 100644
--- a/lib/msgstore.go
+++ b/lib/msgstore.go
@@ -4,6 +4,7 @@ import (
"io"
"time"
+ "git.sr.ht/~sircmpwn/aerc/lib/sort"
"git.sr.ht/~sircmpwn/aerc/models"
"git.sr.ht/~sircmpwn/aerc/worker/types"
)
@@ -386,6 +387,7 @@ func (store *MessageStore) Search(args []string, cb func([]uint32)) {
}, func(msg types.WorkerMessage) {
switch msg := msg.(type) {
case *types.SearchResults:
+ sort.SortBy(msg.Uids, store.uids)
cb(msg.Uids)
}
})
diff --git a/lib/sort/sort.go b/lib/sort/sort.go
index 89c36a9..840f77e 100644
--- a/lib/sort/sort.go
+++ b/lib/sort/sort.go
@@ -3,6 +3,7 @@ package sort
import (
"errors"
"fmt"
+ "sort"
"strings"
"git.sr.ht/~sircmpwn/aerc/worker/types"
@@ -54,3 +55,18 @@ func parseSortField(arg string) (types.SortField, error) {
return types.SortArrival, fmt.Errorf("%v is not a valid sort criterion", arg)
}
}
+
+// Sorts toSort by sortBy so that toSort becomes a permutation following the
+// order of sortBy.
+// toSort should be a subset of sortBy
+func SortBy(toSort []uint32, sortBy []uint32) {
+ // build a map from sortBy
+ uidMap := make(map[uint32]int)
+ for i, uid := range sortBy {
+ uidMap[uid] = i
+ }
+ // sortslice of toSort with less function of indexing the map sortBy
+ sort.Slice(toSort, func(i, j int) bool {
+ return uidMap[toSort[i]] < uidMap[toSort[j]]
+ })
+}