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