e401a92cbf
git-svn-id: svn://kolibrios.org@6581 a494cfbc-eb01-0410-851d-a64ba20cac60
112 lines
2.4 KiB
Lua
112 lines
2.4 KiB
Lua
--
|
|
-- 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
|
|
|
|
}
|