/*This file defines some things that all igui stuff can do*/ extern "C" { #include #include #include } #include #include #include "../guiparts.hpp" #include 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);//{element},ud_element lua_pop(L,2); core::rect rect = el->getAbsoluteClippingRect(); pushrecti( L, rect.UpperLeftCorner.X, rect.UpperLeftCorner.Y, rect.LowerRightCorner.X, rect.LowerRightCorner.Y ); 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; } */ //setText({guielement},"text") :: nil int setiguitext(lua_State* L){ const char* text = lua_tostring(L, -1); lua_pop(L,1);//{guielement} lua_getfield(L,-1,"guielement");//{guielement},ud_iguielement IGUIElement* el = (IGUIElement*)lua_touserdata(L,-1);//{guielement},ud_iguielement lua_pop(L,2); int textlen = strlen(text); wchar_t* wtext = (wchar_t*)malloc(sizeof(wchar_t)*textlen); mbstowcs(wtext,text,textlen); el->setText(wtext); free(wtext); 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; } class guicallback{ private: int luaitem; const char* funcname; lua_State* L; public: guicallback(lua_State* L, int lf, const char* fn){ this->luaitem = lf; this->L = L; this->funcname = fn; } bool operator () (SEvent e) { lua_rawgeti(L,LUA_REGISTRYINDEX,this->luaitem);//{guielement} lua_getfield(L,-1,this->funcname);//{guielement},func() if(!lua_isnil(L,-1)){ lua_rawgeti(L,LUA_REGISTRYINDEX,this->luaitem);//{guielement},func(),{guielement} lua_call(L,1,0);//{iguielement} lua_pop(L,1);//{} return true; }else{ lua_pop(L,2);//{} return false; } } }; //{guielement} //popelementcallback(lua_State* L, gui::EGUI_EVENT_TYPE, char*) void setelementcallback(lua_State* L,gui::EGUI_EVENT_TYPE et, const char* funcname){ //lua_getfield(L,-1,"guielement");//{guielement} //IGUIElement* el = (IGUIElement*)lua_touserdata(L,-1);//{guielement},ud_element //lua_pop(L,1);//{guielement} registerguielement(L); //int ref = luaL_ref(L,LUA_REGISTRYINDEX);// //guicallback* gc = new guicallback(L,ref,funcname);//TODO:Clean this up somehow //popregisterguicallback(el,et, gc); //lua_rawgeti(L,LUA_REGISTRYINDEX,ref);//{guielement} } //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; }