You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
3.4 KiB
Lua

-- sample for termfx
-- Gunnar Zötl <gz@tset.de>, 2014-2015
-- Released under the terms of the MIT license. See file LICENSE for details.
--[[
simpleui.lua
very simple ui elements for termfx samples:
ui = require "simpleui"
ui.box(x, y, w, h)
draws a box with a frame
ui.ask(msg)
prints a message and gives the option to select Yes or No.
Returns true if Yes was selected, false otherwise
ui.message(msg)
prints a message in a box and returns on ESC, Return or Space.
ui.select(msg, tbl)
presents a list of up to 9 items with a header, allows to select
an item by number, or ESC, Return or Space to exit without
selecting. Returns the selected number, or false if ESC, Return
or Space was pressed.
--]]
local _M = {}
local tfx = require "termfx"
local function draw_box(x, y, w, h)
local ccell = tfx.newcell('+')
local hcell = tfx.newcell('-')
local vcell = tfx.newcell('|')
for i = x, x + w do
tfx.setcell(i, y - 1, hcell)
tfx.setcell(i, y + h, hcell)
end
for i = y, y + h do
tfx.setcell(x - 1, i, vcell)
tfx.setcell(x + w, i, vcell)
end
tfx.setcell(x - 1, y - 1, ccell)
tfx.setcell(x - 1, y + h, ccell)
tfx.setcell(x + w, y - 1, ccell)
tfx.setcell(x + w, y + h, ccell)
tfx.rect(x, y, w, h, ' ', fg, bg)
end
_M.box = draw_box
local function frame(w, h)
local tw, th = tfx.size()
if w + 2 > tw then
w = tw - 2
end
if h + 2 > th then
h = th - 2
end
local x = math.floor((tw - w) / 2)
local y = math.floor((th - h) / 2)
draw_box(x, y, w, h)
return x, y, w, h
end
function _M.ask(msg)
local mw = #msg
if mw < 6 then
mw = 6
end
local x, y, w, h = frame(mw, 3)
tfx.printat(x, y, msg, w)
local p = x + math.floor((w - 6) / 2)
tfx.attributes(tfx.color.BLACK, tfx.color.GREEN)
tfx.printat(p, y + 2, "Yes")
tfx.attributes(tfx.color.BLACK, tfx.color.RED)
tfx.printat(p + 4, y + 2, "No")
tfx.present()
local answer = nil
while answer == nil do
local evt = tfx.pollevent()
if evt.char == 'y' or evt.char == 'Y' then
answer = true
elseif evt.char == 'n' or evt.char == 'N' then
answer = false
end
end
return answer
end
function _M.message(msg)
local mw = #msg
local x, y, w, h = frame(mw, 3)
tfx.printat(x, y, msg, w)
local p = x + math.floor((w - 2) / 2)
tfx.attributes(tfx.color.BLACK, tfx.color.GREEN)
tfx.printat(p, y + 2, "Ok")
tfx.present()
local evt
repeat
evt = tfx.pollevent()
until evt.key == tfx.key.ENTER or evt.key == tfx.key.SPACE or evt.key == tfx.key.ESC
end
function _M.select(msg, tbl)
local mw = #msg
local mh = #tbl
if mh > 9 then
mh = 9
end
for i = 1, mh do
if mw < #tbl[i] + 2 then
mw = #tbl[i] + 2
end
end
local x, y, w, h = frame(mw, mh + 2)
tfx.printat(x, y, msg, w)
for i = 1, mh do
tfx.printat(x, y + 1 + i, i .. " " .. tbl[i], w)
end
tfx.present()
local answer = nil
while answer == nil do
local evt = tfx.pollevent()
if evt.char >= '1' and evt.char <= tostring(mh) then
answer = tbl[tonumber(evt.char)]
elseif evt.key == tfx.key.ENTER or evt.key == tfx.key.SPACE or evt.key == tfx.key.ESC then
answer = false
end
end
return answer
end
return _M