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
|
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <memory>
#include <map>
#include <string>
#include <functional>
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
#include <irrlicht.h>
#include "../guiparts.hpp"
#include "iguielement.hpp"
#include "client/callbackhandeler.hpp"
#include <shared/util/hashmap.hpp>
#include <shared/lua_api/common.hpp>
using namespace irr;
using namespace core;
using namespace gui;
extern IrrlichtDevice* device;
char lhashkey[20];
static LIGUIElement* checkiguibutton(lua_State* L, int index){
void* ud = luaL_checkudata(L,index,"gui.iguibutton");
luaL_argcheck(L,ud != NULL, index, "'gui.iguibutton' expected");
return (LIGUIElement*) ud;
}
static LIGUIElement* checkiguibutton(lua_State* L){
return checkiguibutton(L,1);
}
//The callback even for all gui buttons
static bool iguibuttonevent(irr::SEvent e){
IGUIElement* caller = (IGUIElement*)e.GUIEvent.Caller;
printf("Some gui something somewhere was pressed\n");
if(iguielements.find(caller) != iguielements.end()){
printf("I know what reference is linked to that button: %d!\n",iguielements[caller]);
int ref = iguielements[caller];
EGUI_EVENT_TYPE etype = e.GUIEvent.EventType;
if(etype == EGET_BUTTON_CLICKED){
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 = checkiguibutton(tL,-1);
int hashmapresponse;
char* hashkey = (char*)"onpress";
int terror = hashmap_get(tbut->funcmap,hashkey,(void**)&hashmapresponse);
if(terror == MAP_OK){
lua_rawgeti(tL,LUA_REGISTRYINDEX,hashmapresponse);
lua_call(tL,0,0);
}else{
printf("Tried to call onpress on something that dosen't have onpress\n");
}
}else if(etype == EGET_ELEMENT_HOVERED){
printf("Trying to call onhovered!\n");
lua_rawgeti(tL,LUA_REGISTRYINDEX,ref);
LIGUIElement* tbut = (LIGUIElement*)lua_touserdata(tL,-1);
int hashmapresponse;
int terror = hashmap_get(tbut->funcmap,(char*)"onhovered",(void**)&hashmapresponse);
if(terror == MAP_OK){
lua_rawgeti(tL,LUA_REGISTRYINDEX,hashmapresponse);
lua_call(tL,0,0);
}
}
}
return false;
}
//gui.newbutton({x,y},{width,height},text[,parent])
static int newiguibutton(lua_State* L){
printf("Createing gui button!\n");
int nargs = lua_gettop(L);
IGUIElement* parent = NULL;
if(nargs == 4){
parent = (IGUIElement*)lua_touserdata(L,-1);
lua_pop(L,1);
}
const char* label_c = lua_tostring(L,-1);
const wchar_t* label_w = irr::core::stringw(label_c).c_str();
lua_pop(L,1);
long x,y,w,h;
popvector2i(L,&w,&h);
popvector2i(L,&x,&y);
rect<s32> dim = rect<s32>(x,y,x+w,y+h);
IGUIEnvironment* env = device->getGUIEnvironment();
IGUIButton* but = env->addButton(dim,parent,-2,label_w,L"");
lua_pushlightuserdata(L,but);//
luaL_getmetatable(L,"gui.iguibutton");
lua_setmetatable(L,-2);
registerguicallback(but,EGET_BUTTON_CLICKED,iguibuttonevent);
printf("Finished registering callback\n");
return 1;
}
static const luaL_reg iguibutton_f[] = {
{"new", newiguibutton},
{"gethandeler", guigethandeler},
{"sethandeler", guisethandeler},
{0,0},
};
static const luaL_reg iguibutton_m[] = {
{"move", moveiguielement},
{"settext", setiguitext},
{"remove", removeiguielement},
{0,0},
};
int iguibutton_register(lua_State* L){
tL = L;
luaL_newmetatable(L, "gui.iguibutton");//{m_iguibutton}
lua_newtable(L);//{m_iguibutton},{}
luaL_register(L,NULL,iguibutton_m);//{m_iguibutton},{}
lua_setfield(L,-2,"__index");//{m_iguibutton}
lua_pop(L,1);
lua_getglobal(L,"gui");
lua_pushcfunction(L,newiguibutton);
lua_setfield(L,-2,"newbutton");
lua_pop(L,1);
}
|