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
|
/*This file defines some things that all igui stuff can do*/
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
#include <irrlicht.h>
#include "../guiparts.hpp"
using namespace irr;
using namespace core;
static LIGUIElement* toiguielement(lua_State* L,int index){
LIGUIElement* ret = (LIGUIElement*)lua_touserdata(L,index);
if(ret == NULL)
luaL_typerror(L,index,"LIGUIButton");
return ret;
}
static LIGUIElement* toiguielement(lua_State* L){
return toiguielement(L,1);
}
int moveiguielement(lua_State* L){
LIGUIElement* ele = toiguielement(L,1);
int x = luaL_optint(L,2,0);
int y = luaL_optint(L,3,0);
ele->e->move(position2d<s32>(x,y));
return 0;
}
int setiguitext(lua_State* L){
LIGUIElement* ele = toiguielement(L,1);
const char* str = luaL_optstring(L,2,"");
int size = strlen(str);
wchar_t* al = (wchar_t*)malloc(sizeof(wchar_t)*size);
mbstowcs(al,str,size);
ele->e->setText(al);
free(al);
return 0;
}
int removeiguielement(lua_State* L){
LIGUIElement* ele = toiguielement(L,1);
ele->e->remove();
hashmap_free(ele->funcmap);
free(ele);
return 0;
}
int guigethandeler(lua_State* L){
printf("Called the get index handeler!\n");
LIGUIElement* button = toiguielement(L);
if(!lua_isstring(L,2)){
luaL_error(L,"index of iguibutton must be of type 'string'");
}
const char* lstr = lua_tostring(L,2);
char* hashkey = (char*)malloc(sizeof(char)*strlen(lstr));
strcpy(hashkey,lstr);
int ref;
if(hashmap_get(button->funcmap,hashkey,(void**)&ref) == MAP_OK){
//We found the value in our hashmap!
lua_rawgeti(L,LUA_REGISTRYINDEX,ref);
return 1;
}else{
//Could not find in hashmap, check parrent
lua_getglobal(L,button->type);
printf("Button's type is %s\n",button->type);
lua_getfield(L,-1,lstr);
return 1;
}
}
int guisethandeler(lua_State* L){
printf("Called the set index handeler\n");
LIGUIElement* button = toiguielement(L);
if(!lua_isstring(L,2)){
luaL_error(L,"index of iguibutton must be of type 'string'");
}
const char* lstr = lua_tostring(L,2);
char* hashkey = (char*)malloc(sizeof(char)*strlen(lstr));
strcpy(hashkey,lstr);
int oldref;
if(hashmap_get(button->funcmap,hashkey,(void**)&oldref) == MAP_OK){
luaL_unref(L,LUA_REGISTRYINDEX,oldref);
hashmap_remove(button->funcmap,hashkey);
}
int ref = luaL_ref(L,LUA_REGISTRYINDEX);
if(hashmap_put(button->funcmap,hashkey,(void*)ref) != MAP_OK){
luaL_error(L,"Error while setting the hashkey on iguibutton");
}
return 0;
}
|