Element.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  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-2023 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 "ElementAttributesProxy.h"
  30. #include "ElementChildNodesProxy.h"
  31. #include "ElementStyleProxy.h"
  32. #include "LuaEventListener.h"
  33. #include <RmlUi/Lua/Utilities.h>
  34. namespace Rml {
  35. namespace Lua {
  36. typedef ElementDocument Document;
  37. template <>
  38. void ExtraInit<Element>(lua_State* L, int metatable_index)
  39. {
  40. int top = lua_gettop(L);
  41. // guarantee the "Element.As" table exists
  42. lua_getfield(L, metatable_index - 1, "As");
  43. if (lua_isnoneornil(L, -1)) // if it doesn't exist, create it
  44. {
  45. lua_newtable(L);
  46. lua_setfield(L, metatable_index - 1, "As");
  47. }
  48. lua_pop(L, 1); // pop the result of lua_getfield
  49. lua_pushcfunction(L, Elementnew);
  50. lua_setfield(L, metatable_index - 1, "new");
  51. lua_settop(L, top);
  52. }
  53. int Elementnew(lua_State* L)
  54. {
  55. const char* tag = luaL_checkstring(L, 1);
  56. Element* ele = new Element(tag);
  57. LuaType<Element>::push(L, ele, true);
  58. return 1;
  59. }
  60. // methods
  61. int ElementAddEventListener(lua_State* L, Element* obj)
  62. {
  63. int top = lua_gettop(L);
  64. bool capture = false;
  65. // default false if they didn't pass it in
  66. if (top > 2)
  67. capture = RMLUI_CHECK_BOOL(L, 3);
  68. const char* event = luaL_checkstring(L, 1);
  69. LuaEventListener* listener = nullptr;
  70. int type = lua_type(L, 2);
  71. if (type == LUA_TFUNCTION)
  72. {
  73. listener = new LuaEventListener(L, 2, obj);
  74. }
  75. else if (type == LUA_TSTRING)
  76. {
  77. const char* code = luaL_checkstring(L, 2);
  78. listener = new LuaEventListener(code, obj);
  79. }
  80. else
  81. {
  82. 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",
  83. lua_typename(L, type));
  84. }
  85. if (listener != nullptr)
  86. {
  87. obj->AddEventListener(event, listener, capture);
  88. }
  89. return 0;
  90. }
  91. int ElementAppendChild(lua_State* L, Element* obj)
  92. {
  93. ElementPtr* element = LuaType<ElementPtr>::check(L, 1);
  94. if (*element)
  95. {
  96. Element* child = obj->AppendChild(std::move(*element));
  97. LuaType<Element>::push(L, child, false);
  98. }
  99. else
  100. {
  101. Log::Message(Log::LT_WARNING, "Could not append child to element '%s', as the child was null. Was it already moved from?",
  102. obj->GetAddress().c_str());
  103. lua_pushnil(L);
  104. }
  105. return 1;
  106. }
  107. int ElementBlur(lua_State* /*L*/, Element* obj)
  108. {
  109. obj->Blur();
  110. return 0;
  111. }
  112. int ElementClick(lua_State* /*L*/, Element* obj)
  113. {
  114. obj->Click();
  115. return 0;
  116. }
  117. int ElementDispatchEvent(lua_State* L, Element* obj)
  118. {
  119. const char* event = luaL_checkstring(L, 1);
  120. Dictionary params;
  121. lua_pushnil(L); // becauase lua_next pops a key from the stack first, we don't want to pop the table
  122. while (lua_next(L, 2) != 0)
  123. {
  124. //[-1] is value, [-2] is key
  125. int type = lua_type(L, -1);
  126. const char* key = luaL_checkstring(L, -2); // key HAS to be a string, or things will go bad
  127. switch (type)
  128. {
  129. case LUA_TNUMBER: params[key] = (float)lua_tonumber(L, -1); break;
  130. case LUA_TBOOLEAN: params[key] = RMLUI_CHECK_BOOL(L, -1); break;
  131. case LUA_TSTRING: params[key] = luaL_checkstring(L, -1); break;
  132. case LUA_TUSERDATA:
  133. case LUA_TLIGHTUSERDATA: params[key] = lua_touserdata(L, -1); break;
  134. default: 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. {
  212. Element* inserted = obj->InsertBefore(std::move(*element), adjacent);
  213. LuaType<Element>::push(L, inserted, false);
  214. }
  215. else
  216. {
  217. Log::Message(Log::LT_WARNING, "Could not insert child to element '%s', as the child was null. Was it already moved from?",
  218. obj->GetAddress().c_str());
  219. lua_pushnil(L);
  220. }
  221. return 1;
  222. }
  223. int ElementIsClassSet(lua_State* L, Element* obj)
  224. {
  225. const char* name = luaL_checkstring(L, 1);
  226. lua_pushboolean(L, obj->IsClassSet(name));
  227. return 1;
  228. }
  229. int ElementRemoveAttribute(lua_State* L, Element* obj)
  230. {
  231. const char* name = luaL_checkstring(L, 1);
  232. obj->RemoveAttribute(name);
  233. return 0;
  234. }
  235. int ElementRemoveChild(lua_State* L, Element* obj)
  236. {
  237. Element* element = LuaType<Element>::check(L, 1);
  238. lua_pushboolean(L, static_cast<bool>(obj->RemoveChild(element)));
  239. return 1;
  240. }
  241. int ElementReplaceChild(lua_State* L, Element* obj)
  242. {
  243. ElementPtr* inserted = LuaType<ElementPtr>::check(L, 1);
  244. Element* replaced = LuaType<Element>::check(L, 2);
  245. if (*inserted)
  246. lua_pushboolean(L, static_cast<bool>(obj->ReplaceChild(std::move(*inserted), replaced)));
  247. else
  248. Log::Message(Log::LT_WARNING, "Could not replace child in element '%s', as the child was null. Was it already moved from?",
  249. obj->GetAddress().c_str());
  250. return 1;
  251. }
  252. int ElementScrollIntoView(lua_State* L, Element* obj)
  253. {
  254. bool align = RMLUI_CHECK_BOOL(L, 1);
  255. obj->ScrollIntoView(align);
  256. return 0;
  257. }
  258. int ElementSetAttribute(lua_State* L, Element* obj)
  259. {
  260. const char* name = luaL_checkstring(L, 1);
  261. const char* value = luaL_checkstring(L, 2);
  262. obj->SetAttribute(name, String(value));
  263. return 0;
  264. }
  265. int ElementSetClass(lua_State* L, Element* obj)
  266. {
  267. const char* name = luaL_checkstring(L, 1);
  268. bool value = RMLUI_CHECK_BOOL(L, 2);
  269. obj->SetClass(name, value);
  270. return 0;
  271. }
  272. // getters
  273. int ElementGetAttrattributes(lua_State* L)
  274. {
  275. Element* ele = LuaType<Element>::check(L, 1);
  276. RMLUI_CHECK_OBJ(ele);
  277. ElementAttributesProxy* proxy = new ElementAttributesProxy();
  278. proxy->owner = ele;
  279. LuaType<ElementAttributesProxy>::push(L, proxy, true);
  280. return 1;
  281. }
  282. int ElementGetAttrchild_nodes(lua_State* L)
  283. {
  284. Element* ele = LuaType<Element>::check(L, 1);
  285. RMLUI_CHECK_OBJ(ele);
  286. ElementChildNodesProxy* ecnp = new ElementChildNodesProxy();
  287. ecnp->owner = ele;
  288. LuaType<ElementChildNodesProxy>::push(L, ecnp, true);
  289. return 1;
  290. }
  291. int ElementGetAttrclass_name(lua_State* L)
  292. {
  293. Element* ele = LuaType<Element>::check(L, 1);
  294. RMLUI_CHECK_OBJ(ele);
  295. String classnames = ele->GetClassNames();
  296. lua_pushstring(L, classnames.c_str());
  297. return 1;
  298. }
  299. int ElementGetAttrclient_left(lua_State* L)
  300. {
  301. Element* ele = LuaType<Element>::check(L, 1);
  302. RMLUI_CHECK_OBJ(ele);
  303. lua_pushnumber(L, ele->GetClientLeft());
  304. return 1;
  305. }
  306. int ElementGetAttrclient_height(lua_State* L)
  307. {
  308. Element* ele = LuaType<Element>::check(L, 1);
  309. RMLUI_CHECK_OBJ(ele);
  310. lua_pushnumber(L, ele->GetClientHeight());
  311. return 1;
  312. }
  313. int ElementGetAttrclient_top(lua_State* L)
  314. {
  315. Element* ele = LuaType<Element>::check(L, 1);
  316. RMLUI_CHECK_OBJ(ele);
  317. lua_pushnumber(L, ele->GetClientTop());
  318. return 1;
  319. }
  320. int ElementGetAttrclient_width(lua_State* L)
  321. {
  322. Element* ele = LuaType<Element>::check(L, 1);
  323. RMLUI_CHECK_OBJ(ele);
  324. lua_pushnumber(L, ele->GetClientWidth());
  325. return 1;
  326. }
  327. int ElementGetAttrfirst_child(lua_State* L)
  328. {
  329. Element* ele = LuaType<Element>::check(L, 1);
  330. RMLUI_CHECK_OBJ(ele);
  331. Element* child = ele->GetFirstChild();
  332. if (child == nullptr)
  333. lua_pushnil(L);
  334. else
  335. LuaType<Element>::push(L, child, false);
  336. return 1;
  337. }
  338. int ElementGetAttrid(lua_State* L)
  339. {
  340. Element* ele = LuaType<Element>::check(L, 1);
  341. RMLUI_CHECK_OBJ(ele);
  342. lua_pushstring(L, ele->GetId().c_str());
  343. return 1;
  344. }
  345. int ElementGetAttrinner_rml(lua_State* L)
  346. {
  347. Element* ele = LuaType<Element>::check(L, 1);
  348. RMLUI_CHECK_OBJ(ele);
  349. lua_pushstring(L, ele->GetInnerRML().c_str());
  350. return 1;
  351. }
  352. int ElementGetAttrlast_child(lua_State* L)
  353. {
  354. Element* ele = LuaType<Element>::check(L, 1);
  355. RMLUI_CHECK_OBJ(ele);
  356. Element* child = ele->GetLastChild();
  357. if (child == nullptr)
  358. lua_pushnil(L);
  359. else
  360. LuaType<Element>::push(L, child, false);
  361. return 1;
  362. }
  363. int ElementGetAttrnext_sibling(lua_State* L)
  364. {
  365. Element* ele = LuaType<Element>::check(L, 1);
  366. RMLUI_CHECK_OBJ(ele);
  367. Element* sibling = ele->GetNextSibling();
  368. if (sibling == nullptr)
  369. lua_pushnil(L);
  370. else
  371. LuaType<Element>::push(L, sibling, false);
  372. return 1;
  373. }
  374. int ElementGetAttroffset_height(lua_State* L)
  375. {
  376. Element* ele = LuaType<Element>::check(L, 1);
  377. RMLUI_CHECK_OBJ(ele);
  378. lua_pushnumber(L, ele->GetOffsetHeight());
  379. return 1;
  380. }
  381. int ElementGetAttroffset_left(lua_State* L)
  382. {
  383. Element* ele = LuaType<Element>::check(L, 1);
  384. RMLUI_CHECK_OBJ(ele);
  385. lua_pushnumber(L, ele->GetOffsetLeft());
  386. return 1;
  387. }
  388. int ElementGetAttroffset_parent(lua_State* L)
  389. {
  390. Element* ele = LuaType<Element>::check(L, 1);
  391. RMLUI_CHECK_OBJ(ele);
  392. Element* parent = ele->GetOffsetParent();
  393. LuaType<Element>::push(L, parent, false);
  394. return 1;
  395. }
  396. int ElementGetAttroffset_top(lua_State* L)
  397. {
  398. Element* ele = LuaType<Element>::check(L, 1);
  399. RMLUI_CHECK_OBJ(ele);
  400. lua_pushnumber(L, ele->GetOffsetTop());
  401. return 1;
  402. }
  403. int ElementGetAttroffset_width(lua_State* L)
  404. {
  405. Element* ele = LuaType<Element>::check(L, 1);
  406. RMLUI_CHECK_OBJ(ele);
  407. lua_pushnumber(L, ele->GetOffsetWidth());
  408. return 1;
  409. }
  410. int ElementGetAttrowner_document(lua_State* L)
  411. {
  412. Element* ele = LuaType<Element>::check(L, 1);
  413. RMLUI_CHECK_OBJ(ele);
  414. Document* doc = ele->GetOwnerDocument();
  415. LuaType<Document>::push(L, doc, false);
  416. return 1;
  417. }
  418. int ElementGetAttrparent_node(lua_State* L)
  419. {
  420. Element* ele = LuaType<Element>::check(L, 1);
  421. RMLUI_CHECK_OBJ(ele);
  422. Element* parent = ele->GetParentNode();
  423. if (parent == nullptr)
  424. lua_pushnil(L);
  425. else
  426. LuaType<Element>::push(L, parent, false);
  427. return 1;
  428. }
  429. int ElementGetAttrprevious_sibling(lua_State* L)
  430. {
  431. Element* ele = LuaType<Element>::check(L, 1);
  432. RMLUI_CHECK_OBJ(ele);
  433. Element* sibling = ele->GetPreviousSibling();
  434. if (sibling == nullptr)
  435. lua_pushnil(L);
  436. else
  437. LuaType<Element>::push(L, sibling, false);
  438. return 1;
  439. }
  440. int ElementGetAttrscroll_height(lua_State* L)
  441. {
  442. Element* ele = LuaType<Element>::check(L, 1);
  443. RMLUI_CHECK_OBJ(ele);
  444. lua_pushnumber(L, ele->GetScrollHeight());
  445. return 1;
  446. }
  447. int ElementGetAttrscroll_left(lua_State* L)
  448. {
  449. Element* ele = LuaType<Element>::check(L, 1);
  450. RMLUI_CHECK_OBJ(ele);
  451. lua_pushnumber(L, ele->GetScrollLeft());
  452. return 1;
  453. }
  454. int ElementGetAttrscroll_top(lua_State* L)
  455. {
  456. Element* ele = LuaType<Element>::check(L, 1);
  457. RMLUI_CHECK_OBJ(ele);
  458. lua_pushnumber(L, ele->GetScrollTop());
  459. return 1;
  460. }
  461. int ElementGetAttrscroll_width(lua_State* L)
  462. {
  463. Element* ele = LuaType<Element>::check(L, 1);
  464. RMLUI_CHECK_OBJ(ele);
  465. lua_pushnumber(L, ele->GetScrollWidth());
  466. return 1;
  467. }
  468. int ElementGetAttrstyle(lua_State* L)
  469. {
  470. Element* ele = LuaType<Element>::check(L, 1);
  471. RMLUI_CHECK_OBJ(ele);
  472. ElementStyleProxy* prox = new ElementStyleProxy();
  473. prox->owner = ele;
  474. LuaType<ElementStyleProxy>::push(L, prox, true);
  475. return 1;
  476. }
  477. int ElementGetAttrtag_name(lua_State* L)
  478. {
  479. Element* ele = LuaType<Element>::check(L, 1);
  480. RMLUI_CHECK_OBJ(ele);
  481. lua_pushstring(L, ele->GetTagName().c_str());
  482. return 1;
  483. }
  484. // setters
  485. int ElementSetAttrclass_name(lua_State* L)
  486. {
  487. Element* ele = LuaType<Element>::check(L, 1);
  488. RMLUI_CHECK_OBJ(ele);
  489. const char* name = luaL_checkstring(L, 2);
  490. ele->SetClassNames(name);
  491. return 0;
  492. }
  493. int ElementSetAttrid(lua_State* L)
  494. {
  495. Element* ele = LuaType<Element>::check(L, 1);
  496. RMLUI_CHECK_OBJ(ele);
  497. const char* id = luaL_checkstring(L, 2);
  498. ele->SetId(id);
  499. return 0;
  500. }
  501. int ElementSetAttrinner_rml(lua_State* L)
  502. {
  503. Element* ele = LuaType<Element>::check(L, 1);
  504. RMLUI_CHECK_OBJ(ele);
  505. const char* rml = luaL_checkstring(L, 2);
  506. ele->SetInnerRML(rml);
  507. return 0;
  508. }
  509. int ElementSetAttrscroll_left(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->SetScrollLeft(scroll);
  515. return 0;
  516. }
  517. int ElementSetAttrscroll_top(lua_State* L)
  518. {
  519. Element* ele = LuaType<Element>::check(L, 1);
  520. RMLUI_CHECK_OBJ(ele);
  521. float scroll = (float)luaL_checknumber(L, 2);
  522. ele->SetScrollTop(scroll);
  523. return 0;
  524. }
  525. RegType<Element> ElementMethods[] = {
  526. RMLUI_LUAMETHOD(Element, AddEventListener),
  527. RMLUI_LUAMETHOD(Element, AppendChild),
  528. RMLUI_LUAMETHOD(Element, Blur),
  529. RMLUI_LUAMETHOD(Element, Click),
  530. RMLUI_LUAMETHOD(Element, DispatchEvent),
  531. RMLUI_LUAMETHOD(Element, Focus),
  532. RMLUI_LUAMETHOD(Element, GetAttribute),
  533. RMLUI_LUAMETHOD(Element, GetElementById),
  534. RMLUI_LUAMETHOD(Element, GetElementsByTagName),
  535. RMLUI_LUAMETHOD(Element, QuerySelector),
  536. RMLUI_LUAMETHOD(Element, QuerySelectorAll),
  537. RMLUI_LUAMETHOD(Element, HasAttribute),
  538. RMLUI_LUAMETHOD(Element, HasChildNodes),
  539. RMLUI_LUAMETHOD(Element, InsertBefore),
  540. RMLUI_LUAMETHOD(Element, IsClassSet),
  541. RMLUI_LUAMETHOD(Element, RemoveAttribute),
  542. RMLUI_LUAMETHOD(Element, RemoveChild),
  543. RMLUI_LUAMETHOD(Element, ReplaceChild),
  544. RMLUI_LUAMETHOD(Element, ScrollIntoView),
  545. RMLUI_LUAMETHOD(Element, SetAttribute),
  546. RMLUI_LUAMETHOD(Element, SetClass),
  547. {nullptr, nullptr},
  548. };
  549. luaL_Reg ElementGetters[] = {
  550. RMLUI_LUAGETTER(Element, attributes),
  551. RMLUI_LUAGETTER(Element, child_nodes),
  552. RMLUI_LUAGETTER(Element, class_name),
  553. RMLUI_LUAGETTER(Element, client_left),
  554. RMLUI_LUAGETTER(Element, client_height),
  555. RMLUI_LUAGETTER(Element, client_top),
  556. RMLUI_LUAGETTER(Element, client_width),
  557. RMLUI_LUAGETTER(Element, first_child),
  558. RMLUI_LUAGETTER(Element, id),
  559. RMLUI_LUAGETTER(Element, inner_rml),
  560. RMLUI_LUAGETTER(Element, last_child),
  561. RMLUI_LUAGETTER(Element, next_sibling),
  562. RMLUI_LUAGETTER(Element, offset_height),
  563. RMLUI_LUAGETTER(Element, offset_left),
  564. RMLUI_LUAGETTER(Element, offset_parent),
  565. RMLUI_LUAGETTER(Element, offset_top),
  566. RMLUI_LUAGETTER(Element, offset_width),
  567. RMLUI_LUAGETTER(Element, owner_document),
  568. RMLUI_LUAGETTER(Element, parent_node),
  569. RMLUI_LUAGETTER(Element, previous_sibling),
  570. RMLUI_LUAGETTER(Element, scroll_height),
  571. RMLUI_LUAGETTER(Element, scroll_left),
  572. RMLUI_LUAGETTER(Element, scroll_top),
  573. RMLUI_LUAGETTER(Element, scroll_width),
  574. RMLUI_LUAGETTER(Element, style),
  575. RMLUI_LUAGETTER(Element, tag_name),
  576. {nullptr, nullptr},
  577. };
  578. luaL_Reg ElementSetters[] = {
  579. RMLUI_LUASETTER(Element, class_name),
  580. RMLUI_LUASETTER(Element, id),
  581. RMLUI_LUASETTER(Element, inner_rml),
  582. RMLUI_LUASETTER(Element, scroll_left),
  583. RMLUI_LUASETTER(Element, scroll_top),
  584. {nullptr, nullptr},
  585. };
  586. RMLUI_LUATYPE_DEFINE(Element)
  587. template <>
  588. void ExtraInit<ElementPtr>(lua_State* /*L*/, int /*metatable_index*/)
  589. {
  590. return;
  591. }
  592. RegType<ElementPtr> ElementPtrMethods[] = {
  593. {nullptr, nullptr},
  594. };
  595. luaL_Reg ElementPtrGetters[] = {
  596. {nullptr, nullptr},
  597. };
  598. luaL_Reg ElementPtrSetters[] = {
  599. {nullptr, nullptr},
  600. };
  601. RMLUI_LUATYPE_DEFINE(ElementPtr)
  602. } // namespace Lua
  603. } // namespace Rml