#include #include #include #include #include #include #include extern "C" { #include #include #include } #include #include "../guiparts.hpp" #include "iguielement.hpp" #include "client/callbackhandeler.hpp" #include #include using namespace irr; using namespace core; using namespace gui; extern IrrlichtDevice* device; char lhashkey[20]; //static LIGUIElement* checkiguibutton(lua_State* L, int index){ //void* ud = luaL_checkudata(L,index,"gui.iguibutton"); //luaL_argcheck(L,ud != NULL, index, "'gui.iguibutton' expected"); //return (LIGUIElement*) ud; //} //static LIGUIElement* checkiguibutton(lua_State* L){ //return checkiguibutton(L,1); //} //The callback even for all gui buttons //static bool iguibuttonevent(irr::SEvent e){ //IGUIElement* caller = (IGUIElement*)e.GUIEvent.Caller; //printf("Some gui something somewhere was pressed\n"); //if(iguielements.find(caller) != iguielements.end()){ //printf("I know what reference is linked to that button: %d!\n",iguielements[caller]); //int ref = iguielements[caller]; //EGUI_EVENT_TYPE etype = e.GUIEvent.EventType; //if(etype == EGET_BUTTON_CLICKED){ //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 = checkiguibutton(tL,-1); //int hashmapresponse; //char* hashkey = (char*)"onpress"; //int terror = hashmap_get(tbut->funcmap,hashkey,(void**)&hashmapresponse); //if(terror == MAP_OK){ //lua_rawgeti(tL,LUA_REGISTRYINDEX,hashmapresponse); //lua_call(tL,0,0); //}else{ //printf("Tried to call onpress on something that dosen't have onpress\n"); //} //}else if(etype == EGET_ELEMENT_HOVERED){ //printf("Trying to call onhovered!\n"); //lua_rawgeti(tL,LUA_REGISTRYINDEX,ref); //LIGUIElement* tbut = (LIGUIElement*)lua_touserdata(tL,-1); //int hashmapresponse; //int terror = hashmap_get(tbut->funcmap,(char*)"onhovered",(void**)&hashmapresponse); //if(terror == MAP_OK){ //lua_rawgeti(tL,LUA_REGISTRYINDEX,hashmapresponse); //lua_call(tL,0,0); //} //} //} //return false; //} //gui.newbutton({{sx,sy},{ex,ey}},"text"[,parent]) static int newiguibutton(lua_State* L){ printf("Createing gui button!\n"); int nargs = lua_gettop(L); IGUIElement* parent = NULL; if(nargs == 4){ parent = (IGUIElement*)lua_touserdata(L,-1); lua_pop(L,1); } const char* label_c = lua_tostring(L,-1); const wchar_t* label_w = irr::core::stringw(label_c).c_str(); lua_pop(L,1); long sx,sy,ex,ey; poprecti(L,&sx,&sy,&ex,&ey); rect dim = rect(sx,sy,ex,ey); IGUIEnvironment* env = device->getGUIEnvironment(); IGUIButton* but = env->addButton(dim,parent,-2,label_w,L""); lua_newtable(L);//{} lua_pushlightuserdata(L,but);//{},ud_iguibutton lua_setfield(L,-2,"guielement");//{guielement} luaL_getmetatable(L,"gui.iguibutton");//{guielement},{m_iguibutton} lua_setmetatable(L,-2);//{guielement} setelementcallback(L,EGET_BUTTON_CLICKED,"onClicked");// printf("Finished registering callback\n"); return 1; } static const luaL_reg iguibutton_f[] = { {"new", newiguibutton}, {0,0}, }; static const luaL_reg iguibutton_m[] = { {"move", moveiguielement}, {"settext", setiguitext}, {"remove", removeiguielement}, {0,0}, }; void iguibutton_register(lua_State* L){ tL = L; luaL_newmetatable(L, "gui.iguibutton");//{m_iguibutton} lua_newtable(L);//{m_iguibutton},{} luaL_register(L,NULL,iguibutton_m);//{m_iguibutton},{} lua_setfield(L,-2,"__index");//{m_iguibutton} lua_pop(L,1); lua_getglobal(L,"gui"); lua_pushcfunction(L,newiguibutton); lua_setfield(L,-2,"newbutton"); lua_pop(L,1); }