aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/gui/iguiwindow.cpp
blob: 9a42dff1028b1671c9789d4430aae9371e0508d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#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"
#include "../../../shared/lua_api/common.h"

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;
}

//new({width,height},{posx,posy},"title"[,parent])
static int newiguiwindow(lua_State* L){
	printf("Creating window\n");
	
	int numargs = lua_gettop(L);
	

	int parentid = lua_tointeger(L,-1);
	lua_pop(L,1);
  	const char* title_c = lua_tostring(L,-1);
	const wchar_t* title_w = irr::core::stringw(title_c).c_str();
	lua_pop(L,1);
	
	//Frame position
	long x,y,w,h;
	popvector2i(L,&x,&y);
	popvector2i(L,&w,&h);
	
	printf("I want to make a frame at (%d,%d) size (%d,%d)\n",x,y,w,h);
 
	//Create the window
	IGUIEnvironment* env = guidevice->getGUIEnvironment();
	IGUIWindow* wi = env->addWindow(
		core::rect<s32>(x,y,x+w,y+h),
		false,
		title_w,
		guielements[parentid],
		-1
	);

	lua_newtable(L);//{}
	lua_pushlightuserdata(L,wi);
	lua_setfield(L,-2,"element");

	luaL_getmetatable(L,"gui.window");
	lua_setmetatable(L,-2);
	
	registerguicallback(wi,EGET_ELEMENT_CLOSED,iguiwindowevent);
	return 1;
}

static const luaL_reg iguiwindow_m[] = {
	{"move",          moveiguielement},
	{"settext",       setiguitext},
	{"remove",        removeiguielement},
	{"getid",         guigetid},
	{0, 0},
};

int iguiwindow_register(lua_State* L, IrrlichtDevice* d){
	printf("Loading window\n");
	luaL_newmetatable(L,"gui.window");//m{gui.checkbox}
	luaL_register(L,NULL,iguiwindow_m);
	lua_pop(L,1);//
	
	lua_getglobal(L,"gui");
	lua_pushcfunction(L,newiguiwindow);
	lua_setfield(L,-2,"newwindow");
	lua_pop(L,1);

	return 0;
}