Element.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. /*
  2. * This source file is part of RmlUi, the HTML/CSS Interface Middleware
  3. *
  4. * For the latest information, see http://github.com/mikke89/RmlUi
  5. *
  6. * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
  7. * Copyright (c) 2019 The RmlUi Team, and contributors
  8. *
  9. * Permission is hereby granted, free of charge, to any person obtaining a copy
  10. * of this software and associated documentation files (the "Software"), to deal
  11. * in the Software without restriction, including without limitation the rights
  12. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13. * copies of the Software, and to permit persons to whom the Software is
  14. * furnished to do so, subject to the following conditions:
  15. *
  16. * The above copyright notice and this permission notice shall be included in
  17. * all copies or substantial portions of the Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  25. * THE SOFTWARE.
  26. *
  27. */
  28. #include "Element.h"
  29. #include "ElementStyleProxy.h"
  30. #include "LuaEventListener.h"
  31. #include "ElementAttributesProxy.h"
  32. #include "ElementChildNodesProxy.h"
  33. #include <RmlUi/Lua/Utilities.h>
  34. namespace Rml {
  35. namespace Lua {
  36. typedef ElementDocument Document;
  37. template<> void ExtraInit<Element>(lua_State* L, int metatable_index)
  38. {
  39. int top = lua_gettop(L);
  40. //guarantee the "Element.As" table exists
  41. lua_getfield(L,metatable_index-1,"As");
  42. if(lua_isnoneornil(L,-1)) //if it doesn't exist, create it
  43. {
  44. lua_newtable(L);
  45. lua_setfield(L,metatable_index-1,"As");
  46. }
  47. lua_pop(L,1); //pop the result of lua_getfield
  48. lua_pushcfunction(L,Elementnew);
  49. lua_setfield(L,metatable_index-1,"new");
  50. lua_settop(L,top);
  51. }
  52. int Elementnew(lua_State* L)
  53. {
  54. const char* tag = luaL_checkstring(L,1);
  55. Element* ele = new Element(tag);
  56. LuaType<Element>::push(L,ele,true);
  57. return 1;
  58. }
  59. //methods
  60. int ElementAddEventListener(lua_State* L, Element* obj)
  61. {
  62. int top = lua_gettop(L);
  63. bool capture = false;
  64. //default false if they didn't pass it in
  65. if (top > 2)
  66. capture = RMLUI_CHECK_BOOL(L,3);
  67. const char* event = luaL_checkstring(L,1);
  68. LuaEventListener* listener = nullptr;
  69. int type = lua_type(L,2);
  70. if(type == LUA_TFUNCTION)
  71. {
  72. listener = new LuaEventListener(L,2,obj);
  73. }
  74. else if(type == LUA_TSTRING)
  75. {
  76. const char* code = luaL_checkstring(L,2);
  77. listener = new LuaEventListener(code,obj);
  78. }
  79. else
  80. {
  81. Log::Message(Log::LT_WARNING, "Lua Context:AddEventLisener's 2nd argument can only be a Lua function or a string, you passed in a %s", lua_typename(L,type));
  82. }
  83. if(listener != nullptr)
  84. {
  85. obj->AddEventListener(event,listener,capture);
  86. }
  87. return 0;
  88. }
  89. int ElementAppendChild(lua_State* L, Element* obj)
  90. {
  91. ElementPtr* element = LuaType<ElementPtr>::check(L, 1);
  92. if (*element)
  93. obj->AppendChild(std::move(*element));
  94. else
  95. Log::Message(Log::LT_WARNING, "Could not append child to element '%s', as the child was null. Was it already moved from?", obj->GetAddress().c_str());
  96. return 0;
  97. }
  98. int ElementBlur(lua_State* /*L*/, Element* obj)
  99. {
  100. obj->Blur();
  101. return 0;
  102. }
  103. int ElementClick(lua_State* /*L*/, Element* obj)
  104. {
  105. obj->Click();
  106. return 0;
  107. }
  108. int ElementDispatchEvent(lua_State* L, Element* obj)
  109. {
  110. const char* event = luaL_checkstring(L,1);
  111. Dictionary params;
  112. lua_pushnil(L); //becauase lua_next pops a key from the stack first, we don't want to pop the table
  113. while(lua_next(L,2) != 0)
  114. {
  115. //[-1] is value, [-2] is key
  116. int type = lua_type(L,-1);
  117. const char* key = luaL_checkstring(L,-2); //key HAS to be a string, or things will go bad
  118. switch(type)
  119. {
  120. case LUA_TNUMBER:
  121. params[key] = (float)lua_tonumber(L,-1);
  122. break;
  123. case LUA_TBOOLEAN:
  124. params[key] = RMLUI_CHECK_BOOL(L,-1);
  125. break;
  126. case LUA_TSTRING:
  127. params[key] = luaL_checkstring(L,-1);
  128. break;
  129. case LUA_TUSERDATA:
  130. case LUA_TLIGHTUSERDATA:
  131. params[key] = lua_touserdata(L,-1);
  132. break;
  133. default:
  134. break;
  135. }
  136. lua_pop(L, 1); //pops value, leaves key for next iteration
  137. }
  138. obj->DispatchEvent(event, params);
  139. return 0;
  140. }
  141. int ElementFocus(lua_State* /*L*/, Element* obj)
  142. {
  143. obj->Focus();
  144. return 0;
  145. }
  146. int ElementGetAttribute(lua_State* L, Element* obj)
  147. {
  148. const char* name = luaL_checkstring(L,1);
  149. Variant* var = obj->GetAttribute(name);
  150. PushVariant(L,var);
  151. return 1;
  152. }
  153. int ElementGetElementById(lua_State* L, Element* obj)
  154. {
  155. const char* id = luaL_checkstring(L,1);
  156. Element* ele = obj->GetElementById(id);
  157. LuaType<Element>::push(L,ele,false);
  158. return 1;
  159. }
  160. int ElementGetElementsByTagName(lua_State* L, Element* obj)
  161. {
  162. const char* tag = luaL_checkstring(L,1);
  163. ElementList list;
  164. obj->GetElementsByTagName(list,tag);
  165. lua_newtable(L);
  166. for(unsigned int i = 0; i < list.size(); i++)
  167. {
  168. PushIndex(L,i);
  169. LuaType<Element>::push(L,list[i],false);
  170. lua_settable(L,-3); //-3 is the table
  171. }
  172. return 1;
  173. }
  174. int ElementQuerySelector(lua_State* L, Element* obj)
  175. {
  176. const char* sel = luaL_checkstring(L,1);
  177. Element* ele = obj->QuerySelector(sel);
  178. LuaType<Element>::push(L,ele,false);
  179. return 1;
  180. }
  181. int ElementQuerySelectorAll(lua_State* L, Element* obj)
  182. {
  183. const char* tag = luaL_checkstring(L,1);
  184. ElementList list;
  185. obj->QuerySelectorAll(list,tag);
  186. lua_newtable(L);
  187. for(unsigned int i = 0; i < list.size(); i++)
  188. {
  189. PushIndex(L,i);
  190. LuaType<Element>::push(L,list[i],false);
  191. lua_settable(L,-3); //-3 is the table
  192. }
  193. return 1;
  194. }
  195. int ElementHasAttribute(lua_State* L, Element* obj)
  196. {
  197. const char* name = luaL_checkstring(L,1);
  198. lua_pushboolean(L,obj->HasAttribute(name));
  199. return 1;
  200. }
  201. int ElementHasChildNodes(lua_State* L, Element* obj)
  202. {
  203. lua_pushboolean(L,obj->HasChildNodes());
  204. return 1;
  205. }
  206. int ElementInsertBefore(lua_State* L, Element* obj)
  207. {
  208. ElementPtr* element = LuaType<ElementPtr>::check(L,1);
  209. Element* adjacent = LuaType<Element>::check(L,2);
  210. if(*element)
  211. obj->InsertBefore(std::move(*element), adjacent);
  212. else
  213. Log::Message(Log::LT_WARNING, "Could not insert child to element '%s', as the child was null. Was it already moved from?", obj->GetAddress().c_str());
  214. return 0;
  215. }
  216. int ElementIsClassSet(lua_State* L, Element* obj)
  217. {
  218. const char* name = luaL_checkstring(L,1);
  219. lua_pushboolean(L,obj->IsClassSet(name));
  220. return 1;
  221. }
  222. int ElementRemoveAttribute(lua_State* L, Element* obj)
  223. {
  224. const char* name = luaL_checkstring(L,1);
  225. obj->RemoveAttribute(name);
  226. return 0;
  227. }
  228. int ElementRemoveChild(lua_State* L, Element* obj)
  229. {
  230. Element* element = LuaType<Element>::check(L,1);
  231. lua_pushboolean(L,static_cast<bool>(obj->RemoveChild(element)));
  232. return 1;
  233. }
  234. int ElementReplaceChild(lua_State* L, Element* obj)
  235. {
  236. ElementPtr* inserted = LuaType<ElementPtr>::check(L,1);
  237. Element* replaced = LuaType<Element>::check(L,2);
  238. if(*inserted)
  239. lua_pushboolean(L, static_cast<bool>(obj->ReplaceChild(std::move(*inserted),replaced)));
  240. else
  241. Log::Message(Log::LT_WARNING, "Could not replace child in element '%s', as the child was null. Was it already moved from?", obj->GetAddress().c_str());
  242. return 1;
  243. }
  244. int ElementScrollIntoView(lua_State* L, Element* obj)
  245. {
  246. bool align = RMLUI_CHECK_BOOL(L,1);
  247. obj->ScrollIntoView(align);
  248. return 0;
  249. }
  250. int ElementSetAttribute(lua_State* L, Element* obj)
  251. {
  252. const char* name = luaL_checkstring(L,1);
  253. const char* value = luaL_checkstring(L,2);
  254. obj->SetAttribute(name,String(value));
  255. return 0;
  256. }
  257. int ElementSetClass(lua_State* L, Element* obj)
  258. {
  259. const char* name = luaL_checkstring(L,1);
  260. bool value = RMLUI_CHECK_BOOL(L,2);
  261. obj->SetClass(name,value);
  262. return 0;
  263. }
  264. //getters
  265. int ElementGetAttrattributes(lua_State* L)
  266. {
  267. Element* ele = LuaType<Element>::check(L,1);
  268. RMLUI_CHECK_OBJ(ele);
  269. ElementAttributesProxy* proxy = new ElementAttributesProxy();
  270. proxy->owner = ele;
  271. LuaType<ElementAttributesProxy>::push(L,proxy,true);
  272. return 1;
  273. }
  274. int ElementGetAttrchild_nodes(lua_State* L)
  275. {
  276. Element* ele = LuaType<Element>::check(L,1);
  277. RMLUI_CHECK_OBJ(ele);
  278. ElementChildNodesProxy* ecnp = new ElementChildNodesProxy();
  279. ecnp->owner = ele;
  280. LuaType<ElementChildNodesProxy>::push(L,ecnp,true);
  281. return 1;
  282. }
  283. int ElementGetAttrclass_name(lua_State* L)
  284. {
  285. Element* ele = LuaType<Element>::check(L,1);
  286. RMLUI_CHECK_OBJ(ele);
  287. String classnames = ele->GetClassNames();
  288. lua_pushstring(L,classnames.c_str());
  289. return 1;
  290. }
  291. int ElementGetAttrclient_left(lua_State* L)
  292. {
  293. Element* ele = LuaType<Element>::check(L,1);
  294. RMLUI_CHECK_OBJ(ele);
  295. lua_pushnumber(L,ele->GetClientLeft());
  296. return 1;
  297. }
  298. int ElementGetAttrclient_height(lua_State* L)
  299. {
  300. Element* ele = LuaType<Element>::check(L,1);
  301. RMLUI_CHECK_OBJ(ele);
  302. lua_pushnumber(L,ele->GetClientHeight());
  303. return 1;
  304. }
  305. int ElementGetAttrclient_top(lua_State* L)
  306. {
  307. Element* ele = LuaType<Element>::check(L,1);
  308. RMLUI_CHECK_OBJ(ele);
  309. lua_pushnumber(L,ele->GetClientTop());
  310. return 1;
  311. }
  312. int ElementGetAttrclient_width(lua_State* L)
  313. {
  314. Element* ele = LuaType<Element>::check(L,1);
  315. RMLUI_CHECK_OBJ(ele);
  316. lua_pushnumber(L,ele->GetClientWidth());
  317. return 1;
  318. }
  319. int ElementGetAttrfirst_child(lua_State* L)
  320. {
  321. Element* ele = LuaType<Element>::check(L,1);
  322. RMLUI_CHECK_OBJ(ele);
  323. Element* child = ele->GetFirstChild();
  324. if(child == nullptr)
  325. lua_pushnil(L);
  326. else
  327. LuaType<Element>::push(L,child,false);
  328. return 1;
  329. }
  330. int ElementGetAttrid(lua_State* L)
  331. {
  332. Element* ele = LuaType<Element>::check(L,1);
  333. RMLUI_CHECK_OBJ(ele);
  334. lua_pushstring(L,ele->GetId().c_str());
  335. return 1;
  336. }
  337. int ElementGetAttrinner_rml(lua_State* L)
  338. {
  339. Element* ele = LuaType<Element>::check(L,1);
  340. RMLUI_CHECK_OBJ(ele);
  341. lua_pushstring(L,ele->GetInnerRML().c_str());
  342. return 1;
  343. }
  344. int ElementGetAttrlast_child(lua_State* L)
  345. {
  346. Element* ele = LuaType<Element>::check(L,1);
  347. RMLUI_CHECK_OBJ(ele);
  348. Element* child = ele->GetLastChild();
  349. if(child == nullptr)
  350. lua_pushnil(L);
  351. else
  352. LuaType<Element>::push(L,child,false);
  353. return 1;
  354. }
  355. int ElementGetAttrnext_sibling(lua_State* L)
  356. {
  357. Element* ele = LuaType<Element>::check(L,1);
  358. RMLUI_CHECK_OBJ(ele);
  359. Element* sibling = ele->GetNextSibling();
  360. if(sibling == nullptr)
  361. lua_pushnil(L);
  362. else
  363. LuaType<Element>::push(L,sibling,false);
  364. return 1;
  365. }
  366. int ElementGetAttroffset_height(lua_State* L)
  367. {
  368. Element* ele = LuaType<Element>::check(L,1);
  369. RMLUI_CHECK_OBJ(ele);
  370. lua_pushnumber(L,ele->GetOffsetHeight());
  371. return 1;
  372. }
  373. int ElementGetAttroffset_left(lua_State* L)
  374. {
  375. Element* ele = LuaType<Element>::check(L,1);
  376. RMLUI_CHECK_OBJ(ele);
  377. lua_pushnumber(L,ele->GetOffsetLeft());
  378. return 1;
  379. }
  380. int ElementGetAttroffset_parent(lua_State* L)
  381. {
  382. Element* ele = LuaType<Element>::check(L,1);
  383. RMLUI_CHECK_OBJ(ele);
  384. Element* parent = ele->GetOffsetParent();
  385. LuaType<Element>::push(L,parent,false);
  386. return 1;
  387. }
  388. int ElementGetAttroffset_top(lua_State* L)
  389. {
  390. Element* ele = LuaType<Element>::check(L,1);
  391. RMLUI_CHECK_OBJ(ele);
  392. lua_pushnumber(L, ele->GetOffsetTop());
  393. return 1;
  394. }
  395. int ElementGetAttroffset_width(lua_State* L)
  396. {
  397. Element* ele = LuaType<Element>::check(L,1);
  398. RMLUI_CHECK_OBJ(ele);
  399. lua_pushnumber(L,ele->GetOffsetWidth());
  400. return 1;
  401. }
  402. int ElementGetAttrowner_document(lua_State* L)
  403. {
  404. Element* ele = LuaType<Element>::check(L,1);
  405. RMLUI_CHECK_OBJ(ele);
  406. Document* doc = ele->GetOwnerDocument();
  407. LuaType<Document>::push(L,doc,false);
  408. return 1;
  409. }
  410. int ElementGetAttrparent_node(lua_State* L)
  411. {
  412. Element* ele = LuaType<Element>::check(L,1);
  413. RMLUI_CHECK_OBJ(ele);
  414. Element* parent = ele->GetParentNode();
  415. if(parent == nullptr)
  416. lua_pushnil(L);
  417. else
  418. LuaType<Element>::push(L,parent,false);
  419. return 1;
  420. }
  421. int ElementGetAttrprevious_sibling(lua_State* L)
  422. {
  423. Element* ele = LuaType<Element>::check(L,1);
  424. RMLUI_CHECK_OBJ(ele);
  425. Element* sibling = ele->GetPreviousSibling();
  426. if(sibling == nullptr)
  427. lua_pushnil(L);
  428. else
  429. LuaType<Element>::push(L,sibling,false);
  430. return 1;
  431. }
  432. int ElementGetAttrscroll_height(lua_State* L)
  433. {
  434. Element* ele = LuaType<Element>::check(L,1);
  435. RMLUI_CHECK_OBJ(ele);
  436. lua_pushnumber(L,ele->GetScrollHeight());
  437. return 1;
  438. }
  439. int ElementGetAttrscroll_left(lua_State* L)
  440. {
  441. Element* ele = LuaType<Element>::check(L,1);
  442. RMLUI_CHECK_OBJ(ele);
  443. lua_pushnumber(L,ele->GetScrollLeft());
  444. return 1;
  445. }
  446. int ElementGetAttrscroll_top(lua_State* L)
  447. {
  448. Element* ele = LuaType<Element>::check(L,1);
  449. RMLUI_CHECK_OBJ(ele);
  450. lua_pushnumber(L,ele->GetScrollTop());
  451. return 1;
  452. }
  453. int ElementGetAttrscroll_width(lua_State* L)
  454. {
  455. Element* ele = LuaType<Element>::check(L,1);
  456. RMLUI_CHECK_OBJ(ele);
  457. lua_pushnumber(L,ele->GetScrollWidth());
  458. return 1;
  459. }
  460. int ElementGetAttrstyle(lua_State* L)
  461. {
  462. Element* ele = LuaType<Element>::check(L,1);
  463. RMLUI_CHECK_OBJ(ele);
  464. ElementStyleProxy* prox = new ElementStyleProxy();
  465. prox->owner = ele;
  466. LuaType<ElementStyleProxy>::push(L,prox,true);
  467. return 1;
  468. }
  469. int ElementGetAttrtag_name(lua_State* L)
  470. {
  471. Element* ele = LuaType<Element>::check(L,1);
  472. RMLUI_CHECK_OBJ(ele);
  473. lua_pushstring(L,ele->GetTagName().c_str());
  474. return 1;
  475. }
  476. //setters
  477. int ElementSetAttrclass_name(lua_State* L)
  478. {
  479. Element* ele = LuaType<Element>::check(L,1);
  480. RMLUI_CHECK_OBJ(ele);
  481. const char* name = luaL_checkstring(L,2);
  482. ele->SetClassNames(name);
  483. return 0;
  484. }
  485. int ElementSetAttrid(lua_State* L)
  486. {
  487. Element* ele = LuaType<Element>::check(L,1);
  488. RMLUI_CHECK_OBJ(ele);
  489. const char* id = luaL_checkstring(L,2);
  490. ele->SetId(id);
  491. return 0;
  492. }
  493. int ElementSetAttrinner_rml(lua_State* L)
  494. {
  495. Element* ele = LuaType<Element>::check(L,1);
  496. RMLUI_CHECK_OBJ(ele);
  497. const char* rml = luaL_checkstring(L,2);
  498. ele->SetInnerRML(rml);
  499. return 0;
  500. }
  501. int ElementSetAttrscroll_left(lua_State* L)
  502. {
  503. Element* ele = LuaType<Element>::check(L,1);
  504. RMLUI_CHECK_OBJ(ele);
  505. float scroll = (float)luaL_checknumber(L,2);
  506. ele->SetScrollLeft(scroll);
  507. return 0;
  508. }
  509. int ElementSetAttrscroll_top(lua_State* L)
  510. {
  511. Element* ele = LuaType<Element>::check(L,1);
  512. RMLUI_CHECK_OBJ(ele);
  513. float scroll = (float)luaL_checknumber(L,2);
  514. ele->SetScrollTop(scroll);
  515. return 0;
  516. }
  517. RegType<Element> ElementMethods[] =
  518. {
  519. RMLUI_LUAMETHOD(Element,AddEventListener)
  520. RMLUI_LUAMETHOD(Element,AppendChild)
  521. RMLUI_LUAMETHOD(Element,Blur)
  522. RMLUI_LUAMETHOD(Element,Click)
  523. RMLUI_LUAMETHOD(Element,DispatchEvent)
  524. RMLUI_LUAMETHOD(Element,Focus)
  525. RMLUI_LUAMETHOD(Element,GetAttribute)
  526. RMLUI_LUAMETHOD(Element,GetElementById)
  527. RMLUI_LUAMETHOD(Element,GetElementsByTagName)
  528. RMLUI_LUAMETHOD(Element,QuerySelector)
  529. RMLUI_LUAMETHOD(Element,QuerySelectorAll)
  530. RMLUI_LUAMETHOD(Element,HasAttribute)
  531. RMLUI_LUAMETHOD(Element,HasChildNodes)
  532. RMLUI_LUAMETHOD(Element,InsertBefore)
  533. RMLUI_LUAMETHOD(Element,IsClassSet)
  534. RMLUI_LUAMETHOD(Element,RemoveAttribute)
  535. RMLUI_LUAMETHOD(Element,RemoveChild)
  536. RMLUI_LUAMETHOD(Element,ReplaceChild)
  537. RMLUI_LUAMETHOD(Element,ScrollIntoView)
  538. RMLUI_LUAMETHOD(Element,SetAttribute)
  539. RMLUI_LUAMETHOD(Element,SetClass)
  540. { nullptr, nullptr },
  541. };
  542. luaL_Reg ElementGetters[] =
  543. {
  544. RMLUI_LUAGETTER(Element,attributes)
  545. RMLUI_LUAGETTER(Element,child_nodes)
  546. RMLUI_LUAGETTER(Element,class_name)
  547. RMLUI_LUAGETTER(Element,client_left)
  548. RMLUI_LUAGETTER(Element,client_height)
  549. RMLUI_LUAGETTER(Element,client_top)
  550. RMLUI_LUAGETTER(Element,client_width)
  551. RMLUI_LUAGETTER(Element,first_child)
  552. RMLUI_LUAGETTER(Element,id)
  553. RMLUI_LUAGETTER(Element,inner_rml)
  554. RMLUI_LUAGETTER(Element,last_child)
  555. RMLUI_LUAGETTER(Element,next_sibling)
  556. RMLUI_LUAGETTER(Element,offset_height)
  557. RMLUI_LUAGETTER(Element,offset_left)
  558. RMLUI_LUAGETTER(Element,offset_parent)
  559. RMLUI_LUAGETTER(Element,offset_top)
  560. RMLUI_LUAGETTER(Element,offset_width)
  561. RMLUI_LUAGETTER(Element,owner_document)
  562. RMLUI_LUAGETTER(Element,parent_node)
  563. RMLUI_LUAGETTER(Element,previous_sibling)
  564. RMLUI_LUAGETTER(Element,scroll_height)
  565. RMLUI_LUAGETTER(Element,scroll_left)
  566. RMLUI_LUAGETTER(Element,scroll_top)
  567. RMLUI_LUAGETTER(Element,scroll_width)
  568. RMLUI_LUAGETTER(Element,style)
  569. RMLUI_LUAGETTER(Element,tag_name)
  570. { nullptr, nullptr },
  571. };
  572. luaL_Reg ElementSetters[] =
  573. {
  574. RMLUI_LUASETTER(Element,class_name)
  575. RMLUI_LUASETTER(Element,id)
  576. RMLUI_LUASETTER(Element,inner_rml)
  577. RMLUI_LUASETTER(Element,scroll_left)
  578. RMLUI_LUASETTER(Element,scroll_top)
  579. { nullptr, nullptr },
  580. };
  581. RMLUI_LUATYPE_DEFINE(Element)
  582. template<> void ExtraInit<ElementPtr>(lua_State* /*L*/, int /*metatable_index*/)
  583. {
  584. return;
  585. }
  586. RegType<ElementPtr> ElementPtrMethods[] =
  587. {
  588. { nullptr, nullptr },
  589. };
  590. luaL_Reg ElementPtrGetters[] =
  591. {
  592. { nullptr, nullptr },
  593. };
  594. luaL_Reg ElementPtrSetters[] =
  595. {
  596. { nullptr, nullptr },
  597. };
  598. RMLUI_LUATYPE_DEFINE(ElementPtr)
  599. } // namespace Lua
  600. } // namespace Rml