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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
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;
}
|