#344 element redraws and shorter assert messages

This commit is contained in:
Mikayla Fischler
2023-09-29 19:34:10 -04:00
parent 70831b49d2
commit ed4180a072
35 changed files with 610 additions and 556 deletions

View File

@@ -25,13 +25,13 @@ local flasher = require("graphics.flasher")
---@param args alarm_indicator_light
---@return graphics_element element, element_id id
local function alarm_indicator_light(args)
assert(type(args.label) == "string", "graphics.elements.indicators.alight: label is a required field")
assert(type(args.c1) == "number", "graphics.elements.indicators.alight: c1 is a required field")
assert(type(args.c2) == "number", "graphics.elements.indicators.alight: c2 is a required field")
assert(type(args.c3) == "number", "graphics.elements.indicators.alight: c3 is a required field")
assert(type(args.label) == "string", "indicators.alight: label is a required field")
assert(type(args.c1) == "number", "indicators.alight: c1 is a required field")
assert(type(args.c2) == "number", "indicators.alight: c2 is a required field")
assert(type(args.c3) == "number", "indicators.alight: c3 is a required field")
if args.flash then
assert(util.is_int(args.period), "graphics.elements.indicators.alight: period is a required field if flash is enabled")
assert(util.is_int(args.period), "indicators.alight: period is a required field if flash is enabled")
end
-- single line
@@ -51,6 +51,8 @@ local function alarm_indicator_light(args)
-- create new graphics element base object
local e = element.new(args)
e.value = 1
-- called by flasher when enabled
local function flash_callback()
e.w_set_cur(1, 1)
@@ -105,9 +107,14 @@ local function alarm_indicator_light(args)
---@param val integer indicator state
function e.set_value(val) e.on_update(val) end
-- write label and initial indicator light
e.on_update(1)
e.w_write(args.label)
-- draw label and indicator light
function e.redraw()
e.on_update(e.value)
e.w_write(args.label)
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -18,8 +18,8 @@ local element = require("graphics.element")
---@param args core_map_args
---@return graphics_element element, element_id id
local function core_map(args)
assert(util.is_int(args.reactor_l), "graphics.elements.indicators.coremap: reactor_l is a required field")
assert(util.is_int(args.reactor_w), "graphics.elements.indicators.coremap: reactor_w is a required field")
assert(util.is_int(args.reactor_l), "indicators.coremap: reactor_l is a required field")
assert(util.is_int(args.reactor_w), "indicators.coremap: reactor_w is a required field")
-- require max dimensions
args.width = 18
@@ -31,6 +31,8 @@ local function core_map(args)
-- create new graphics element base object
local e = element.new(args)
e.value = 0
local alternator = true
local core_l = args.reactor_l - 2
@@ -157,11 +159,14 @@ local function core_map(args)
e.on_update(e.value)
end
-- initial (one-time except for resize()) frame draw
draw_frame()
-- redraw both frame and core
function e.redraw()
draw_frame()
draw_core(e.value)
end
-- initial draw
e.on_update(0)
e.redraw()
return e.complete()
end

View File

