summaryrefslogtreecommitdiff
path: root/lib/msgstore.go
diff options
context:
space:
mode:
authorKoni Marti <koni.marti@gmail.com>2022-07-26 15:41:15 +0200
committerRobin Jarry <robin@jarry.cc>2022-07-26 22:22:56 +0200
commitcfbb548fb86fb81b69809f9f1b68bbb60e823a40 (patch)
tree499d4bbf8d1f36b908302284ff07e6a06d0783db /lib/msgstore.go
parent866867c6160b2701a2ddd74480d2a62d15b2ffe6 (diff)
downloadaerc-cfbb548fb86fb81b69809f9f1b68bbb60e823a40.zip
threads: match regular view scrolling behavior
Try to keep the position in the message list when scrolling through threaded messages to match the scrolling behavior of the regular view. This only needs to be implemented for the client-side threading since we have to rebuild the threads when new messages arrive. Reported-by: akspecs <akspecs@gmail.com> Signed-off-by: Koni Marti <koni.marti@gmail.com> Acked-by: Akspecs <akspecs@gmail.com> Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'lib/msgstore.go')
-rw-r--r--lib/msgstore.go24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/msgstore.go b/lib/msgstore.go
index 32acfb4..783ce5d 100644
--- a/lib/msgstore.go
+++ b/lib/msgstore.go
@@ -399,12 +399,36 @@ func (store *MessageStore) runThreadBuilder() {
}
}
store.threadBuilderDebounce = time.AfterFunc(store.threadBuilderDelay, func() {
+
+ // temporarily deactiviate the selector in the message list by
+ // setting SelectedUid to the MagicUid
+ oldUid := store.SelectedUid()
+ store.Select(MagicUid)
+
+ // Get the current index (we want to stay at that position in
+ // the updated uid list to provide a similar scrolling
+ // experience to the user as in the regular view
+ idx := store.FindIndexByUid(oldUid)
+
+ // build new threads
th := store.builder.Threads(store.uids)
+ // try to select the same index in the updated uid list; if
+ // index is out of bound, stay at the selected message
+ rebuildUids := store.builder.Uids()
+ if idx >= 0 && idx < len(rebuildUids) {
+ store.Select(rebuildUids[idx])
+ } else {
+ store.Select(oldUid)
+ }
+
+ // save local threads to the message store variable
store.threadsMutex.Lock()
store.threads = th
store.threadsMutex.Unlock()
+ // invalidate message list so that it is redrawn with the new
+ // threads and selected message
if store.onUpdate != nil {
store.onUpdate(store)
}