kolibrios/data/common/media/grafx2/scripts/libs/gui.lua

112 lines
2.4 KiB
Lua
Raw Normal View History

--
-- Event-driven GUI library
--
--
gui = {
--
-- dialog() --
--
dialog = function(args)
local dia = {
title = args.title,
w = args.w,
h = args.h,
--
widgets = {},
-- an indexed array, starting at 1. Used for calling the relevant
-- callback when a numbered control is clicked.
callbacks = {},
--
-- dialog.run() --
--
run = function(this)
windowopen(this.w,this.h, this.title or "");
-- examine all elements
for _,widget in ipairs(this.widgets) do
widget:render()
end
repeat
local button, button2, key = windowdodialog();
if button > 0 then
local c = this.callbacks[button]
-- run the callback and stop the form if it returns true
if c ~= nil and c(this) then
break;
end
end
until key == 27;
windowclose();
end
}
local id = 1;
-- examine all elements
for _,value in ipairs(args) do
-- all arguments that are tables are assumed to be widgets
if type(value)=="table" then
table.insert(dia.widgets, value)
-- clickable widgets take up an auto-numbered id
if (value.click) then
dia.callbacks[id] = value.click
id=id+1
end
end
end
return dia;
end,
--
-- button() --
--
button = function(args)
local but = {
x = args.x,
y = args.y,
w = args.w,
h = args.h,
key = args.key,
label = args.label,
click = args.click or donothing,
render = args.repeatable and function(this)
windowrepeatbutton(this.x, this.y, this.w, this.h, this.label, this.key or -1);
end
or function(this)
windowbutton(this.x, this.y, this.w, this.h, this.label, this.key or -1);
end
}
return but;
end,
--
-- label() --
--
label = function(args)
local fld = {
x = args.x,
y = args.y,
value = args.value,
format = args.format,
fg = args.fg or 0,
bg = args.bg or 2,
render = function(this)
if type(this.format) then
windowprint(this.x, this.y, string.format(this.format, this.value), this.fg, this.bg);
else
windowprint(this.x, this.y, this.value, this.fg, this.bg);
end
end
}
return fld;
end,
-- "do nothing" function. Used as default callback
donothing = function(this)
end
}