#include #include #include #include #include #include extern "C" { #include #include #include } #include #include "../guiparts.hpp" #include "iguielement.hpp" #include "iguiwindow.hpp" #include "iguiutil.hpp" #include "../../callbackhandeler.hpp" #include "../../../shared/lua_api/common.h" using namespace irr; using namespace gui; //IrrlichtDevice* guidevice; static LIGUIElement* checkiguiwindow(lua_State* L, int index){ void* ud = luaL_checkudata(L,index,"gui.iguiwindow"); luaL_argcheck(L,ud != NULL, index, "'gui.iguiwindow' expected"); return (LIGUIElement*) ud; } static LIGUIElement* checkiguiwindow(lua_State* L){ return checkiguiwindow(L,1); } static bool iguiwindowevent(irr::SEvent e){ IGUIElement* caller = (IGUIElement*)e.GUIEvent.Caller; int ref = iguielements[caller]; EGUI_EVENT_TYPE etype = e.GUIEvent.EventType; printf("Detected window event\n"); if(etype == EGET_ELEMENT_CLOSED){ lua_rawgeti(tL,LUA_REGISTRYINDEX,ref); printf("getting raw, the thing on the top of stack is a %s\n",luaL_typename(tL,-1)); LIGUIElement* tbut = checkiguiwindow(tL,-1); int hashmapresponse; char* hashkey = (char*)"onclose"; int terror = hashmap_get(tbut->funcmap,hashkey,(void**)&hashmapresponse); if(terror == MAP_OK){ //Only call if we actually have that function. printf("Looks like we have an onclose function, calling!\n"); lua_rawgeti(tL,LUA_REGISTRYINDEX,hashmapresponse); //push the function lua_rawgeti(tL,LUA_REGISTRYINDEX,ref); //push the referance to iguielement lua_call(tL,1,1); //int b = lua_isnoneornil(tL,1); int a = lua_toboolean(tL,-1); printf("a:%d\n",a); return a; } } printf("Oh no! an iguiwindow generated an event!"); return false; } //new({posx,posy},{width,height}[,"title"][,parent]) static int newiguiwindow(lua_State* L){ printf("Creating window\n"); int parentid = lua_tointeger(L,-1); lua_pop(L,1); const char* title_c = lua_tostring(L,-1); const wchar_t* title_w = irr::core::stringw(title_c).c_str(); lua_pop(L,1); //Frame position long x,y,w,h; popvector2i(L,&x,&y); popvector2i(L,&w,&h); printf("I want to make a frame at (%d,%d) size (%d,%d)\n",x,y,w,h); //Create the window IGUIEnvironment* env = guidevice->getGUIEnvironment(); IGUIWindow* wi = env->addWindow( core::rect(x,y,x+w,y+h), false, title_w, guielements[parentid], -1 ); lua_newtable(L);//{} lua_pushlightuserdata(L,wi); lua_setfield(L,-2,"element"); luaL_getmetatable(L,"gui.window"); lua_setmetatable(L,-2); registerguicallback(wi,EGET_ELEMENT_CLOSED,iguiwindowevent); return 1; } static const luaL_reg iguiwindow_f[] = { {"new", newiguiwindow}, {0,0}, }; static const luaL_reg iguiwindow_m[] = { {"move", moveiguielement}, {"settext", setiguitext}, {"remove", removeiguielement}, {0, 0}, }; int iguiwindow_register(lua_State* L, IrrlichtDevice* d){ printf("Loading window\n"); luaL_newmetatable(L,"gui.window");//m{gui.checkbox} luaL_register(L,NULL,iguiwindow_m); lua_pop(L,1);// lua_getglobal(L,"gui"); lua_pushstring(L,"newwindow"); lua_pushcfunction(L,newiguiwindow); lua_settable(L,-3); lua_pop(L,1); return 0; //luaL_newmetatable(L, "gui.iguiwindow"); //luaL_register(L,"iguiwindow",iguiwindow_f); //lua_pushstring(L,"__index"); //lua_pushstring(L,"gethandeler"); //lua_gettable(L,-3); //lua_settable(L,-4); //lua_pushstring(L,"__newindex"); //lua_pushstring(L,"sethandeler"); //lua_gettable(L,-3); //lua_settable(L,-4); //luaL_register(L, NULL, iguiwindow_m); //return 1; }