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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
#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({posx,posy},{width,height}[,"title"][,parent])
static int newiguiwindow(lua_State* L){
printf("Creating window\n");
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_f[] = {
{"new", newiguiwindow},
{0,0},
};
static const luaL_reg iguiwindow_m[] = {
{"move", moveiguielement},
{"settext", setiguitext},
{"remove", removeiguielement},
{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_pushstring(L,"newwindow");
lua_pushcfunction(L,newiguiwindow);
lua_settable(L,-3);
lua_pop(L,1);
return 0;
//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;
}
|