straightforward signal and slots system for lua events
This commit is contained in:
parent
f41fd0576c
commit
f05c048f6d
|
@ -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')
|
||||
|
|
|
@ -10,4 +10,17 @@ function createEnvironment()
|
|||
local env = { }
|
||||
setmetatable(env, { __index = _G} )
|
||||
return env
|
||||
end
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
pop();
|
||||
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)) {
|
||||
|
|
|
@ -62,13 +62,15 @@ void Game::processConnectionError(const boost::system::error_code& error)
|
|||
{
|
||||
// connection errors only have meaning if we still have a protocol
|
||||
if(m_protocolGame) {
|
||||
g_lua.callGlobalField("Game", "onConnectionError", error.message());
|
||||
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
|
||||
m_protocolGame.reset();
|
||||
} else {
|
||||
m_protocolGame->disconnect();
|
||||
m_protocolGame.reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue