aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/gui/iguiwindow.cpp
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2017-07-29 13:53:52 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2017-07-29 13:53:52 -0400
commit76b4fddee6106b60dbc6da6d7bcef61b42a3c310 (patch)
tree7c98499a8d32d6415a6cfb5f318943c744778172 /src/client/lua_api/gui/iguiwindow.cpp
parentfa49161fe2d7e0a025c9fd8559815d56dfd1f427 (diff)
downloadbrokengine-76b4fddee6106b60dbc6da6d7bcef61b42a3c310.tar.gz
brokengine-76b4fddee6106b60dbc6da6d7bcef61b42a3c310.tar.bz2
brokengine-76b4fddee6106b60dbc6da6d7bcef61b42a3c310.zip
Added gui window
Bound irrlicht's IGUIWindow to lua
Diffstat (limited to 'src/client/lua_api/gui/iguiwindow.cpp')
-rw-r--r--src/client/lua_api/gui/iguiwindow.cpp167
1 files changed, 167 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h>
+#include <vector>
+#include <memory>
+#include <map>
+#include <functional>
+extern "C" {
+ #include <lua.h>
+ #include <lauxlib.h>
+ #include <lualib.h>
+}
+#include <irrlicht.h>
+#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<s32>(x,y,x+w,y+h),
+ false,
+ label,
+ guielements[parent],
+ -1
+ );
+ // /Create the label
+ // IGUIStaticText* llabel = (IGUIStaticText*) env->addStaticText(label,core::rect<s32>(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;
+}