#63 horizontal fill bar indicator

This commit is contained in:
Mikayla Fischler 2022-06-08 14:16:05 -04:00
parent b99f57e480
commit 9d107da8d9

View File

@ -0,0 +1,84 @@
-- Horizontal Bar Graphics Element
local util = require("scada-common.util")
local element = require("graphics.element")
---@class hbar_args
---@field bar_fg_bg cpair bar foreground/background colors
---@field border? graphics_border
---@field parent graphics_element
---@field x? integer 1 if omitted
---@field y? integer 1 if omitted
---@field width? integer parent width if omitted
---@field fg_bg cpair foreground/background colors
-- new horizontal bar
---@param args hbar_args
local function hbar(args)
local bkg = ""
local last_num_bars = -1
-- create new graphics element base object
local e = element.new(args)
-- bar width is width - 5 characters for " 100%"
local bar_width = e.frame.w - 5
assert(bar_width > 0, "graphics.elements.hbar: too small for bar")
-- set background blit string
for _ = 1, bar_width do
bkg = bkg .. args.bar_fg_bg.blit_bkg
end
-- handle data changes
function e.on_update(fraction)
-- enforce minimum and maximum
if fraction < 0 then
fraction = 0.0
elseif fraction > 1 then
fraction = 1.0
end
-- compute number of bars
local num_bars = util.round((fraction * 100) / (bar_width * 2))
-- redraw bar if changed
if num_bars ~= last_num_bars then
last_num_bars = num_bars
local bar = ""
local spaces = ""
-- fill percentage
for _ = 1, num_bars / 2 do
spaces = spaces .. " "
bar = bar .. args.bar_fg_bg.blit_fgd
end
-- add fractional bar if needed
if num_bars % 2 == 1 then
spaces = spaces .. "\x95"
bar = bar .. args.bar_fg_bg.blit_fgd
end
-- pad background
for _ = 1, bar_width - ((num_bars / 2) + num_bars % 2) do
spaces = spaces .. " "
bar = bar .. args.bar_fg_bg.blit_bkg
end
e.window.setCursorPos(1, 1)
e.window.blit(spaces, bar, bkg)
end
-- update percentage
e.window.setCursorPos(bar_width + 1, 1)
e.window.write(util.sprintf("%3.0f%%", fraction * 100))
end
return e.get()
end
return hbar