/*This file defines some things that all igui stuff can do*/ extern "C" { #include #include #include } #include "../../../shared/lua_api/common.h" #include #include "../guiparts.hpp" using namespace irr; using namespace core; using namespace gui; static LIGUIElement* toiguielement(lua_State* L,int index){ LIGUIElement* ret = (LIGUIElement*)lua_touserdata(L,index); if(ret == NULL) luaL_typerror(L,index,"LIGUIButton"); return ret; } static LIGUIElement* toiguielement(lua_State* L){ return toiguielement(L,1); } //move({element},{x,y}) -> nil int moveiguielement(lua_State* L){ printf("Got call to move element\n"); long x,y; popvector2i(L,&x,&y); //{element} printf("I want to move to %d %d\n",x,y); lua_getfield(L,-1,"guielement");//{element},*element IGUIElement *el = (IGUIElement*)lua_touserdata(L,-1); printf("Found element to move: %p\n",el); lua_pop(L,2);// el->move(position2d(x,y)); el->updateAbsolutePosition(); return 0; } //getabsrect({element})-> {{sx,sy},{ex,ey}} int getiguiclippingrect(lua_State* L){ printf("Getting iguiclipping elemnt\n"); lua_getfield(L,-1,"guielement"); IGUIElement *el = (IGUIElement*)lua_touserdata(L,-1); core::rect rect = el->getAbsoluteClippingRect(); position2d ul = rect.UpperLeftCorner; position2d lr = rect.LowerRightCorner; lua_newtable(L); lua_pushnumber(L,1); double sx,sy,ex,ey; pushvector2i(L,ul.X,ul.Y); lua_settable(L,-3); lua_pushnumber(L,2); pushvector2i(L,lr.X,lr.Y); lua_settable(L,-3); return 1; } /* int moveiguielement(lua_State* L){ LIGUIElement* ele = toiguielement(L,1); int x = luaL_optint(L,2,0); int y = luaL_optint(L,3,0); ele->e->move(position2d(x,y)); return 0; } */ int setiguitext(lua_State* L){ LIGUIElement* ele = toiguielement(L,1); const char* str = luaL_optstring(L,2,""); int size = strlen(str); wchar_t* al = (wchar_t*)malloc(sizeof(wchar_t)*size); mbstowcs(al,str,size); ele->e->setText(al); free(al); return 0; } //remove({self}) int removeiguielement(lua_State* L){ lua_getfield(L,-1,"guielement"); IGUIElement *ele = (IGUIElement*)lua_touserdata(L,-1); ele->remove(); lua_pop(L,2); return 0; } int guigethandeler(lua_State* L){ printf("Called the get index handeler!\n"); LIGUIElement* button = toiguielement(L); if(!lua_isstring(L,2)){ luaL_error(L,"index of iguibutton must be of type 'string'"); } const char* lstr = lua_tostring(L,2); char* hashkey = (char*)malloc(sizeof(char)*strlen(lstr)); strcpy(hashkey,lstr); int ref; if(hashmap_get(button->funcmap,hashkey,(void**)&ref) == MAP_OK){ //We found the value in our hashmap! lua_rawgeti(L,LUA_REGISTRYINDEX,ref); return 1; }else{ //Could not find in hashmap, check parrent lua_getglobal(L,button->type); printf("Button's type is %s\n",button->type); lua_getfield(L,-1,lstr); return 1; } } int guisethandeler(lua_State* L){ printf("Called the set index handeler\n"); LIGUIElement* button = toiguielement(L); if(!lua_isstring(L,2)){ luaL_error(L,"index of iguibutton must be of type 'string'"); } const char* lstr = lua_tostring(L,2); char* hashkey = (char*)malloc(sizeof(char)*strlen(lstr)); strcpy(hashkey,lstr); int oldref; if(hashmap_get(button->funcmap,hashkey,(void**)&oldref) == MAP_OK){ luaL_unref(L,LUA_REGISTRYINDEX,oldref); hashmap_remove(button->funcmap,hashkey); } int ref = luaL_ref(L,LUA_REGISTRYINDEX); if(hashmap_put(button->funcmap,hashkey,(void*)ref) != MAP_OK){ luaL_error(L,"Error while setting the hashkey on iguibutton"); } return 0; } //ud_iguielement int guigetid(lua_State* L){ IGUIElement* el = (IGUIElement*)lua_touserdata(L,-1); lua_pop(L,1); int id = el->getID(); lua_pushnumber(L,id); return 1; }