aboutsummaryrefslogtreecommitdiff
path: root/src/client/lua_api/gui/iguilabel.cpp
blob: 3754ac663ffbc7fe2388894d329c0a8a70878af5 (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
#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;
}