tag seguimiento page marcar manager interacción google eventos con activador c++ lua luabind

c++ - seguimiento - Manejar devoluciones de llamada de evento con Luabind



tag manager (1)

Puedes usar luabind :: object para hacer eso.

Una clase de ejemplo: clase MyClass {public: void OnMouseMoved (int x, int y); void SetEventFunction (const luabind :: object & fn);

private: luabind::object m_eventFunction; }; void MyClass::SetEventFunction(const luabind::object &fn) { if(luabind::type(fn) == LUA_TFUNCTION) { cout << "A function" << endl; m_eventFunction = fn; } else { cout << "Not a function" << endl; } } void MyClass::OnMouseMoved(int x, int y) { if(m_eventFunction.is_valid()) { luabind::call_function<void>(m_eventFunction, x, y); } }

En código lua, sería:

myClass = MyClass ()

myClass:SetEventFunction( function (x, y) print ("The new mouse position is", x, y) end)

Para tener más de una función en un evento, puede usar std::vector de luabind::object

Estoy agregando scripts con Lua a una aplicación nuestra, y necesito implementar enlaces para el GUI-toolkit. El kit de herramientas que utilizamos es wxWidgets.

Estoy usando Lua 5.1 y luabind 0.9.1, y hasta ahora ha funcionado muy bien. Sin embargo, no estoy seguro de cómo manejar mejor los eventos. Por ejemplo, si desea crear un botón e imprimir una cadena cuando se hace clic, escribe algo como esto en C ++

class MyClass : public wxFrame { MyClass (...) { b = new wxButton (this, -1, "Click me"); b->Bind (wxEVT_COMMAND_BUTTON_CLICKED, &MyClass::HandleButtonClick, this); } void HandleButtonClick (wxCommandEvent& ev) { wxMessageBox ("You clicked me"); } }

La API de mis sueños para hacer lo mismo en Lua se vería así:

b = wx.Button (frm, -1, "Click me") b.on_click = function (ev) print ("Button clicked") end

O, permitiendo múltiples manejadores de eventos:

b.on_click:add (function (ev) print ("Button clicked again ...") end)

Si no es posible, algo como esto que se parece más a la API de C ++:

b.bind (wx.EVT_COMMAND_BUTTON_CLICKED, function (ev) print ("Yet again") end)

Sin embargo, no estoy seguro de cómo implementar esto utilizando Luabind sin escribir una clase contenedora para cada clase en la biblioteca wxWidgets que quiero usar.

¿Alguna sugerencia?

¿Quizás Luabind podría crear clases de ayuda de forma automática (por ejemplo, "wxLuaEventPropagator") de alguna manera? Para que la clase wxButton tenga una clase wxLuaEventPropagator anidada para cada evento ("on_click", y así sucesivamente). Una vez más, no quiero crear clases de envoltorio para cada clase en wxWidgets que uso, ya que hay una tonelada.

(Sí, soy consciente de wxLua)