open-card-table/ui.lua

142 lines
3.7 KiB
Lua

-- Contains user interface elements
require("oct_utils")
require("termbox_defs")
-- visible_textboxes is a global list of all textboxes we can cycle through
-- it is, in principle, a circular list
-- the top of the list is the currently selected textbox
-- upon a switch (i.e. TAB key), the list is rotated
registered_textboxes = {}
function create_textbox(id, pos_x, pos_y, max_length, label)
t = oct_tb_sprite_new()
t["x"] = pos_x
t["y"] = pos_y
t["shape"] = label .. string.rep("_", max_length) -- what is displayed to user
t["fg"] = TB_WHITE
local textbox = {}
textbox["sprite"] = t
textbox["contents"] = "" -- what is returned when box is submitted
textbox["max_length"] = max_length
textbox["id"] = id
textbox["label"] = label
return textbox
end
function update_registered_textboxes_appearance()
if (registered_textboxes[1])
then
-- textbox at front is focused, set to green
registered_textboxes[1]["sprite"]["fg"] = TB_GREEN
-- set all other textboxes to unfocused (white colored)
for i=2,#registered_textboxes
do
registered_textboxes[i]["sprite"]["fg"] = TB_WHITE
end
end
end
function register_textbox(textbox)
already_registered = false;
for i=1,#registered_textboxes
do
if (registered_textboxes[i] == textbox)
then
already_registered = true
end
end
if (already_registered)
then
OCT_LOG_WARNING("Attempted to register an already-registered textbox")
else
table.insert(registered_textboxes, 1, textbox)
end
update_registered_textboxes_appearance()
end
function unregister_textbox(textbox)
removed = false
for i=1,#registered_textboxes
do
if (registered_textboxes[i] == textbox)
then
table.remove(registered_textboxes, i)
textbox["sprite"]["fg"] = TB_WHITE
removed = true
end
end
if not removed
then
OCT_LOG_WARNING("Attempted to unregister an unregistered textbox")
end
update_registered_textboxes_appearance()
end
function textbox_contents_to_shape(contents, max_length)
l = string.len(contents)
ret_str = ""
if (l < max_length+1)
then
ret_str = contents
n_underscores = max_length - l
ret_str = ret_str .. string.rep("_", n_underscores)
else -- show only the last max_length characters
ret_str = string.sub(contents, -max_length)
end
return ret_str
end
function handle_textbox(key, ch)
local to_return = nil
if (registered_textboxes[1] == nil)
then
OCT_LOG_WARNING("Called handle_textbox when no textboxes are registered")
else
-- Convert ch from a character code to a character
ch = string.char(ch)
-- if nothing was pressed, ch is '\0' (null byte)
if (ch ~= '\0')
then
-- Update the contents of the textbox, this isn't displayed by default
registered_textboxes[1]["contents"] = registered_textboxes[1]["contents"] .. ch
end
if (key == TB_KEY_BACKSPACE2 or key == TB_KEY_BACKSPACE)
then
registered_textboxes[1]["contents"] = string.sub(registered_textboxes[1]["contents"], 1, string.len(registered_textboxes[1]["contents"])-1)
end
-- Update the user-visible sprite
if (registered_textboxes[1])
then
registered_textboxes[1]["sprite"]["shape"] = registered_textboxes[1]["label"] .. textbox_contents_to_shape(registered_textboxes[1]["contents"], registered_textboxes[1]["max_length"])
end
-- Submit our registered textboxes
if (key == TB_KEY_ENTER)
then
to_return = {}
for i=1,#registered_textboxes
do
curr = registered_textboxes[i]
to_return[curr["id"]] = curr["contents"]
end
end
-- Rotate the registered textboxes
if (key == TB_KEY_TAB)
then
table.insert(registered_textboxes, 1, table.remove(registered_textboxes))
update_registered_textboxes_appearance()
end
end
return to_return
end