@@ -24,25 +24,17 @@ local element = require("graphics.element")
---@param args data_indicator_args
---@return graphics_element element, element_id id
local function data(args)
assert(type(args.label) == "string", "graphics.elements.indicators.data: label is a required field")
assert(type(args.format) == "string", "graphics.elements.indicators.data: format is a required field")
assert(args.value ~= nil, "graphics.elements.indicators.data: value is a required field")
assert(util.is_int(args.width), "graphics.elements.indicators.data: width is a required field")
assert(type(args.label) == "string", "indicators.data: label is a required field")
assert(type(args.format) == "string", "indicators.data: format is a required field")
assert(args.value ~= nil, "indicators.data: value is a required field")
assert(util.is_int(args.width), "indicators.data: width is a required field")
-- single line
args.height = 1
-- create new graphics element base object
local e = element.new(args)
-- label color
if args.lu_colors ~= nil then
e.w_set_fgd(args.lu_colors.color_a)
end
-- write label
e.w_set_cur(1, 1)
e.w_write(args.label)
e.value = args.value
local value_color = e.fg_bg.fgd
local label_len = string.len(args.label)
@@ -93,8 +85,17 @@ local function data(args)
e.on_update(e.value)
end
-- initial value draw
e.on_update(args.value)
-- element redraw
function e.redraw()
if args.lu_colors ~= nil then e.w_set_fgd(args.lu_colors.color_a) end
e.w_set_cur(1, 1)
e.w_write(args.label)
e.on_update(e.value)
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -28,10 +28,12 @@ local function hbar(args)
-- create new graphics element base object
local e = element.new(args)
e.value = 0.0
-- 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.indicators.hbar: too small for bar")
assert(bar_width > 0, "indicators.hbar: too small for bar")
-- determine bar colors
local bar_bkg = e.fg_bg.blit_bkg
@@ -105,20 +107,21 @@ local function hbar(args)
function e.recolor(bar_fg_bg)
bar_bkg = bar_fg_bg.blit_bkg
bar_fgd = bar_fg_bg.blit_fgd
-- re-draw
last_num_bars = 0
if type(e.value) == "number" then
e.on_update(e.value)
end
e.redraw()
end
-- set the percentage value
---@param val number 0.0 to 1.0
function e.set_value(val) e.on_update(val) end
-- initialize to 0
e.on_update(0)
-- element redraw
function e.redraw()
last_num_bars = -1
e.on_update(e.value)
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -23,18 +23,17 @@ local element = require("graphics.element")
---@param args icon_indicator_args
---@return graphics_element element, element_id id
local function icon(args)
assert(type(args.label) == "string", "graphics.elements.indicators.icon: label is a required field")
assert(type(args.states) == "table", "graphics.elements.indicators.icon: states is a required field")
assert(type(args.label) == "string", "indicators.icon: label is a required field")
assert(type(args.states) == "table", "indicators.icon: states is a required field")
-- single line
args.height = 1
-- determine width
args.width = math.max(args.min_label_width or 1, string.len(args.label)) + 4
-- create new graphics element base object
local e = element.new(args)
e.value = args.value or 1
-- state blit strings
local state_blit_cmds = {}
for i = 1, #args.states do
@@ -47,10 +46,6 @@ local function icon(args)
})
end
-- write label and initial indicator light
e.w_set_cur(5, 1)
e.w_write(args.label)
-- on state change
---@param new_state integer indicator state
function e.on_update(new_state)
@@ -64,8 +59,16 @@ local function icon(args)
---@param val integer indicator state
function e.set_value(val) e.on_update(val) end
-- initial icon draw
e.on_update(args.value or 1)
-- element redraw
function e.redraw()
e.w_set_cur(5, 1)
e.w_write(args.label)
e.on_update(e.value)
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -23,25 +23,23 @@ local flasher = require("graphics.flasher")
---@param args indicator_led_args
---@return graphics_element element, element_id id
local function indicator_led(args)
assert(type(args.label) == "string", "graphics.elements.indicators.led: label is a required field")
assert(type(args.colors) == "table", "graphics.elements.indicators.led: colors is a required field")
assert(type(args.label) == "string", "indicators.led: label is a required field")
assert(type(args.colors) == "table", "indicators.led: colors is a required field")
if args.flash then
assert(util.is_int(args.period), "graphics.elements.indicators.led: period is a required field if flash is enabled")
assert(util.is_int(args.period), "indicators.led: period is a required field if flash is enabled")
end
-- single line
args.height = 1
-- determine width
args.width = math.max(args.min_label_width or 0, string.len(args.label)) + 2
-- flasher state
local flash_on = true
-- create new graphics element base object
local e = element.new(args)
e.value = false
-- called by flasher when enabled
local function flash_callback()
e.w_set_cur(1, 1)
@@ -88,13 +86,18 @@ local function indicator_led(args)
---@param val boolean indicator state
function e.set_value(val) e.on_update(val) end
-- write label and initial indicator light
e.on_update(false)
if string.len(args.label) > 0 then
e.w_set_cur(3, 1)
e.w_write(args.label)
-- draw label and indicator light
function e.redraw()
e.on_update(e.value)
if string.len(args.label) > 0 then
e.w_set_cur(3, 1)
e.w_write(args.label)
end
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -25,25 +25,20 @@ local flasher = require("graphics.flasher")
---@param args indicator_led_pair_args
---@return graphics_element element, element_id id
local function indicator_led_pair(args)
assert(type(args.label) == "string", "graphics.elements.indicators.ledpair: label is a required field")
assert(type(args.off) == "number", "graphics.elements.indicators.ledpair: off is a required field")
assert(type(args.c1) == "number", "graphics.elements.indicators.ledpair: c1 is a required field")
assert(type(args.c2) == "number", "graphics.elements.indicators.ledpair: c2 is a required field")
assert(type(args.label) == "string", "indicators.ledpair: label is a required field")
assert(type(args.off) == "number", "indicators.ledpair: off is a required field")
assert(type(args.c1) == "number", "indicators.ledpair: c1 is a required field")
assert(type(args.c2) == "number", "indicators.ledpair: c2 is a required field")
if args.flash then
assert(util.is_int(args.period), "graphics.elements.indicators.ledpair: period is a required field if flash is enabled")
assert(util.is_int(args.period), "indicators.ledpair: period is a required field if flash is enabled")
end
-- single line
args.height = 1
-- determine width
args.width = math.max(args.min_label_width or 0, string.len(args.label)) + 2
-- flasher state
local flash_on = true
-- blit translations
local co = colors.toBlit(args.off)
local c1 = colors.toBlit(args.c1)
local c2 = colors.toBlit(args.c2)
@@ -51,7 +46,6 @@ local function indicator_led_pair(args)
-- create new graphics element base object
local e = element.new(args)
-- init value for initial check in on_update
e.value = 1
-- called by flasher when enabled
@@ -86,7 +80,6 @@ local function indicator_led_pair(args)
elseif new_state <= 1 then
flash_on = false
flasher.stop(flash_callback)
e.w_blit("\x8c", co, e.fg_bg.blit_bkg)
end
elseif new_state == 2 then
@@ -102,13 +95,18 @@ local function indicator_led_pair(args)
---@param val integer indicator state
function e.set_value(val) e.on_update(val) end
-- write label and initial indicator light
e.on_update(1)
if string.len(args.label) > 0 then
e.w_set_cur(3, 1)
e.w_write(args.label)
-- draw label and indicator light
function e.redraw()
e.on_update(e.value)
if string.len(args.label) > 0 then
e.w_set_cur(3, 1)
e.w_write(args.label)
end
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -18,19 +18,15 @@ local element = require("graphics.element")
---@param args indicator_led_rgb_args
---@return graphics_element element, element_id id
local function indicator_led_rgb(args)
assert(type(args.label) == "string", "graphics.elements.indicators.ledrgb: label is a required field")
assert(type(args.colors) == "table", "graphics.elements.indicators.ledrgb: colors is a required field")
assert(type(args.label) == "string", "indicators.ledrgb: label is a required field")
assert(type(args.colors) == "table", "indicators.ledrgb: colors is a required field")
-- single line
args.height = 1
-- determine width
args.width = math.max(args.min_label_width or 0, string.len(args.label)) + 2
-- create new graphics element base object
local e = element.new(args)
-- init value for initial check in on_update
e.value = 1
-- on state change
@@ -47,13 +43,18 @@ local function indicator_led_rgb(args)
---@param val integer indicator state
function e.set_value(val) e.on_update(val) end
-- write label and initial indicator light
e.on_update(1)
if string.len(args.label) > 0 then
e.w_set_cur(3, 1)
e.w_write(args.label)
-- draw label and indicator light
function e.redraw()
e.on_update(e.value)
if string.len(args.label) > 0 then
e.w_set_cur(3, 1)
e.w_write(args.label)
end
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -23,25 +23,23 @@ local flasher = require("graphics.flasher")
---@param args indicator_light_args
---@return graphics_element element, element_id id
local function indicator_light(args)
assert(type(args.label) == "string", "graphics.elements.indicators.light: label is a required field")
assert(type(args.colors) == "table", "graphics.elements.indicators.light: colors is a required field")
assert(type(args.label) == "string", "indicators.light: label is a required field")
assert(type(args.colors) == "table", "indicators.light: colors is a required field")
if args.flash then
assert(util.is_int(args.period), "graphics.elements.indicators.light: period is a required field if flash is enabled")
assert(util.is_int(args.period), "indicators.light: period is a required field if flash is enabled")
end
-- single line
args.height = 1
-- determine width
args.width = math.max(args.min_label_width or 1, string.len(args.label)) + 2
-- flasher state
local flash_on = true
-- create new graphics element base object
local e = element.new(args)
e.value = false
-- called by flasher when enabled
local function flash_callback()
e.w_set_cur(1, 1)
@@ -88,10 +86,15 @@ local function indicator_light(args)
---@param val boolean indicator state
function e.set_value(val) e.on_update(val) end
-- write label and initial indicator light
e.on_update(false)
e.w_set_cur(3, 1)
e.w_write(args.label)
-- draw label and indicator light
function e.redraw()
e.on_update(false)
e.w_set_cur(3, 1)
e.w_write(args.label)
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -9,7 +9,7 @@ local element = require("graphics.element")
---@field format string power format override (lua string format)
---@field rate boolean? whether to append /t to the end (power per tick)
---@field lu_colors? cpair label foreground color (a), unit foreground color (b)
---@field value any default value
---@field value number default value
---@field parent graphics_element
---@field id? string element id
---@field x? integer 1 if omitted
@@ -23,26 +23,17 @@ local element = require("graphics.element")
---@param args power_indicator_args
---@return graphics_element element, element_id id
local function power(args)
assert(args.value ~= nil, "graphics.elements.indicators.power: value is a required field")
assert(util.is_int(args.width), "graphics.elements.indicators.power: width is a required field")
assert(type(args.value) == "number", "indicators.power: value is a required number field")
assert(util.is_int(args.width), "indicators.power: width is a required field")
-- single line
args.height = 1
-- create new graphics element base object
local e = element.new(args)
-- label color
if args.lu_colors ~= nil then
e.w_set_fgd(args.lu_colors.color_a)
end
e.value = args.value
-- write label
e.w_set_cur(1, 1)
e.w_write(args.label)
local data_start = string.len(args.label) + 2
if string.len(args.label) == 0 then data_start = 1 end
local data_start = 0
-- on state change
---@param value any new value
@@ -77,8 +68,20 @@ local function power(args)
---@param val any new value
function e.set_value(val) e.on_update(val) end
-- initial value draw
e.on_update(args.value)
-- element redraw
function e.redraw()
if args.lu_colors ~= nil then e.w_set_fgd(args.lu_colors.color_a) end
e.w_set_cur(1, 1)
e.w_write(args.label)
data_start = string.len(args.label) + 2
if string.len(args.label) == 0 then data_start = 1 end
e.on_update(e.value)
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -10,7 +10,7 @@ local element = require("graphics.element")
---@field format string data format (lua string format)
---@field commas? boolean whether to use commas if a number is given (default to false)
---@field lu_colors? cpair label foreground color (a), unit foreground color (b)
---@field value any default value
---@field value number default value
---@field parent graphics_element
---@field id? string element id
---@field x? integer 1 if omitted
@@ -24,24 +24,17 @@ local element = require("graphics.element")
---@param args rad_indicator_args
---@return graphics_element element, element_id id
local function rad(args)
assert(type(args.label) == "string", "graphics.elements.indicators.rad: label is a required field")
assert(type(args.format) == "string", "graphics.elements.indicators.rad: format is a required field")
assert(util.is_int(args.width), "graphics.elements.indicators.rad: width is a required field")
assert(type(args.value) ~= "number", "indicators.rad: value is a required number field")
assert(type(args.label) == "string", "indicators.rad: label is a required field")
assert(type(args.format) == "string", "indicators.rad: format is a required field")
assert(util.is_int(args.width), "indicators.rad: width is a required field")
-- single line
args.height = 1
-- create new graphics element base object
local e = element.new(args)
-- label color
if args.lu_colors ~= nil then
e.w_set_fgd(args.lu_colors.color_a)
end
-- write label
e.w_set_cur(1, 1)
e.w_write(args.label)
e.value = types.new_zero_radiation_reading()
local label_len = string.len(args.label)
local data_start = 1
@@ -82,8 +75,17 @@ local function rad(args)
---@param val any new value
function e.set_value(val) e.on_update(val) end
-- initial value draw
e.on_update(types.new_zero_radiation_reading())
-- element redraw
function e.redraw()
if args.lu_colors ~= nil then e.w_set_fgd(args.lu_colors.color_a) end
e.w_set_cur(1, 1)
e.w_write(args.label)
e.on_update(e.value)
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -25,16 +25,14 @@ local element = require("graphics.element")
---@param args state_indicator_args
---@return graphics_element element, element_id id
local function state_indicator(args)
assert(type(args.states) == "table", "graphics.elements.indicators.state: states is a required field")
assert(type(args.states) == "table", "indicators.state: states is a required field")
-- determine height
if util.is_int(args.height) then
assert(args.height % 2 == 1, "graphics.elements.indicators.state: height should be an odd number")
assert(args.height % 2 == 1, "indicators.state: height should be an odd number")
else
args.height = 1
end
-- initial guess at width
args.width = args.min_width or 1
-- state blit strings
@@ -42,7 +40,6 @@ local function state_indicator(args)
for i = 1, #args.states do
local state_def = args.states[i] ---@type state_text_color
-- re-determine width
if string.len(state_def.text) > args.width then
args.width = string.len(state_def.text)
end
@@ -59,13 +56,20 @@ local function state_indicator(args)
-- create new graphics element base object
local e = element.new(args)
e.value = args.value or 1
-- element redraw
function e.redraw()
local blit_cmd = state_blit_cmds[e.value]
e.w_set_cur(1, 1)
e.w_blit(blit_cmd.text, blit_cmd.fgd, blit_cmd.bkg)
end
-- on state change
---@param new_state integer indicator state
function e.on_update(new_state)
local blit_cmd = state_blit_cmds[new_state]
e.value = new_state
e.w_set_cur(1, 1)
e.w_blit(blit_cmd.text, blit_cmd.fgd, blit_cmd.bkg)
e.redraw()
end
-- set indicator state
@@ -73,7 +77,7 @@ local function state_indicator(args)
function e.set_value(val) e.on_update(val) end
-- initial draw
e.on_update(args.value or 1)
e.redraw()
return e.complete()
end

