From 2ec4fc0cea18df083402d0bcdbdaf1dc061c8287 Mon Sep 17 00:00:00 2001 From: EnumDev Date: Sun, 8 Jun 2025 11:33:48 +0300 Subject: [PATCH] implement input history --- src/input_bar.go | 1 + src/window.go | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/input_bar.go b/src/input_bar.go index 31a4e39..ae5c795 100644 --- a/src/input_bar.go +++ b/src/input_bar.go @@ -11,6 +11,7 @@ type TyperInputRequest struct { inputChannel chan string } +var inputHistory = make([]string, 0) var currentInputRequest *TyperInputRequest func RequestInput(window *Window, text string, defaultInput string) chan string { diff --git a/src/window.go b/src/window.go index 5f2c545..34b2359 100644 --- a/src/window.go +++ b/src/window.go @@ -175,23 +175,54 @@ func (window *Window) input(ev *tcell.EventKey) { if window.CursorMode == CursorModeBuffer { x, y := window.GetCursorPos2D() window.SetCursorPos2D(x, y-1) - } else if ActiveDropdown != nil { + } else if window.CursorMode == CursorModeDropdown { dropdown := ActiveDropdown dropdown.Selected-- if dropdown.Selected < 0 { dropdown.Selected = 0 } + } else if window.CursorMode == CursorModeInputBar { + if len(inputHistory) == 0 { + return + } + + current := slices.Index(inputHistory, currentInputRequest.input) + if current < 0 { + current = len(inputHistory) - 1 + } else if current != 0 { + current-- + } + + currentInputRequest.input = inputHistory[current] + currentInputRequest.cursorPos = len(inputHistory[current]) } } else if ev.Key() == tcell.KeyDown { if window.CursorMode == CursorModeBuffer { x, y := window.GetCursorPos2D() window.SetCursorPos2D(x, y+1) - } else if ActiveDropdown != nil { + } else if window.CursorMode == CursorModeDropdown { dropdown := ActiveDropdown dropdown.Selected++ if dropdown.Selected >= len(dropdown.Options) { dropdown.Selected = len(dropdown.Options) - 1 } + } else if window.CursorMode == CursorModeInputBar { + if len(inputHistory) == 0 { + return + } + + current := slices.Index(inputHistory, currentInputRequest.input) + if current < 0 { + return + } else if current == len(inputHistory)-1 { + currentInputRequest.input = "" + return + } else { + current++ + } + + currentInputRequest.input = inputHistory[current] + currentInputRequest.cursorPos = len(inputHistory[current]) } } else if ev.Key() == tcell.KeyEscape { if window.CursorMode == CursorModeInputBar { @@ -268,6 +299,9 @@ func (window *Window) input(ev *tcell.EventKey) { window.textArea.CursorPos++ window.textArea.CurrentBuffer.Contents = str } else if window.CursorMode == CursorModeInputBar { + if currentInputRequest.input == "" && slices.Index(inputHistory, currentInputRequest.input) == -1 { + inputHistory = append(inputHistory, currentInputRequest.input) + } currentInputRequest.inputChannel <- currentInputRequest.input currentInputRequest = nil window.CursorMode = CursorModeBuffer