#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" 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; } static int newiguiwindow(lua_State* L){ printf("Createing label!\n"); int nargs = lua_gettop(L); //The position of the text //Frame position int x,y; lua_popvector2i(L,1,&x,&y); printf("got xy\n"); //Frame size int w,h; lua_popvector2i(L,2,&w,&h); printf("I want to make a frame at (%d,%d) size (%d,%d)\n",x,y,w,h); // int startx = luaL_optint(L,1,0); // int starty = luaL_optint(L,2,0); // int endx = luaL_optint(L,3,startx+100); // int endy = luaL_optint(L,4,starty+100); //Label wchar_t* label; const char* labelopt = luaL_optstring(L,3,"Label"); int bls = strlen(labelopt); label = (wchar_t*)calloc(sizeof(wchar_t),(bls)); mbstowcs(label,labelopt,bls); printf("Got the string option\n"); // //If the element has a parrent int parent = luaL_optint(L,4,0); // // // //Create the button IGUIEnvironment* env = guidevice->getGUIEnvironment(); IGUIWindow* wi = env->addWindow( core::rect(x,y,x+w,y+h), false, label, guielements[parent], -1 ); // /Create the label // IGUIStaticText* llabel = (IGUIStaticText*) env->addStaticText(label,core::rect(startx,starty,endx,endy),false,false, guielements[parent], gui_elenum++, false); // printf("Created the button\n"); // // /Register it's callback registerguicallback(wi,EGET_ELEMENT_CLOSED,iguiwindowevent); // //Create it's lua representation LIGUIElement* lwindow = (LIGUIElement*)lua_newuserdata(L, sizeof(LIGUIElement)); int tref = luaL_ref(L,LUA_REGISTRYINDEX); iguielements[wi] = tref; lua_rawgeti(L,LUA_REGISTRYINDEX,tref);//Put it back on the stack since luaL_ref pops the object. // //Set it's metatable luaL_getmetatable(L, "gui.iguiwindow"); lua_setmetatable(L, -2); // //Create the struct lwindow->e = wi; lwindow->funcmap = hashmap_new(); lwindow->type = "iguiwindow"; // // /Free up anything made in this function free(label); // // /Put it on top and return it lua_rawgeti(L,LUA_REGISTRYINDEX,tref); return 1; } static const luaL_reg iguiwindow_f[] = { {"new", newiguiwindow}, {"gethandeler", guigethandeler}, {"sethandeler", guisethandeler}, {0,0}, }; static const luaL_reg iguiwindow_m[] = { {"move", moveiguielement}, {"settext", setiguitext}, {"remove", removeiguielement}, {0, 0}, }; int iguiwindow_register(lua_State* L, IrrlichtDevice* d){ 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; }