From 2b725a4db5e973d7ce90d1ac0996dcfd3c3f0116 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 9 Dec 2019 21:32:58 +0900 Subject: [PATCH] Defer resetting multi-selection on reload --- src/core.go | 17 +++++++++-------- src/terminal.go | 6 ++++-- src/util/util.go | 10 ++++++++++ src/util/util_test.go | 18 ++++++++++++++++++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/core.go b/src/core.go index 985c177f..ff558497 100644 --- a/src/core.go +++ b/src/core.go @@ -224,12 +224,14 @@ func Run(opts *Options, revision string) { // Event coordination reading := true - clearCache := false + clearCache := util.Once(false) + clearSelection := util.Once(false) ticks := 0 var nextCommand *string restart := func(command string) { reading = true - clearCache = true + clearCache = util.Once(true) + clearSelection = util.Once(true) chunkList.Clear() header = make([]string, 0, opts.HeaderLines) go reader.restart(command) @@ -262,10 +264,10 @@ func Run(opts *Options, revision string) { snapshot, count := chunkList.Snapshot() terminal.UpdateCount(count, !reading, value.(*string)) if opts.Sync { - terminal.UpdateList(PassMerger(&snapshot, opts.Tac)) + opts.Sync = false + terminal.UpdateList(PassMerger(&snapshot, opts.Tac), false) } - matcher.Reset(snapshot, input(), false, !reading, sort, clearCache) - clearCache = false + matcher.Reset(snapshot, input(), false, !reading, sort, clearCache()) case EvtSearchNew: var command *string @@ -284,8 +286,7 @@ func Run(opts *Options, revision string) { break } snapshot, _ := chunkList.Snapshot() - matcher.Reset(snapshot, input(), true, !reading, sort, clearCache) - clearCache = false + matcher.Reset(snapshot, input(), true, !reading, sort, clearCache()) delay = false case EvtSearchProgress: @@ -327,7 +328,7 @@ func Run(opts *Options, revision string) { terminal.startChan <- true } } - terminal.UpdateList(val) + terminal.UpdateList(val, clearSelection()) } } } diff --git a/src/terminal.go b/src/terminal.go index d31ff6fe..87789a51 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -495,10 +495,13 @@ func (t *Terminal) UpdateProgress(progress float32) { } // UpdateList updates Merger to display the list -func (t *Terminal) UpdateList(merger *Merger) { +func (t *Terminal) UpdateList(merger *Merger, reset bool) { t.mutex.Lock() t.progress = 100 t.merger = merger + if reset { + t.selected = make(map[int32]selectedItem) + } t.mutex.Unlock() t.reqBox.Set(reqInfo, nil) t.reqBox.Set(reqList, nil) @@ -2068,7 +2071,6 @@ func (t *Terminal) Loop() { command := replacePlaceholder(a.a, t.ansi, t.delimiter, t.printsep, false, string(t.input), list) newCommand = &command - t.selected = make(map[int32]selectedItem) } } return true diff --git a/src/util/util.go b/src/util/util.go index 95c4e1b4..0aa1d804 100644 --- a/src/util/util.go +++ b/src/util/util.go @@ -112,3 +112,13 @@ func DurWithin( func IsTty() bool { return isatty.IsTerminal(os.Stdin.Fd()) } + +// Once returns a function that returns the specified boolean value only once +func Once(nextResponse bool) func() bool { + state := nextResponse + return func() bool { + prevState := state + state = false + return prevState + } +} diff --git a/src/util/util_test.go b/src/util/util_test.go index d6a03d9d..4baa56fb 100644 --- a/src/util/util_test.go +++ b/src/util/util_test.go @@ -20,3 +20,21 @@ func TestContrain(t *testing.T) { t.Error("Expected", 3) } } + +func TestOnce(t *testing.T) { + o := Once(false) + if o() { + t.Error("Expected: false") + } + if o() { + t.Error("Expected: false") + } + + o = Once(true) + if !o() { + t.Error("Expected: true") + } + if o() { + t.Error("Expected: false") + } +}