From 76b4fddee6106b60dbc6da6d7bcef61b42a3c310 Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Sat, 29 Jul 2017 13:53:52 -0400 Subject: Added gui window Bound irrlicht's IGUIWindow to lua --- src/client/lua_api/gui/iguiwindow.cpp | 167 ++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 src/client/lua_api/gui/iguiwindow.cpp (limited to 'src/client/lua_api/gui/iguiwindow.cpp') diff --git a/src/client/lua_api/gui/iguiwindow.cpp b/src/client/lua_api/gui/iguiwindow.cpp new file mode 100644 index 0000000..34b6cfa --- /dev/null +++ b/src/client/lua_api/gui/iguiwindow.cpp @@ -0,0 +1,167 @@ +#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; +} -- cgit v1.2.3-70-g09d2