diff --git a/graphics/elements/hbar.lua b/graphics/elements/hbar.lua index 189a429..bba4eb6 100644 --- a/graphics/elements/hbar.lua +++ b/graphics/elements/hbar.lua @@ -5,27 +5,35 @@ local util = require("scada-common.util") local element = require("graphics.element") ---@class hbar_args ----@field bar_fg_bg cpair bar foreground/background colors +---@field show_percent? boolean whether or not to show the percent +---@field bar_fg_bg? cpair bar foreground/background colors if showing percent ---@field parent graphics_element ---@field x? integer 1 if omitted ---@field y? integer 1 if omitted ---@field width? integer parent width if omitted +---@field height? integer parent height if omitted +---@field gframe? graphics_frame frame instead of x/y/width/height ---@field fg_bg cpair foreground/background colors -- new horizontal bar ---@param args hbar_args local function hbar(args) + -- properties/state 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 + -- bar width is width - 5 characters for " 100%" if showing percent + local bar_width = util.trinary(args.show_percent, e.frame.w - 5, e.frame.w) assert(bar_width > 0, "graphics.elements.hbar: too small for bar") + -- determine bar colors + local bar_bkg = util.trinary(args.bar_fg_bg == nil, e.fg_bg.blit_bkg, args.bar_fg_bg.blit_bkg) + local bar_fgd = util.trinary(args.bar_fg_bg == nil, e.fg_bg.blit_fgd, args.bar_fg_bg.blit_fgd) + -- set background blit string bkg = util.strrep(args.bar_fg_bg.blit_bkg, bar_width) @@ -45,34 +53,39 @@ local function hbar(args) if num_bars ~= last_num_bars then last_num_bars = num_bars - local bar = "" + local fgd = "" local spaces = "" -- fill percentage for _ = 1, num_bars / 2 do spaces = spaces .. " " - bar = bar .. args.bar_fg_bg.blit_fgd + fgd = fgd .. bar_fgd end -- add fractional bar if needed if num_bars % 2 == 1 then spaces = spaces .. "\x95" - bar = bar .. args.bar_fg_bg.blit_fgd + fgd = fgd .. bar_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 + fgd = fgd .. bar_bkg end - e.window.setCursorPos(1, 1) - e.window.blit(spaces, bar, bkg) + -- draw bar + for y = 1, e.frame.h do + e.window.setCursorPos(1, y) + e.window.blit(spaces, fgd, bkg) + end end -- update percentage - e.window.setCursorPos(bar_width + 1, 1) - e.window.write(util.sprintf("%3.0f%%", fraction * 100)) + if args.show_percent then + e.window.setCursorPos(bar_width + 1, math.max(1, math.ceil(e.frame.h / 2))) + e.window.write(util.sprintf("%3.0f%%", fraction * 100)) + end end return e.get() diff --git a/graphics/elements/vbar.lua b/graphics/elements/vbar.lua index d626575..333af74 100644 --- a/graphics/elements/vbar.lua +++ b/graphics/elements/vbar.lua @@ -1,4 +1,4 @@ --- Horizontal Bar Graphics Element +-- Vertical Bar Graphics Element local util = require("scada-common.util") @@ -16,7 +16,7 @@ local element = require("graphics.element") -- new vertical bar ---@param args vbar_args local function vbar(args) - -- last state + -- properties/state local last_num_bars = -1 -- create new graphics element base object