#include #include #include #include #include #include #include extern "C" { #include #include #include } #include #include "../guiparts.hpp" #include "iguielement.hpp" #include "../../callbackhandeler.hpp" #include "../../util/hashmap.h" #include "../../../shared/lua_api/common.h" 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({x,y},{width,height},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 x,y,w,h; popvector2i(L,&w,&h); popvector2i(L,&x,&y); rect dim = rect(x,y,x+w,y+h); IGUIEnvironment* env = device->getGUIEnvironment(); IGUIButton* but = env->addButton(dim,parent,-2,label_w,L""); lua_pushlightuserdata(L,but);// luaL_getmetatable(L,"gui.iguibutton"); lua_setmetatable(L,-2); registerguicallback(but,EGET_BUTTON_CLICKED,iguibuttonevent); printf("Finished registering callback\n"); return 1; } static const luaL_reg iguibutton_f[] = { {"new", newiguibutton}, {"gethandeler", guigethandeler}, {"sethandeler", guisethandeler}, {0,0}, }; static const luaL_reg iguibutton_m[] = { {"move", moveiguielement}, {"settext", setiguitext}, {"remove", removeiguielement}, {0,0}, }; int 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); }