straightforward signal and slots system for lua events

This commit is contained in:
Eduardo Bart 2011-08-29 16:35:58 -03:00
parent f41fd0576c
commit f05c048f6d
5 changed files with 42 additions and 13 deletions

View File

@ -67,7 +67,7 @@ end
function Console.init()
consoleWidget = UI.loadAndDisplay("/console/console.otui")
consoleWidget:hide()
consoleWidget.onKeyPress = onKeyPress
connect(consoleWidget, { onKeyPress = onKeyPress })
commandLineEdit = consoleWidget:getChildById('commandLineEdit')
consoleBuffer = consoleWidget:getChildById('consoleBuffer')

View File

@ -11,3 +11,16 @@ function createEnvironment()
setmetatable(env, { __index = _G} )
return env
end
function connect(object, signalsAndSlots)
for signal,slot in pairs(signalsAndSlots) do
if not object[signal] then
object[signal] = slot
elseif type(object[signal]) == 'function' then
object[signal] = { object[signal], slot }
elseif type(signal) == 'table' then
table.insert(object[signal], slot)
else
end
end
end

View File

@ -7,6 +7,9 @@ local function onGameKeyPress(self, keyCode, keyChar, keyboardModifiers)
if keyCode == KeyG then
CharacterList.show()
return true
elseif keyCode == KeyQ then
Game.logout()
return true
end
end
return false

View File

@ -419,21 +419,32 @@ int LuaInterface::protectedCall(int numArgs, int requestedResults)
else if(isTable(funcIndex)) {
// loop through table values
pushNil();
bool done = false;
while(next(funcIndex-1)) {
if(isFunction()) {
// repush arguments
for(int i=0;i<numArgs;++i)
pushValue(-(numArgs-i)-2);
pushValue(-numArgs-2);
int rets = safeCall(numArgs);
pop(rets);
}
// just ignore
else {
if(rets == 1) {
done = popBoolean();
if(done) {
pop();
break;
}
} else if(rets != 0)
throw LuaException("function call didn't return the expected number of results", 0);
} else {
throw LuaException("attempt to call a non function", 0);
}
}
pop(numArgs + 1); // pops the table of function and arguments
if(requestedResults == -1 || requestedResults == 1) {
numRets = 1;
pushBoolean(done);
}
}
// nil values are ignored
else if(isNil(funcIndex)) {

View File

@ -62,14 +62,16 @@ void Game::processConnectionError(const boost::system::error_code& error)
{
// connection errors only have meaning if we still have a protocol
if(m_protocolGame) {
if(error != asio::error::eof)
g_lua.callGlobalField("Game", "onConnectionError", error.message());
if(m_online)
if(m_online) {
processLogout();
// disconnect isn't needed, we are already disconnected
} else {
m_protocolGame->disconnect();
m_protocolGame.reset();
}
}
}
void Game::processLogin(const LocalPlayerPtr& localPlayer)