aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/gui/iguicombobox.cpp
blob: a9c41371ed5d1052b1b01be8ce95badfb2f68f58 (plain)
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
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>
#include <client/lua_api/gui/iguicombobox.hpp>

using namespace irr;
using namespace core;
using namespace gui;

extern IrrlichtDevice* device;

/***
Creates a new combo box.
Buttons may have the following fields set for callbacks:
`.onChange(self)`
@function gui.newcombobox()
@tparam rect dimensions The rectangle to place the button at. If the box has a parent,
it is offset from the upper-left of the parent element.
@tparam? iguielement parent The parent element of the button.
@treturn iguicombobox The combo box element
*/
//gui.newcombobox({{sx,sy},{ex,ey}}[,parent])
static int newiguicombobox(lua_State* L){
	//printf("Createing gui button!\n");

	int nargs = lua_gettop(L);
	IGUIElement* parent = NULL;
	if(nargs == 2){
		lua_getfield(L,-1,"guielement");
		parent = (IGUIElement*)lua_touserdata(L,-1);
		lua_pop(L,2);//{{sx,sy},{ex,ey}}
	}

	long sx,sy,ex,ey;
	poprecti(L,&sx,&sy,&ex,&ey);//

	rect<s32> dim = rect<s32>(sx,sy,ex,ey);
	IGUIEnvironment* env = device->getGUIEnvironment();
	IGUIComboBox* but = env->addComboBox(dim,parent,-1);

	lua_newtable(L);//{}
	lua_pushlightuserdata(L,but);//{},ud_iguicombobox
	lua_setfield(L,-2,"guielement");//{guielement}
	luaL_getmetatable(L,"gui.iguicombobox");//{guielement},{m_iguicombobox}
	lua_setmetatable(L,-2);//{guielement}

	setelementcallback(L,EGET_COMBO_BOX_CHANGED,"onChange");//
	
	return 1;
}

/***
Add an item to the combo box
Adds an option to this combo box, with a given id for when it it selected
@function iguicombobox:additem(text,id)
@tparam string text The text to add to the combo box
@tparam number id The id to return from getselected() when this option is
selected
*/
//{combobox}.add(self,text,id)
int additem(lua_State *L){
	int id = lua_tonumber(L,-1);
	lua_pop(L,1);//self,text
	const char *name_c = lua_tostring(L,-1);
	size_t name_c_len = strlen(name_c);
	printf("adding item to combo box: %s\n",name_c);
	wchar_t name_w[name_c_len + 1];
	mbstowcs(name_w,name_c,name_c_len);
	name_w[name_c_len] = L'\0';
	lua_pop(L,1);//self
	lua_getfield(L,-1,"guielement");//self,ud_guielement
	IGUIComboBox *box = (IGUIComboBox*)lua_touserdata(L,-1);
	box->addItem(name_w,id);
	lua_pop(L,2);//
	return 0;
}

/***
Get the selected item.
Returns the number for the selected item, set with add()
@function iguicombobox:get()
@treturn number The item number that is currently selected
*/
// {combobox}.getselected(self)
int getselected(lua_State *L){
	lua_getfield(L,-1,"guielement");//self,ud_guielement
	IGUIComboBox *box = (IGUIComboBox*)lua_touserdata(L,-1);
	lua_pop(L,2);//
	s32 sel = box->getSelected();
	lua_pushnumber(L,sel);//num_selected
	return 1;
}

/***
Remove an item
Removes an item from the combo box at the given id. Id's are assigned with add()
@function iguicombobox:remove()
@tparam number id The id number of the item to remove
*/
//{combobox}.remove(self,id)
int removeitem(lua_State *L){
	int idx = lua_tonumber(L,-1);//self,id
	lua_pop(L,1);//self
	lua_getfield(L,-1,"guielement");//self,ud_guielement
	IGUIComboBox *box = (IGUIComboBox*)lua_touserdata(L,-1);
	lua_pop(L,2);//
	box->removeItem(idx);
	return 0;
}

static const luaL_reg iguicombobox_f[] = {
	{"new",             newiguicombobox},
	{0,0},
};

static const luaL_reg iguicombobox_m[] = {
	{"add",         additem},
	{"get",     getselected},
	{"remove",      removeitem},
	{0,0},
};

void iguicombobox_register(lua_State* L){
	tL = L;

	luaL_newmetatable(L, "gui.iguicombobox");//{m_iguibutton}
	lua_newtable(L);//{m_iguibutton},{}
	luaL_register(L,NULL,iguielement_m);
	luaL_register(L,NULL,iguicombobox_m);//{m_iguibutton},{}
	lua_setfield(L,-2,"__index");//{m_iguibutton}

	lua_pop(L,1);

	lua_getglobal(L,"gui");
	//luaL_register(L,NULL,iguicombobox_f)
	lua_pushcfunction(L,newiguicombobox);
	lua_setfield(L,-2,"newcombobox");

	lua_pop(L,1);
}