progressbar.lua
local t = require "terminal"
local Bar = require "terminal.progress.bar"
local DURATION = 20
local function make_bars()
local bar1 = Bar {
min = 0,
max = 100,
left_cap = "[",
right_cap = "] ",
tip_chars = Bar.block_tip_chars.block,
filled_char = "█",
empty_char = " ",
label = "Loading ",
format = "%3.0f%%",
label_attr = { fg = "cyan", brightness = "normal" },
filled_attr = { fg = "green", brightness = "high" },
empty_attr = { fg = "white", brightness = "low" },
cap_attr = { fg = "white", brightness = "normal" },
status_attr = { fg = "cyan", brightness = "normal" },
}
local bar2 = Bar {
min = 0,
max = 100,
left_cap = "🏁",
right_cap = " ",
tip_chars = { "🚗" },
filled_char = " ",
empty_char = "·",
reverse = true,
label = "Car race ",
format = "%3.0fm",
label_attr = { fg = "yellow", brightness = "high" },
filled_attr = { fg = "white", brightness = "low" },
empty_attr = { fg = "white", brightness = "normal" },
cap_attr = { fg = "yellow", brightness = "normal" },
status_attr = { fg = "yellow", brightness = "normal" },
}
local bar3 = Bar {
min = 0,
max = 100,
left_cap = "▕",
right_cap = "▏",
filled_char = "▓",
empty_char = "░",
label = "Labels ",
format = "%3.0f%% ",
status = "complete ", label_attr = { fg = "magenta", brightness = "high" },
filled_attr = { fg = "magenta", brightness = "high" },
empty_attr = { fg = "white", brightness = "low" },
cap_attr = { fg = "magenta", brightness = "normal" },
status_attr = { fg = "magenta", brightness = "normal" },
}
local bar4 = Bar {
min = 0,
max = 100,
mode = Bar.modes.loop,
left_cap = "[",
right_cap = "] ",
tip_chars = Bar.block_tip_chars.block,
filled_char = "█",
empty_char = " ",
label = "Loop ",
status = "cycle 1",
label_attr = { fg = "blue", brightness = "high" },
filled_attr = { fg = "blue", brightness = "high" },
empty_attr = { fg = "white", brightness = "low" },
cap_attr = { fg = "blue", brightness = "normal" },
status_attr = { fg = "blue", brightness = "normal" },
}
local bar5 = Bar {
min = 0,
max = 100,
mode = Bar.modes.bounce,
left_cap = "[",
right_cap = "] ",
tip_chars = {"<=>"},
filled_char = " ",
empty_char = " ",
label = "Bounce ",
status = "→",
label_attr = { fg = "red", brightness = "high" },
filled_attr = { fg = "red", brightness = "high" },
empty_attr = { fg = "white", brightness = "low" },
cap_attr = { fg = "red", brightness = "normal" },
status_attr = { fg = "red", brightness = "normal" },
}
return bar1, bar2, bar3, bar4, bar5
end
local function render_bars(bars, row_start)
local _, cols = t.size()
for i, bar in ipairs(bars) do
t.cursor.position.set(row_start + i - 1, 1)
t.output.write(tostring(bar:render(cols)))
end
end
local function main()
local rows, _ = t.size()
local bar1, bar2, bar3, bar4, bar5 = make_bars()
local bars = { bar1, bar2, bar3, bar4, bar5 }
local row_start = math.floor((rows - #bars - 1) / 2) + 2
t.cursor.visible.set(false)
t.clear.screen()
local sys = require "system"
local start = sys.gettime()
while true do
local elapsed = sys.gettime() - start
local raw = elapsed / DURATION * 100
bar1:set(raw)
bar2:set(raw)
bar3:set(raw)
if elapsed >= DURATION then
bar3:set_status("complete ")
elseif elapsed >= DURATION / 2 then
bar3:set_status("unpacking ")
else
bar3:set_status("downloading")
end
local cycle_secs = 4
bar4:set(elapsed / cycle_secs * 100)
bar4:set_status("cycle " .. tostring(math.floor(elapsed / cycle_secs) + 1))
local half_secs = 5
bar5:set(elapsed / half_secs * 100)
local going_forward = (elapsed / half_secs * 100) % 200 <= 100
bar5:set_status(going_forward and "→" or "←")
render_bars(bars, row_start)
t.output.flush()
if elapsed >= DURATION then
break
end
if t.input.readansi(0.05) then
break
end
end
t.input.readansi(10)
t.cursor.position.set(rows, 1)
t.cursor.visible.set(true)
end
t.initwrap(main, { displaybackup = true })()