feat(CountersSelector): refactor + better title bar

This commit is contained in:
Guillaume ARM 2024-05-23 21:55:36 +02:00
parent ab17e80fa5
commit 7f7d3e801e

View File

@ -4,32 +4,40 @@ local function noTitleFn()
return "" return ""
end end
local function withColor(win, textColor, backgroundColor, callbackFn)
local originalTextColor = nil
local originalBackgroundColor = nil
if textColor then
originalTextColor = win.getTextColor()
win.setTextColor(textColor)
end
if backgroundColor then
originalBackgroundColor = win.getBackgroundColor()
win.setBackgroundColor(backgroundColor)
end
local result = table.pack(callbackFn(win))
if originalTextColor then
win.setTextColor(originalTextColor)
end
if originalBackgroundColor then
win.setBackgroundColor(originalBackgroundColor)
end
return table.unpack(result)
end
local function createWriteWithColor(textColor, backgroundColor, givenWin) local function createWriteWithColor(textColor, backgroundColor, givenWin)
local win = givenWin or term local win = givenWin or term
return function(str) return function(str)
local originalTextColor = nil return withColor(win, textColor, backgroundColor, function()
local originalBackgroundColor = nil return win.write(str)
end)
if textColor then
originalTextColor = win.getTextColor()
win.setTextColor(textColor)
end
if backgroundColor then
originalBackgroundColor = win.getBackgroundColor()
win.setBackgroundColor(backgroundColor)
end
win.write(str)
if originalTextColor then
win.setTextColor(originalTextColor)
end
if originalBackgroundColor then
win.setBackgroundColor(originalBackgroundColor)
end
end end
end end
@ -71,49 +79,54 @@ local function takeN(t, n)
return result return result
end end
local TITLE_MARGIN = 1 local function renderCountersMap(win, countersMap, selectedCounter)
win.clear()
local function renderCountersMap(win, countersMap, selectedCounter, titleFn)
local writeRegular = createWriteWithColor(colors.white, colors.black, win)
local writeSelected = createWriteWithColor(colors.black, colors.white, win)
win.setCursorPos(1, 1) win.setCursorPos(1, 1)
local _, height = win.getSize() local _, height = win.getSize()
-- local nbCounters = utils.sizeof(countersMap) -- local nbCounters = utils.sizeof(countersMap)
-- local totalCount = getTotalCount(countersMap) -- local totalCount = getTotalCount(countersMap)
local topMargin = 0 -- if titleFn ~= noTitleFn then
local bottomMargin = 0 -- withColor(win, colors.white, colors.green, function()
-- win.clearLine()
-- win.write(titleFn(countersMap, selectedCounter))
-- end)
if titleFn ~= noTitleFn then -- -- topMargin = TITLE_MARGIN
writeRegular('custom title: ' .. titleFn(countersMap, selectedCounter)) -- end
topMargin = TITLE_MARGIN
end
local availableHeight = height - topMargin - bottomMargin local selectedPage = math.floor((selectedCounter - 1) / height) + 1
-- local totalPages = (nbCounters % height) + 1
local selectedPage = math.floor((selectedCounter - 1) / availableHeight) + 1 local nbElementsToOmit = (selectedPage - 1) * height
-- local totalPages = (nbCounters % availableHeight) + 1 local displayedCounters = takeN(dropN(countersMap, nbElementsToOmit), height)
local nbElementsToOmit = (selectedPage - 1) * availableHeight local cursorYIndex = 1
local displayedCounters = takeN(dropN(countersMap, nbElementsToOmit), availableHeight)
local cursorYIndex = 1 + topMargin
for k,v in pairs(displayedCounters) do for k,v in pairs(displayedCounters) do
win.setCursorPos(1, cursorYIndex) win.setCursorPos(1, cursorYIndex)
local line = tostring(v.name) .. ' ' .. tostring(v.count) local writeLine = function() return tostring(v.name) .. ' ' .. tostring(v.count) end
if k == selectedCounter then if k == selectedCounter then
writeSelected(line) withColor(win, colors.black, colors.white, writeLine)
else else
writeRegular(line) withColor(win, colors.white, colors.black, writeLine)
end end
cursorYIndex = cursorYIndex + 1 cursorYIndex = cursorYIndex + 1
end end
end end
local function renderTitle(win, countersMap, selectedCounter, titleFn)
win.clear()
win.setCursorPos(1, 1)
withColor(win, colors.white, colors.green, function()
win.clearLine()
win.write(titleFn(countersMap, selectedCounter))
end)
end
local function CountersSelector(initialCountersMap, config) local function CountersSelector(initialCountersMap, config)
local countersMap = utils.shallowClone(initialCountersMap) local countersMap = utils.shallowClone(initialCountersMap)
local counterMax = config.counterMax local counterMax = config.counterMax
@ -135,19 +148,18 @@ local function CountersSelector(initialCountersMap, config)
error('counter cannot be greater than the counterMax') error('counter cannot be greater than the counterMax')
end end
local topHeight = 0 local topHeight = 1
if titleFn ~= noTitleFn then
topHeight = 1
end
term.clear() term.clear()
local width, height = term.getSize() local width, height = term.getSize()
local mainWin = window.create(term.current(), 1, 1 + topHeight, width, height - topHeight) local mainWin = window.create(term.current(), 1, 1 + topHeight, width, height - topHeight)
local titleWin = window.create(term.current(), 1, 1, width, 1 + topHeight)
local shouldContinue = true local shouldContinue = true
while shouldContinue do while shouldContinue do
mainWin.clear() renderTitle(titleWin, countersMap, selectedCounter, titleFn)
renderCountersMap(mainWin, countersMap, selectedCounter, titleFn) renderCountersMap(mainWin, countersMap, selectedCounter)
local _, keyPressed, _ = os.pullEvent('key') local _, keyPressed, _ = os.pullEvent('key')
if keyPressed == keys.up then if keyPressed == keys.up then