diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/lib/term.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/lib/term.lua index 17c00a1e0..27092c9e7 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/lib/term.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/lib/term.lua @@ -105,17 +105,13 @@ function term.read(history, dobreak, hint, prompt) checkArg(1, history, "table", "nil") history = history or {} table.insert(history, "") - - if type(prompt) == "function" then - pcall(prompt) - elseif type(prompt) == "string" then - term.write(prompt) - end - local offset = term.getCursor() - 1 local scrollX, scrollY = 0, #history - 1 local cursorX = 1 + local hintCache = (type(hint)=="table" and #hint > 1)and hint + local selectedHint = 0 + local function getCursor() return cursorX, 1 + scrollY end @@ -255,45 +251,48 @@ function term.read(history, dobreak, hint, prompt) end local function tab() - local after = hint(line()) - if type(after) == "string" then + if not hintCache then + if type(hint) == "function" then + local h = hint(line()) + if type(h) == "string" then + local _, cby = getCursor() + history[cby] = after + elseif type(h) == "table" and #h > 0 then + hintCache = h + selectedHint = 1 + local _, cby = getCursor() + history[cby] = hintCache[selectedHint] or "" + end + end + else + selectedHint = (selectedHint+1)<=#hintCache and (selectedHint+1) or 1 local _, cby = getCursor() - history[cby] = after - elseif type(after) == "table" then - term.write("\n") - for _, name in pairs(after) do - term.write(name .. " ", true) - end - term.write("\n") - if type(prompt) == "function" then pcall(prompt) - elseif type(prompt) == "string" then term.write(prompt)end - elseif type(after) == "function" then - term.write("\n") - for name in after do --This is possibly not the best solution - term.write(name .. " ", true) - end - term.write("\n") - if type(prompt) == "function" then pcall(prompt) - elseif type(prompt) == "string" then term.write(prompt)end + history[cby] = hintCache[selectedHint] or "" end redraw() ende() end + local function cleanHint() + if type(hint) ~= "table" then + hintCache = nil + end + end + local function onKeyDown(char, code) term.setCursorBlink(false) if code == keyboard.keys.back then - if left() then delete() end + if left() then delete() end cleanHint() elseif code == keyboard.keys.delete then - delete() + delete()cleanHint() elseif code == keyboard.keys.left then left() elseif code == keyboard.keys.right then right() elseif code == keyboard.keys.home then - home() + home()cleanHint() elseif code == keyboard.keys["end"] then - ende() + ende()cleanHint() elseif code == keyboard.keys.up then up() elseif code == keyboard.keys.down then @@ -305,6 +304,7 @@ function term.read(history, dobreak, hint, prompt) if cby ~= #history then -- bring entry to front history[#history] = line() table.remove(history, cby) + cleanHint() end return true, history[#history] .. "\n" elseif keyboard.isControlDown() and code == keyboard.keys.d then @@ -317,6 +317,7 @@ function term.read(history, dobreak, hint, prompt) return true, nil elseif not keyboard.isControl(char) then insert(unicode.char(char)) + cleanHint() end term.setCursorBlink(true) term.setCursorBlink(true) -- force toggle to caret