aboutsummaryrefslogtreecommitdiffstats
path: root/lib
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 /lib
parent1339faf7881f33762c6e0a4915404e362fc51de1 (diff)
downloadaerc-d3379dd7f0d2e5caffeda4a97fc72649421cccca.tar.gz
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.
Diffstat (limited to 'lib')
-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 8cceed81..68e20d58 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 89c36a90..840f77e6 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]]
+ })
+}