diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2023-03-29 20:36:09 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2023-04-01 12:59:44 +0900 |
commit | 1c7534f00966edca7c44054af199ca27aca0a80c (patch) | |
tree | 58ec99c05fc552f69ce05dc8160d70324254e6fd /src/terminal.go | |
parent | ae745d9397bdc8b91f3c1834def3b8ecb0ae57b1 (diff) |
Add --track option to track the current selection
Close #3186
Related #1890
Diffstat (limited to 'src/terminal.go')
-rw-r--r-- | src/terminal.go | 18 |
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) |