cc/listview.lua

110 lines
2.5 KiB
Lua
Raw Normal View History

local backingList = {}
2024-06-01 23:39:01 +00:00
local length = 0
2024-06-02 15:39:21 +00:00
local paginationPos = 1
local frame = term.current()
local drawEntry = nil
local function setTerm(termlike)
frame = termlike
end
local function setDrawEntryFunc(drawLineFunc)
drawEntry = drawLineFunc
end
local function redrawEntry(idx)
2024-06-01 23:52:02 +00:00
local tw, th = frame.getSize()
2024-06-02 15:39:21 +00:00
if idx >= paginationPos and idx-paginationPos <= th then
frame.setCursorPos(1, idx-paginationPos+1)
if drawEntry then
drawEntry(frame, backingList[idx])
2024-06-02 02:22:07 +00:00
else
frame.setBackgroundColor(colors.red)
frame.clearLine()
frame.setBackgroundColor(colors.black)
end
end
end
local function itemAt(idx)
return backingList[idx]
end
local function updateItemAt(idx, item)
backingList[idx] = item
2024-06-01 23:39:01 +00:00
if idx > length then
length = idx
end
redrawEntry(idx)
end
2024-06-02 15:51:21 +00:00
local function getLength()
return length
end
2024-06-02 01:25:04 +00:00
local function clearFrom(idx)
2024-06-01 23:39:01 +00:00
local tw, th = frame.getSize()
2024-06-02 01:25:04 +00:00
for j = length, idx, -1 do
2024-06-01 23:39:01 +00:00
backingList[j] = nil
end
length = idx
2024-06-02 15:39:21 +00:00
for y = idx-paginationPos+1, th, 1 do
2024-06-01 23:39:01 +00:00
frame.setCursorPos(1, y)
frame.clearLine()
end
end
local function redraw()
if drawEntry then
local tw, th = frame.getSize()
2024-06-02 15:39:21 +00:00
local backingIdx = paginationPos
for idx = 1, th, 1 do
2024-06-02 00:08:55 +00:00
frame.setCursorPos(1, idx)
if backingList[backingIdx] == nil then
frame.clearLine()
else
drawEntry(frame, backingList[backingIdx])
end
2024-06-02 00:08:55 +00:00
backingIdx = backingIdx + 1
end
2024-06-02 02:22:07 +00:00
else
frame.setBackgroundColor(colors.red)
frame.clear()
frame.setBackgroundColor(colors.black)
end
end
2024-06-02 15:39:21 +00:00
local function updatePage(scrollPos)
if scrollPos ~= paginationPos then
paginationPos = scrollPos
redraw()
end
end
2024-06-02 02:22:07 +00:00
local function updatePartial(filter)
if drawEntry then
2024-06-02 02:22:07 +00:00
local tw, th = frame.getSize()
2024-06-02 15:39:21 +00:00
local backingIdx = paginationPos
2024-06-02 02:22:07 +00:00
for idx = 1, th, 1 do
frame.setCursorPos(1, idx)
if backingList[backingIdx] ~= nil and filter(backingList[backingIdx]) then
drawEntry(frame, backingList[backingIdx])
2024-06-02 02:22:07 +00:00
end
backingIdx = backingIdx + 1
end
end
end
return {
setTerm=setTerm,
setDrawEntryFunc=setDrawEntryFunc,
itemAt=itemAt,
updateItemAt=updateItemAt,
2024-06-02 15:51:21 +00:00
length=getLength,
2024-06-02 01:25:04 +00:00
clearFrom=clearFrom,
redraw=redraw,
updatePage=updatePage,
2024-06-02 02:22:07 +00:00
updatePartial=updatePartial,
}