View File

@@ -25,35 +25,29 @@ local flasher = require("graphics.flasher")
---@param args tristate_indicator_light_args
---@return graphics_element element, element_id id
local function tristate_indicator_light(args)
assert(type(args.label) == "string", "graphics.elements.indicators.trilight: label is a required field")
assert(type(args.c1) == "number", "graphics.elements.indicators.trilight: c1 is a required field")
assert(type(args.c2) == "number", "graphics.elements.indicators.trilight: c2 is a required field")
assert(type(args.c3) == "number", "graphics.elements.indicators.trilight: c3 is a required field")
assert(type(args.label) == "string", "indicators.trilight: label is a required field")
assert(type(args.c1) == "number", "indicators.trilight: c1 is a required field")
assert(type(args.c2) == "number", "indicators.trilight: c2 is a required field")
assert(type(args.c3) == "number", "indicators.trilight: c3 is a required field")
if args.flash then
assert(util.is_int(args.period), "graphics.elements.indicators.trilight: period is a required field if flash is enabled")
assert(util.is_int(args.period), "indicators.trilight: period is a required field if flash is enabled")
end
-- single line
args.height = 1
-- determine width
args.width = math.max(args.min_label_width or 1, string.len(args.label)) + 2
-- flasher state
local flash_on = true
-- blit translations
local c1 = colors.toBlit(args.c1)
local c2 = colors.toBlit(args.c2)
local c3 = colors.toBlit(args.c3)
-- create new graphics element base object
local e = element.new(args)
-- init value for initial check in on_update
e.value = 1
local flash_on = true
local c1 = colors.toBlit(args.c1)
local c2 = colors.toBlit(args.c2)
local c3 = colors.toBlit(args.c3)
-- called by flasher when enabled
local function flash_callback()
e.w_set_cur(1, 1)
@@ -102,9 +96,14 @@ local function tristate_indicator_light(args)
---@param val integer indicator state
function e.set_value(val) e.on_update(val) end
-- write label and initial indicator light
e.on_update(1)
e.w_write(args.label)
-- draw light and label
function e.redraw()
e.on_update(1)
e.w_write(args.label)
end
-- initial draw
e.redraw()
return e.complete()
end

