summaryrefslogtreecommitdiffstats
path: root/src/terminal.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2023-03-29 20:36:09 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2023-04-01 12:59:44 +0900
commit1c7534f00966edca7c44054af199ca27aca0a80c (patch)
tree58ec99c05fc552f69ce05dc8160d70324254e6fd /src/terminal.go
parentae745d9397bdc8b91f3c1834def3b8ecb0ae57b1 (diff)
Add --track option to track the current selection
Close #3186 Related #1890
Diffstat (limited to 'src/terminal.go')
-rw-r--r--src/terminal.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/terminal.go b/src/terminal.go
index 468b90f8..57ff4f54 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -183,6 +183,7 @@ type Terminal struct {
multi int
sort bool
toggleSort bool
+ track bool
delimiter Delimiter
expect map[tui.Event]string
keymap map[tui.Event][]*action
@@ -599,6 +600,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
multi: opts.Multi,
sort: opts.Sort > 0,
toggleSort: opts.ToggleSort,
+ track: opts.Track,
delimiter: opts.Delimiter,
expect: opts.Expect,
keymap: opts.Keymap,
@@ -904,6 +906,10 @@ func (t *Terminal) UpdateProgress(progress float32) {
// UpdateList updates Merger to display the list
func (t *Terminal) UpdateList(merger *Merger, reset bool) {
t.mutex.Lock()
+ var prevIndex int32 = -1
+ if !reset && t.track && t.merger.Length() > 0 {
+ prevIndex = t.merger.Get(t.cy).item.Index()
+ }
t.progress = 100
t.merger = merger
if reset {
@@ -914,6 +920,18 @@ func (t *Terminal) UpdateList(merger *Merger, reset bool) {
t.triggerLoad = false
t.eventChan <- tui.Load.AsEvent()
}
+ if prevIndex >= 0 {
+ pos := t.cy - t.offset
+ count := t.merger.Length()
+ i := t.merger.FindIndex(prevIndex)
+ if i >= 0 {
+ t.cy = i
+ t.offset = t.cy - pos
+ } else if t.cy > count {
+ // Try to keep the vertical position when the list shrinks
+ t.cy = count - util.Min(count, t.maxItems()) + pos
+ }
+ }
t.mutex.Unlock()
t.reqBox.Set(reqInfo, nil)
t.reqBox.Set(reqList, nil)