cc/listview.lua

85 lines
1.9 KiB
Lua

local backingList = {}
local length = 0
local paginationOffset = 1
local frame = term.current()
local drawLine = nil
local function setTerm(termlike)
frame = termlike
end
local function setDrawLineFunc(drawLineFunc)
drawLine = drawLineFunc
end
local function redrawLine(idx)
local tw, th = frame.getSize()
if idx >= paginationOffset and idx-paginationOffset <= th then
frame.setCursorPos(1, idx-paginationOffset+1)
frame.setBackgroundColor(colors.red)
frame.clearLine()
frame.setBackgroundColor(colors.black)
if drawLine then
drawLine(frame, backingList[idx])
end
end
end
local function itemAt(idx)
return backingList[idx]
end
local function updateItemAt(idx, item)
backingList[idx] = item
if idx > length then
length = idx
end
redrawLine(idx)
end
local function clearFrom(idx)
local tw, th = frame.getSize()
for j = length, idx, -1 do
backingList[j] = nil
end
length = idx
for y = idx-paginationOffset+1, th, 1 do
frame.setCursorPos(1, y)
frame.clearLine()
end
end
local function redraw()
if drawLine then
local tw, th = frame.getSize()
local backingIdx = paginationOffset
for idx = 1, th, 1 do
frame.setCursorPos(1, idx)
if backingList[backingIdx] == nil then
frame.clearLine()
else
drawLine(frame, backingList[backingIdx])
end
backingIdx = backingIdx + 1
end
end
end
local function updatePage(newOffset)
if newOffset ~= paginationOffset then
paginationOffset = newOffset
redraw()
end
end
return {
setTerm=setTerm,
setDrawLineFunc=setDrawLineFunc,
itemAt=itemAt,
updateItemAt=updateItemAt,
clearFrom=clearFrom,
redraw=redraw,
updatePage=updatePage,
}