View File

@@ -20,13 +20,13 @@ local element = require("graphics.element")
---@param args vbar_args
---@return graphics_element element, element_id id
local function vbar(args)
-- properties/state
local last_num_bars = -1
-- create new graphics element base object
local e = element.new(args)
-- blit strings
e.value = 0.0
local last_num_bars = -1
local fgd = string.rep(e.fg_bg.blit_fgd, e.frame.w)
local bkg = string.rep(e.fg_bg.blit_bkg, e.frame.w)
local spaces = util.spaces(e.frame.w)
@@ -52,10 +52,7 @@ local function vbar(args)
if num_bars ~= last_num_bars then
last_num_bars = num_bars
-- start bottom up
local y = e.frame.h
-- start at base of vertical bar
e.w_set_cur(1, y)
-- fill percentage
@@ -83,22 +80,26 @@ local function vbar(args)
end
end
-- set the percentage value
---@param val number 0.0 to 1.0
function e.set_value(val) e.on_update(val) end
-- element redraw
function e.redraw()
last_num_bars = -1
e.on_update(e.value)
end
-- change bar color
---@param fg_bg cpair new bar colors
function e.recolor(fg_bg)
fgd = string.rep(fg_bg.blit_fgd, e.frame.w)
bkg = string.rep(fg_bg.blit_bkg, e.frame.w)
-- re-draw
last_num_bars = 0
if type(e.value) == "number" then
e.on_update(e.value)
end
e.redraw()
end
-- set the percentage value
---@param val number 0.0 to 1.0
function e.set_value(val) e.on_update(val) end
-- initial draw
e.redraw()
return e.complete()
end