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
|
#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 "../../callbackhandeler.hpp"
using namespace irr;
using namespace gui;
//IrrlichtDevice* guidevice;
static LIGUIElement* checkiguilabel(lua_State* L, int index){
void* ud = luaL_checkudata(L,index,"gui.iguilabel");
luaL_argcheck(L,ud != NULL, index, "'gui.iguilabel' expected");
return (LIGUIElement*) ud;
}
static LIGUIElement* checkiguilabel(lua_State* L){
return checkiguilabel(L,1);
}
static void iguilabelevent(irr::SEvent e){
printf("Oh no! an iguilabel generated an event!");
}
static int newiguilabel(lua_State* L){
printf("Createing label!\n");
int nargs = lua_gettop(L);
//The position of the text
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 and tooltip
wchar_t* label;
const char* labelopt = luaL_optstring(L,5,"Label");
int bls = strlen(labelopt);
label = (wchar_t*)malloc(sizeof(wchar_t)*(bls));
mbstowcs(label,labelopt,bls);
printf("Got the string option\n");
//If the element has a parrent
int parent = 0;
if(nargs >= 6){
parent = luaL_optint(L,6,0);
printf("got the parrent\n");
}
//Create the button
IGUIEnvironment* env = guidevice->getGUIEnvironment();
//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(llabel,EGET_ELEMENT_HOVERED,iguilabelevent);
//Create it's lua representation
LIGUIElement* ltext = (LIGUIElement*)lua_newuserdata(L, sizeof(LIGUIElement));
int tref = luaL_ref(L,LUA_REGISTRYINDEX);
iguielements[llabel] = 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.iguilabel");
lua_setmetatable(L, -2);
//Create the struct
ltext->e = llabel;
ltext->funcmap = hashmap_new();
ltext->type = "iguilabel";
//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 iguilabel_f[] = {
{"new", newiguilabel},
{"gethandeler", guigethandeler},
{"sethandeler", guisethandeler},
{0,0},
};
static const luaL_reg iguilabel_m[] = {
{"move", moveiguielement},
{"settext", setiguitext},
{"remove", removeiguielement},
{0, 0},
};
int iguilabel_register(lua_State* L, IrrlichtDevice* d){
luaL_newmetatable(L, "gui.iguilabel");
luaL_register(L,"iguilabel",iguilabel_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, iguilabel_m);
return 1;
}
|