steed/stead/input.lua
2010-06-07 13:35:16 +00:00

135 lines
2.4 KiB
Lua

require "kbd/kbd-en"
require "kbd/kbd-ru"
require "kbd/kbd-lower"
input.cursor = '_'
function tolow(s)
if not s then
return
end
s = s:lower();
local xlat = kbdlower
if xlat then
local k,v
for k,v in pairs(xlat) do
s = s:gsub(k,v);
end
end
return s;
end
function kbdxlat(s)
local kbd
if s == 'space' then
return ' '
end
if s == 'return' then
return '\n'
end
if s:len() > 1 then
return
end
if input.kbd_alt then
kbd = kbden;
else
kbd = kbdru
end
if kbd and input.kbd_shift then
kbd = kbd.shifted;
end
if not kbd[s] then
if input.kbd_shift then
return s:upper();
end
return s;
end
return kbd[s]
end
game.action = hook(game.action, function (f, s, cmd, ...)
if cmd == 'kbd_enter' then
return call(here(), 'kbd_enter');
end
if f then return f(s, cmd, unpack(args)) end
end)
input_kbd = function(s, down, key)
if not input._txt then
return
end
if key:find("shift") then
input.kbd_shift = down
elseif key:find("alt") and down then
input.kbd_alt = not input.kbd_alt;
elseif down then
if key == "return" then
input.txte = true
return "kbd_enter"
end
if key == "backspace" then
if input._txt == '' then
return
end
if input._txt:byte(input._txt:len()) >= 128 then
input._txt = input._txt:sub(1, input._txt:len() - 2);
else
input._txt = input._txt:sub(1, input._txt:len() - 1);
end
return "look"
end
local c = kbdxlat(key);
if not c then return end
input._txt = input._txt..c;
return "look"
end
end
input.key = input_kbd;
function inp(info, txt)
local v = { nam = '', _txt = '', info = info }
if txt then
v._txt = txt
end
v.dsc = function(s)
if input.txte and s._edit then -- enter!!!
input.txte = false
s._edit = false
s._txt = input._txt
input._txt = false
end
if s._edit then
return s.info..input._txt..input.cursor
end
return s.info..s._txt
end
v.text = function(s)
if s._edit then return input._txt end
return s._txt
end
v.match = function(s, str)
local aa = tolow(tostring(str)):gsub("\*",".*"):gsub("[?]",".?");
local bb = tolow(tostring(s:text()));
if bb:find("^"..aa.."$") then
return true
end
end
v.act = function(s)
if input._txt and not s._edit then return true end -- somewhere else
s._edit = not s._edit;
if s._edit then
input._txt = s._txt;
else
s._txt = input._txt
input._txt = false
end
return true
end
return obj(v)
end