UIAPI.cpp 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2011 Lasse Öörni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #include "Precompiled.h"
  24. #include "APITemplates.h"
  25. #include "CheckBox.h"
  26. #include "Cursor.h"
  27. #include "DropDownList.h"
  28. #include "FileSelector.h"
  29. #include "Font.h"
  30. #include "LineEdit.h"
  31. #include "ListView.h"
  32. #include "ScrollBar.h"
  33. #include "Slider.h"
  34. #include "Text.h"
  35. #include "UI.h"
  36. #include "Window.h"
  37. static void RegisterFont(asIScriptEngine* engine)
  38. {
  39. RegisterResource<Font>(engine, "Font");
  40. }
  41. static void RegisterUIElement(asIScriptEngine* engine)
  42. {
  43. engine->RegisterEnum("HorizontalAlignment");
  44. engine->RegisterEnumValue("HorizontalAlignment", "HA_LEFT", HA_LEFT);
  45. engine->RegisterEnumValue("HorizontalAlignment", "HA_CENTER", HA_CENTER);
  46. engine->RegisterEnumValue("HorizontalAlignment", "HA_RIGHT", HA_RIGHT);
  47. engine->RegisterEnum("VerticalAlignment");
  48. engine->RegisterEnumValue("VerticalAlignment", "VA_TOP", VA_TOP);
  49. engine->RegisterEnumValue("VerticalAlignment", "VA_CENTER", VA_CENTER);
  50. engine->RegisterEnumValue("VerticalAlignment", "VA_BOTTOM", VA_BOTTOM);
  51. engine->RegisterEnum("Corner");
  52. engine->RegisterEnumValue("Corner", "C_TOPLEFT", C_TOPLEFT);
  53. engine->RegisterEnumValue("Corner", "C_TOPRIGHT", C_TOPRIGHT);
  54. engine->RegisterEnumValue("Corner", "C_BOTTOMLEFT", C_BOTTOMLEFT);
  55. engine->RegisterEnumValue("Corner", "C_BOTTOMRIGHT", C_BOTTOMRIGHT);
  56. engine->RegisterEnum("Orientation");
  57. engine->RegisterEnumValue("Orientation", "O_HORIZONTAL", O_HORIZONTAL);
  58. engine->RegisterEnumValue("Orientation", "O_VERTICAL", O_VERTICAL);
  59. engine->RegisterEnum("FocusMode");
  60. engine->RegisterEnumValue("FocusMode", "FM_NOTFOCUSABLE", FM_NOTFOCUSABLE);
  61. engine->RegisterEnumValue("FocusMode", "FM_RESETFOCUS", FM_RESETFOCUS);
  62. engine->RegisterEnumValue("FocusMode", "FM_FOCUSABLE", FM_FOCUSABLE);
  63. engine->RegisterEnumValue("FocusMode", "FM_FOCUSABLE_DEFOCUSABLE", FM_FOCUSABLE_DEFOCUSABLE);
  64. engine->RegisterEnum("LayoutMode");
  65. engine->RegisterEnumValue("LayoutMode", "LM_FREE", LM_FREE);
  66. engine->RegisterEnumValue("LayoutMode", "LM_HORIZONTAL", LM_HORIZONTAL);
  67. engine->RegisterEnumValue("LayoutMode", "LM_VERTICAL", LM_VERTICAL);
  68. engine->RegisterGlobalProperty("const uint DD_DISABLED", (void*)&DD_DISABLED);
  69. engine->RegisterGlobalProperty("const uint DD_SOURCE", (void*)&DD_SOURCE);
  70. engine->RegisterGlobalProperty("const uint DD_TARGET", (void*)&DD_TARGET);
  71. engine->RegisterGlobalProperty("const uint DD_SOURCE_AND_TARGET", (void*)&DD_SOURCE_AND_TARGET);
  72. RegisterUIElement<UIElement>(engine, "UIElement");
  73. // Register Variant Ptr() for UIElement
  74. engine->RegisterObjectMethod("Variant", "UIElement@+ GetUIElement() const", asFUNCTION(GetVariantPtr<UIElement>), asCALL_CDECL_OBJLAST);
  75. }
  76. static void RegisterBorderImage(asIScriptEngine* engine)
  77. {
  78. RegisterBorderImage<BorderImage>(engine, "BorderImage");
  79. }
  80. static void RegisterCursor(asIScriptEngine* engine)
  81. {
  82. engine->RegisterEnum("CursorShape");
  83. engine->RegisterEnumValue("CursorShape", "CS_NORMAL", CS_NORMAL);
  84. engine->RegisterEnumValue("CursorShape", "CS_RESIZEVERTICAL", CS_RESIZEVERTICAL);
  85. engine->RegisterEnumValue("CursorShape", "CS_RESIZEDIAGONAL_TOPRIGHT", CS_RESIZEDIAGONAL_TOPRIGHT);
  86. engine->RegisterEnumValue("CursorShape", "CS_RESIZEHORIZONTAL", CS_RESIZEHORIZONTAL);
  87. engine->RegisterEnumValue("CursorShape", "CS_RESIZEDIAGONAL_TOPLEFT", CS_RESIZEDIAGONAL_TOPLEFT);
  88. engine->RegisterEnumValue("CursorShape", "CS_ACCEPTDROP", CS_ACCEPTDROP);
  89. engine->RegisterEnumValue("CursorShape", "CS_REJECTDROP", CS_REJECTDROP);
  90. RegisterBorderImage<Cursor>(engine, "Cursor");
  91. engine->RegisterObjectMethod("Cursor", "void DefineShape(CursorShape, Texture@+, const IntRect&in, const IntVector2&in)", asMETHOD(Cursor, DefineShape), asCALL_THISCALL);
  92. engine->RegisterObjectMethod("Cursor", "void set_shape(CursorShape)", asMETHOD(Cursor, SetShape), asCALL_THISCALL);
  93. engine->RegisterObjectMethod("Cursor", "CursorShape get_shape() const", asMETHOD(Cursor, GetShape), asCALL_THISCALL);
  94. }
  95. static void RegisterButton(asIScriptEngine* engine)
  96. {
  97. RegisterButton<Button>(engine, "Button");
  98. }
  99. static void RegisterCheckBox(asIScriptEngine* engine)
  100. {
  101. RegisterBorderImage<CheckBox>(engine, "CheckBox");
  102. engine->RegisterObjectMethod("CheckBox", "void SetCheckedOffset(int, int)", asMETHODPR(CheckBox, SetCheckedOffset, (int, int), void), asCALL_THISCALL);
  103. engine->RegisterObjectMethod("CheckBox", "void set_checked(bool)", asMETHOD(CheckBox, SetChecked), asCALL_THISCALL);
  104. engine->RegisterObjectMethod("CheckBox", "bool get_checked() const", asMETHOD(CheckBox, IsChecked), asCALL_THISCALL);
  105. engine->RegisterObjectMethod("CheckBox", "void set_checkedOffset(const IntVector2&in)", asMETHODPR(CheckBox, SetCheckedOffset, (const IntVector2&), void), asCALL_THISCALL);
  106. engine->RegisterObjectMethod("CheckBox", "const IntVector2& get_checkedOffset() const", asMETHOD(CheckBox, GetCheckedOffset), asCALL_THISCALL);
  107. }
  108. static void RegisterSlider(asIScriptEngine* engine)
  109. {
  110. RegisterBorderImage<Slider>(engine, "Slider");
  111. engine->RegisterObjectMethod("Slider", "void ChangeValue(float)", asMETHOD(Slider, ChangeValue), asCALL_THISCALL);
  112. engine->RegisterObjectMethod("Slider", "void set_orientation(Orientation)", asMETHOD(Slider, SetOrientation), asCALL_THISCALL);
  113. engine->RegisterObjectMethod("Slider", "Orientation get_orientation() const", asMETHOD(Slider, GetOrientation), asCALL_THISCALL);
  114. engine->RegisterObjectMethod("Slider", "void set_range(float)", asMETHOD(Slider, SetRange), asCALL_THISCALL);
  115. engine->RegisterObjectMethod("Slider", "float get_range() const", asMETHOD(Slider, GetRange), asCALL_THISCALL);
  116. engine->RegisterObjectMethod("Slider", "void set_value(float)", asMETHOD(Slider, SetValue), asCALL_THISCALL);
  117. engine->RegisterObjectMethod("Slider", "float get_value() const", asMETHOD(Slider, GetValue), asCALL_THISCALL);
  118. engine->RegisterObjectMethod("Slider", "BorderImage@+ get_knob() const", asMETHOD(Slider, GetKnob), asCALL_THISCALL);
  119. }
  120. static void RegisterScrollBar(asIScriptEngine* engine)
  121. {
  122. RegisterUIElement<ScrollBar>(engine, "ScrollBar");
  123. engine->RegisterObjectMethod("ScrollBar", "void ChangeValue(float)", asMETHOD(ScrollBar, ChangeValue), asCALL_THISCALL);
  124. engine->RegisterObjectMethod("ScrollBar", "void StepBack()", asMETHOD(ScrollBar, StepBack), asCALL_THISCALL);
  125. engine->RegisterObjectMethod("ScrollBar", "void StepForward()", asMETHOD(ScrollBar, StepForward), asCALL_THISCALL);
  126. engine->RegisterObjectMethod("ScrollBar", "void set_orientation(Orientation)", asMETHOD(ScrollBar, SetOrientation), asCALL_THISCALL);
  127. engine->RegisterObjectMethod("ScrollBar", "Orientation get_orientation() const", asMETHOD(ScrollBar, GetOrientation), asCALL_THISCALL);
  128. engine->RegisterObjectMethod("ScrollBar", "void set_range(float)", asMETHOD(ScrollBar, SetRange), asCALL_THISCALL);
  129. engine->RegisterObjectMethod("ScrollBar", "float get_range() const", asMETHOD(ScrollBar, GetRange), asCALL_THISCALL);
  130. engine->RegisterObjectMethod("ScrollBar", "void set_value(float)", asMETHOD(ScrollBar, SetValue), asCALL_THISCALL);
  131. engine->RegisterObjectMethod("ScrollBar", "float get_value() const", asMETHOD(ScrollBar, GetValue), asCALL_THISCALL);
  132. engine->RegisterObjectMethod("ScrollBar", "void set_scrollStep(float)", asMETHOD(ScrollBar, SetScrollStep), asCALL_THISCALL);
  133. engine->RegisterObjectMethod("ScrollBar", "float get_scrollStep() const", asMETHOD(ScrollBar, GetScrollStep), asCALL_THISCALL);
  134. engine->RegisterObjectMethod("ScrollBar", "void set_stepFactor(bool)", asMETHOD(ScrollBar, SetStepFactor), asCALL_THISCALL);
  135. engine->RegisterObjectMethod("ScrollBar", "float get_stepFactor() const", asMETHOD(ScrollBar, GetStepFactor), asCALL_THISCALL);
  136. engine->RegisterObjectMethod("ScrollBar", "float get_effectiveScrollStep() const", asMETHOD(ScrollBar, GetEffectiveScrollStep), asCALL_THISCALL);
  137. engine->RegisterObjectMethod("ScrollBar", "Button@+ get_backButton() const", asMETHOD(ScrollBar, GetBackButton), asCALL_THISCALL);
  138. engine->RegisterObjectMethod("ScrollBar", "Button@+ get_forwardButton() const", asMETHOD(ScrollBar, GetForwardButton), asCALL_THISCALL);
  139. engine->RegisterObjectMethod("ScrollBar", "Slider@+ get_slider() const", asMETHOD(ScrollBar, GetSlider), asCALL_THISCALL);
  140. }
  141. static void RegisterScrollView(asIScriptEngine* engine)
  142. {
  143. RegisterUIElement<ScrollView>(engine, "ScrollView");
  144. engine->RegisterObjectMethod("ScrollView", "void SetViewPosition(int, int)", asMETHODPR(ScrollView, SetViewPosition, (int, int), void), asCALL_THISCALL);
  145. engine->RegisterObjectMethod("ScrollView", "void SetScrollBarsVisible(bool, bool)", asMETHOD(ScrollView, SetScrollBarsVisible), asCALL_THISCALL);
  146. engine->RegisterObjectMethod("ScrollView", "void set_contentElement(UIElement@+)", asMETHOD(ScrollView, SetContentElement), asCALL_THISCALL);
  147. engine->RegisterObjectMethod("ScrollView", "UIElement@+ get_contentElement() const", asMETHOD(ScrollView, GetContentElement), asCALL_THISCALL);
  148. engine->RegisterObjectMethod("ScrollView", "void set_viewPosition(const IntVector2&in)", asMETHODPR(ScrollView, SetViewPosition, (const IntVector2&), void), asCALL_THISCALL);
  149. engine->RegisterObjectMethod("ScrollView", "const IntVector2& get_viewPosition() const", asMETHOD(ScrollView, GetViewPosition), asCALL_THISCALL);
  150. engine->RegisterObjectMethod("ScrollView", "void set_scrollStep(float)", asMETHOD(ScrollView, SetScrollStep), asCALL_THISCALL);
  151. engine->RegisterObjectMethod("ScrollView", "float get_scrollStep() const", asMETHOD(ScrollView, GetScrollStep), asCALL_THISCALL);
  152. engine->RegisterObjectMethod("ScrollView", "void set_pageStep(float)", asMETHOD(ScrollView, SetPageStep), asCALL_THISCALL);
  153. engine->RegisterObjectMethod("ScrollView", "float get_pageStep() const", asMETHOD(ScrollView, GetPageStep), asCALL_THISCALL);
  154. engine->RegisterObjectMethod("ScrollView", "ScrollBar@+ get_horizontalScrollBar() const", asMETHOD(ScrollView, GetHorizontalScrollBar), asCALL_THISCALL);
  155. engine->RegisterObjectMethod("ScrollView", "ScrollBar@+ get_verticalScrollBar() const", asMETHOD(ScrollView, GetVerticalScrollBar), asCALL_THISCALL);
  156. engine->RegisterObjectMethod("ScrollView", "BorderImage@+ get_scrollPanel() const", asMETHOD(ScrollView, GetScrollPanel), asCALL_THISCALL);
  157. }
  158. void ListViewSetSelections(CScriptArray* selections, ListView* ptr)
  159. {
  160. unsigned numItems = selections->GetSize();
  161. Set<unsigned> dest;
  162. for (unsigned i = 0; i < numItems; ++i)
  163. dest.Insert(*((unsigned*)selections->At(i)));
  164. ptr->SetSelections(dest);
  165. }
  166. static CScriptArray* ListViewGetSelections(ListView* ptr)
  167. {
  168. return SetToArray<unsigned>(ptr->GetSelections(), "Array<uint>");
  169. }
  170. static CScriptArray* ListViewGetItems(ListView* ptr)
  171. {
  172. PODVector<UIElement*> result = ptr->GetItems();
  173. return VectorToHandleArray<UIElement>(result, "Array<UIElement@>");
  174. }
  175. static CScriptArray* ListViewGetSelectedItems(ListView* ptr)
  176. {
  177. PODVector<UIElement*> result = ptr->GetSelectedItems();
  178. return VectorToHandleArray<UIElement>(result, "Array<UIElement@>");
  179. }
  180. static void RegisterListView(asIScriptEngine* engine)
  181. {
  182. engine->RegisterEnum("HighlightMode");
  183. engine->RegisterEnumValue("HighlightMode", "HM_NEVER", HM_NEVER);
  184. engine->RegisterEnumValue("HighlightMode", "HM_FOCUS", HM_FOCUS);
  185. engine->RegisterEnumValue("HighlightMode", "HM_ALWAYS", HM_ALWAYS);
  186. RegisterUIElement<ListView>(engine, "ListView");
  187. engine->RegisterObjectMethod("ListView", "void SetViewPosition(int, int)", asMETHODPR(ListView, SetViewPosition, (int, int), void), asCALL_THISCALL);
  188. engine->RegisterObjectMethod("ListView", "void SetScrollBarsVisible(bool, bool)", asMETHOD(ListView, SetScrollBarsVisible), asCALL_THISCALL);
  189. engine->RegisterObjectMethod("ListView", "void AddItem(UIElement@+)", asMETHOD(ListView, AddItem), asCALL_THISCALL);
  190. engine->RegisterObjectMethod("ListView", "void InsertItem(uint, UIElement@+)", asMETHOD(ListView, InsertItem), asCALL_THISCALL);
  191. engine->RegisterObjectMethod("ListView", "void RemoveItem(UIElement@+)", asMETHODPR(ListView, RemoveItem, (UIElement*), void), asCALL_THISCALL);
  192. engine->RegisterObjectMethod("ListView", "void RemoveItem(uint)", asMETHODPR(ListView, RemoveItem, (unsigned), void), asCALL_THISCALL);
  193. engine->RegisterObjectMethod("ListView", "void RemoveAllItems()", asMETHOD(ListView, RemoveAllItems), asCALL_THISCALL);
  194. engine->RegisterObjectMethod("ListView", "void AddSelection(uint)", asMETHOD(ListView, AddSelection), asCALL_THISCALL);
  195. engine->RegisterObjectMethod("ListView", "void RemoveSelection(uint)", asMETHOD(ListView, RemoveSelection), asCALL_THISCALL);
  196. engine->RegisterObjectMethod("ListView", "void ToggleSelection(uint)", asMETHOD(ListView, ToggleSelection), asCALL_THISCALL);
  197. engine->RegisterObjectMethod("ListView", "void ChangeSelection(int, bool)", asMETHOD(ListView, ChangeSelection), asCALL_THISCALL);
  198. engine->RegisterObjectMethod("ListView", "void ClearSelection()", asMETHOD(ListView, ClearSelection), asCALL_THISCALL);
  199. engine->RegisterObjectMethod("ListView", "void SetChildItemsVisible(uint, bool)", asMETHODPR(ListView, SetChildItemsVisible, (unsigned, bool), void), asCALL_THISCALL);
  200. engine->RegisterObjectMethod("ListView", "void SetChildItemsVisible(bool)", asMETHODPR(ListView, SetChildItemsVisible, (bool), void), asCALL_THISCALL);
  201. engine->RegisterObjectMethod("ListView", "void ToggleChildItemsVisible(uint)", asMETHOD(ListView, ToggleChildItemsVisible), asCALL_THISCALL);
  202. engine->RegisterObjectMethod("ListView", "Array<UIElement@>@ GetItems() const", asFUNCTION(ListViewGetItems), asCALL_CDECL_OBJLAST);
  203. engine->RegisterObjectMethod("ListView", "void set_viewPosition(const IntVector2&in)", asMETHODPR(ListView, SetViewPosition, (const IntVector2&), void), asCALL_THISCALL);
  204. engine->RegisterObjectMethod("ListView", "const IntVector2& get_viewPosition() const", asMETHOD(ListView, GetViewPosition), asCALL_THISCALL);
  205. engine->RegisterObjectMethod("ListView", "UIElement@+ get_contentElement() const", asMETHOD(ListView, GetContentElement), asCALL_THISCALL);
  206. engine->RegisterObjectMethod("ListView", "ScrollBar@+ get_horizontalScrollBar() const", asMETHOD(ListView, GetHorizontalScrollBar), asCALL_THISCALL);
  207. engine->RegisterObjectMethod("ListView", "ScrollBar@+ get_verticalScrollBar() const", asMETHOD(ListView, GetVerticalScrollBar), asCALL_THISCALL);
  208. engine->RegisterObjectMethod("ListView", "BorderImage@+ get_scrollPanel() const", asMETHOD(ListView, GetScrollPanel), asCALL_THISCALL);
  209. engine->RegisterObjectMethod("ListView", "void set_scrollStep(float)", asMETHOD(ListView, SetScrollStep), asCALL_THISCALL);
  210. engine->RegisterObjectMethod("ListView", "float get_scrollStep() const", asMETHOD(ListView, GetScrollStep), asCALL_THISCALL);
  211. engine->RegisterObjectMethod("ListView", "void set_pageStep(float)", asMETHOD(ListView, SetPageStep), asCALL_THISCALL);
  212. engine->RegisterObjectMethod("ListView", "float get_pageStep() const", asMETHOD(ListView, GetPageStep), asCALL_THISCALL);
  213. engine->RegisterObjectMethod("ListView", "uint get_numItems() const", asMETHOD(ListView, GetNumItems), asCALL_THISCALL);
  214. engine->RegisterObjectMethod("ListView", "UIElement@+ get_items(uint) const", asMETHOD(ListView, GetItem), asCALL_THISCALL);
  215. engine->RegisterObjectMethod("ListView", "void set_selection(uint)", asMETHOD(ListView, SetSelection), asCALL_THISCALL);
  216. engine->RegisterObjectMethod("ListView", "uint get_selection() const", asMETHOD(ListView, GetSelection), asCALL_THISCALL);
  217. engine->RegisterObjectMethod("ListView", "void set_selections(Array<uint>@+)", asFUNCTION(ListViewSetSelections), asCALL_CDECL_OBJLAST);
  218. engine->RegisterObjectMethod("ListView", "Array<uint>@ get_selections() const", asFUNCTION(ListViewGetSelections), asCALL_CDECL_OBJLAST);
  219. engine->RegisterObjectMethod("ListView", "UIElement@+ get_selectedItem() const", asMETHOD(ListView, GetSelectedItem), asCALL_THISCALL);
  220. engine->RegisterObjectMethod("ListView", "Array<UIElement@>@ get_selectedItems() const", asFUNCTION(ListViewGetSelectedItems), asCALL_CDECL_OBJLAST);
  221. engine->RegisterObjectMethod("ListView", "void set_highlightMode(HighlightMode)", asMETHOD(ListView, SetHighlightMode), asCALL_THISCALL);
  222. engine->RegisterObjectMethod("ListView", "HighlightMode get_highlightMode() const", asMETHOD(ListView, GetHighlightMode), asCALL_THISCALL);
  223. engine->RegisterObjectMethod("ListView", "void set_multiselect(bool)", asMETHOD(ListView, SetMultiselect), asCALL_THISCALL);
  224. engine->RegisterObjectMethod("ListView", "bool get_multiselect() const", asMETHOD(ListView, GetMultiselect), asCALL_THISCALL);
  225. engine->RegisterObjectMethod("ListView", "void set_hierarchyMode(bool)", asMETHOD(ListView, SetHierarchyMode), asCALL_THISCALL);
  226. engine->RegisterObjectMethod("ListView", "bool get_hierarchyMode() const", asMETHOD(ListView, GetHierarchyMode), asCALL_THISCALL);
  227. engine->RegisterObjectMethod("ListView", "void set_clearSelectionOnDefocus(bool)", asMETHOD(ListView, SetClearSelectionOnDefocus), asCALL_THISCALL);
  228. engine->RegisterObjectMethod("ListView", "bool get_clearSelectionOnDefocus() const", asMETHOD(ListView, GetClearSelectionOnDefocus), asCALL_THISCALL);
  229. engine->RegisterObjectMethod("ListView", "void set_doubleClickInterval(float)", asMETHOD(ListView, SetDoubleClickInterval), asCALL_THISCALL);
  230. engine->RegisterObjectMethod("ListView", "float get_doubleClickInterval() const", asMETHOD(ListView, GetDoubleClickInterval), asCALL_THISCALL);
  231. }
  232. static void RegisterText(asIScriptEngine* engine)
  233. {
  234. RegisterUIElement<Text>(engine, "Text");
  235. engine->RegisterObjectMethod("Text", "bool SetFont(const String&in, int)", asMETHODPR(Text, SetFont, (const String&, int), bool), asCALL_THISCALL);
  236. engine->RegisterObjectMethod("Text", "bool SetFont(Font@+, int)", asMETHODPR(Text, SetFont, (Font*, int), bool), asCALL_THISCALL);
  237. engine->RegisterObjectMethod("Text", "void SetSelection(uint, uint)", asMETHOD(Text, SetSelection), asCALL_THISCALL);
  238. engine->RegisterObjectMethod("Text", "void ClearSelection()", asMETHOD(Text, ClearSelection), asCALL_THISCALL);
  239. engine->RegisterObjectMethod("Text", "Font@+ get_font() const", asMETHOD(Text, GetFont), asCALL_THISCALL);
  240. engine->RegisterObjectMethod("Text", "int get_fontSize() const", asMETHOD(Text, GetFontSize), asCALL_THISCALL);
  241. engine->RegisterObjectMethod("Text", "int get_maxWidth() const", asMETHOD(Text, GetMaxWidth), asCALL_THISCALL);
  242. engine->RegisterObjectMethod("Text", "void set_text(const String&in)", asMETHOD(Text, SetText), asCALL_THISCALL);
  243. engine->RegisterObjectMethod("Text", "const String& get_text() const", asMETHOD(Text, GetText), asCALL_THISCALL);
  244. engine->RegisterObjectMethod("Text", "void set_textAlignment(HorizontalAlignment)", asMETHOD(Text, SetTextAlignment), asCALL_THISCALL);
  245. engine->RegisterObjectMethod("Text", "HorizontalAlignment get_textAlignment() const", asMETHOD(Text, GetTextAlignment), asCALL_THISCALL);
  246. engine->RegisterObjectMethod("Text", "void set_rowSpacing(float)", asMETHOD(Text, SetRowSpacing), asCALL_THISCALL);
  247. engine->RegisterObjectMethod("Text", "float get_rowSpacing() const", asMETHOD(Text, GetRowSpacing), asCALL_THISCALL);
  248. engine->RegisterObjectMethod("Text", "void set_wordwrap(bool)", asMETHOD(Text, SetWordwrap), asCALL_THISCALL);
  249. engine->RegisterObjectMethod("Text", "bool get_wordwrap() const", asMETHOD(Text, GetWordwrap), asCALL_THISCALL);
  250. engine->RegisterObjectMethod("Text", "uint get_selectionStart() const", asMETHOD(Text, GetSelectionStart), asCALL_THISCALL);
  251. engine->RegisterObjectMethod("Text", "uint get_selectionLength() const", asMETHOD(Text, GetSelectionLength), asCALL_THISCALL);
  252. engine->RegisterObjectMethod("Text", "void set_selectionColor(const Color&in)", asMETHOD(Text, SetSelectionColor), asCALL_THISCALL);
  253. engine->RegisterObjectMethod("Text", "const Color& get_selectionColor() const", asMETHOD(Text, GetSelectionColor), asCALL_THISCALL);
  254. engine->RegisterObjectMethod("Text", "void set_hoverColor(const Color&in)", asMETHOD(Text, SetHoverColor), asCALL_THISCALL);
  255. engine->RegisterObjectMethod("Text", "const Color& get_hoverColor() const", asMETHOD(Text, GetHoverColor), asCALL_THISCALL);
  256. engine->RegisterObjectMethod("Text", "uint get_numRows() const", asMETHOD(Text, GetNumRows), asCALL_THISCALL);
  257. engine->RegisterObjectMethod("Text", "int get_rowHeight() const", asMETHOD(Text, GetRowHeight), asCALL_THISCALL);
  258. }
  259. static void RegisterLineEdit(asIScriptEngine* engine)
  260. {
  261. RegisterBorderImage<LineEdit>(engine, "LineEdit");
  262. engine->RegisterObjectMethod("LineEdit", "void set_text(const String&in)", asMETHOD(LineEdit, SetText), asCALL_THISCALL);
  263. engine->RegisterObjectMethod("LineEdit", "const String& get_text() const", asMETHOD(LineEdit, GetText), asCALL_THISCALL);
  264. engine->RegisterObjectMethod("LineEdit", "void set_cursorPosition(uint)", asMETHOD(LineEdit, SetCursorPosition), asCALL_THISCALL);
  265. engine->RegisterObjectMethod("LineEdit", "uint get_cursorPosition() const", asMETHOD(LineEdit, GetCursorPosition), asCALL_THISCALL);
  266. engine->RegisterObjectMethod("LineEdit", "void set_cursorBlinkRate(float)", asMETHOD(LineEdit, SetCursorBlinkRate), asCALL_THISCALL);
  267. engine->RegisterObjectMethod("LineEdit", "float get_cursorBlinkRate() const", asMETHOD(LineEdit, GetCursorBlinkRate), asCALL_THISCALL);
  268. engine->RegisterObjectMethod("LineEdit", "void set_maxLength(uint)", asMETHOD(LineEdit, SetMaxLength), asCALL_THISCALL);
  269. engine->RegisterObjectMethod("LineEdit", "uint get_maxLength() const", asMETHOD(LineEdit, GetMaxLength), asCALL_THISCALL);
  270. engine->RegisterObjectMethod("LineEdit", "void set_echoCharacter(uint8)", asMETHOD(LineEdit, SetEchoCharacter), asCALL_THISCALL);
  271. engine->RegisterObjectMethod("LineEdit", "uint8 get_echoCharacter() const", asMETHOD(LineEdit, GetEchoCharacter), asCALL_THISCALL);
  272. engine->RegisterObjectMethod("LineEdit", "void set_cursorMovable(bool)", asMETHOD(LineEdit, SetCursorMovable), asCALL_THISCALL);
  273. engine->RegisterObjectMethod("LineEdit", "bool get_cursorMovable() const", asMETHOD(LineEdit, IsCursorMovable), asCALL_THISCALL);
  274. engine->RegisterObjectMethod("LineEdit", "void set_textSelectable(bool)", asMETHOD(LineEdit, SetTextSelectable), asCALL_THISCALL);
  275. engine->RegisterObjectMethod("LineEdit", "bool get_textSelectable() const", asMETHOD(LineEdit, IsTextSelectable), asCALL_THISCALL);
  276. engine->RegisterObjectMethod("LineEdit", "void set_textCopyable(bool)", asMETHOD(LineEdit, SetTextCopyable), asCALL_THISCALL);
  277. engine->RegisterObjectMethod("LineEdit", "bool get_textCopyable() const", asMETHOD(LineEdit, IsTextCopyable), asCALL_THISCALL);
  278. engine->RegisterObjectMethod("LineEdit", "Text@+ get_textElement() const", asMETHOD(LineEdit, GetTextElement), asCALL_THISCALL);
  279. engine->RegisterObjectMethod("LineEdit", "BorderImage@+ get_cursor() const", asMETHOD(LineEdit, GetCursor), asCALL_THISCALL);
  280. }
  281. static void RegisterMenu(asIScriptEngine* engine)
  282. {
  283. RegisterButton<Menu>(engine, "Menu");
  284. engine->RegisterObjectMethod("Menu", "void SetPopupOffset(int, int)", asMETHODPR(Menu, SetPopupOffset, (int, int), void), asCALL_THISCALL);
  285. engine->RegisterObjectMethod("Menu", "void SetAccelerator(int, int)", asMETHOD(Menu, SetAccelerator), asCALL_THISCALL);
  286. engine->RegisterObjectMethod("Menu", "void set_popup(UIElement@+)", asMETHOD(Menu, SetPopup), asCALL_THISCALL);
  287. engine->RegisterObjectMethod("Menu", "UIElement@+ get_popup() const", asMETHOD(Menu, GetPopup), asCALL_THISCALL);
  288. engine->RegisterObjectMethod("Menu", "void set_popupOffset(const IntVector2&in)", asMETHODPR(Menu, SetPopupOffset, (const IntVector2&), void), asCALL_THISCALL);
  289. engine->RegisterObjectMethod("Menu", "const IntVector2& get_popupOffset() const", asMETHOD(Menu, GetPopupOffset), asCALL_THISCALL);
  290. engine->RegisterObjectMethod("Menu", "void set_showPopup(bool)", asMETHOD(Menu, ShowPopup), asCALL_THISCALL);
  291. engine->RegisterObjectMethod("Menu", "bool get_showPopup() const", asMETHOD(Menu, GetShowPopup), asCALL_THISCALL);
  292. engine->RegisterObjectMethod("Menu", "int get_acceleratorKey() const", asMETHOD(Menu, GetAcceleratorKey), asCALL_THISCALL);
  293. engine->RegisterObjectMethod("Menu", "int get_acceleratorQualifiers() const", asMETHOD(Menu, GetAcceleratorQualifiers), asCALL_THISCALL);
  294. }
  295. static CScriptArray* DropDownListGetItems(DropDownList* ptr)
  296. {
  297. PODVector<UIElement*> result = ptr->GetItems();
  298. return VectorToHandleArray<UIElement>(result, "Array<UIElement@>");
  299. }
  300. static void RegisterDropDownList(asIScriptEngine* engine)
  301. {
  302. RegisterButton<DropDownList>(engine, "DropDownList");
  303. engine->RegisterObjectMethod("DropDownList", "void SetAccelerator(int, int)", asMETHOD(DropDownList, SetAccelerator), asCALL_THISCALL);
  304. engine->RegisterObjectMethod("DropDownList", "void AddItem(UIElement@+)", asMETHOD(DropDownList, AddItem), asCALL_THISCALL);
  305. engine->RegisterObjectMethod("DropDownList", "void InsertItem(uint, UIElement@+)", asMETHOD(DropDownList, InsertItem), asCALL_THISCALL);
  306. engine->RegisterObjectMethod("DropDownList", "void RemoveItem(UIElement@+)", asMETHODPR(DropDownList, RemoveItem, (UIElement*), void), asCALL_THISCALL);
  307. engine->RegisterObjectMethod("DropDownList", "void RemoveItem(uint)", asMETHODPR(DropDownList, RemoveItem, (unsigned), void), asCALL_THISCALL);
  308. engine->RegisterObjectMethod("DropDownList", "void RemoveAllItems()", asMETHOD(DropDownList, RemoveAllItems), asCALL_THISCALL);
  309. engine->RegisterObjectMethod("DropDownList", "Array<UIElement@>@ GetItems() const", asFUNCTION(DropDownListGetItems), asCALL_CDECL_OBJLAST);
  310. engine->RegisterObjectMethod("DropDownList", "void set_showPopup(bool)", asMETHOD(DropDownList, ShowPopup), asCALL_THISCALL);
  311. engine->RegisterObjectMethod("DropDownList", "bool get_showPopup() const", asMETHOD(DropDownList, GetShowPopup), asCALL_THISCALL);
  312. engine->RegisterObjectMethod("DropDownList", "void set_selection(uint)", asMETHOD(DropDownList, SetSelection), asCALL_THISCALL);
  313. engine->RegisterObjectMethod("DropDownList", "uint get_selection() const", asMETHOD(DropDownList, GetSelection), asCALL_THISCALL);
  314. engine->RegisterObjectMethod("DropDownList", "void set_resizePopup(bool)", asMETHOD(DropDownList, SetResizePopup), asCALL_THISCALL);
  315. engine->RegisterObjectMethod("DropDownList", "bool get_resizePopup() const", asMETHOD(DropDownList, GetResizePopup), asCALL_THISCALL);
  316. engine->RegisterObjectMethod("DropDownList", "UIElement@+ getPopup() const", asMETHOD(DropDownList, GetPopup), asCALL_THISCALL);
  317. engine->RegisterObjectMethod("DropDownList", "int get_acceleratorKey() const", asMETHOD(DropDownList, GetAcceleratorKey), asCALL_THISCALL);
  318. engine->RegisterObjectMethod("DropDownList", "int get_acceleratorQualifiers() const", asMETHOD(DropDownList, GetAcceleratorQualifiers), asCALL_THISCALL);
  319. engine->RegisterObjectMethod("DropDownList", "uint get_numItems() const", asMETHOD(DropDownList, GetSelection), asCALL_THISCALL);
  320. engine->RegisterObjectMethod("DropDownList", "UIElement@+ get_items(uint) const", asMETHOD(DropDownList, GetItem), asCALL_THISCALL);
  321. engine->RegisterObjectMethod("DropDownList", "UIElement@+ get_selectedItem() const", asMETHOD(DropDownList, GetSelectedItem), asCALL_THISCALL);
  322. engine->RegisterObjectMethod("DropDownList", "ListView@+ get_listView() const", asMETHOD(DropDownList, GetListView), asCALL_THISCALL);
  323. engine->RegisterObjectMethod("DropDownList", "UIElement@+ get_placeholder() const", asMETHOD(DropDownList, GetPlaceholder), asCALL_THISCALL);
  324. }
  325. static void RegisterWindow(asIScriptEngine* engine)
  326. {
  327. RegisterBorderImage<Window>(engine, "Window");
  328. engine->RegisterObjectMethod("Window", "void set_movable(bool)", asMETHOD(Window, SetMovable), asCALL_THISCALL);
  329. engine->RegisterObjectMethod("Window", "bool get_movable() const", asMETHOD(Window, IsMovable), asCALL_THISCALL);
  330. engine->RegisterObjectMethod("Window", "void set_resizable(bool)", asMETHOD(Window, SetResizable), asCALL_THISCALL);
  331. engine->RegisterObjectMethod("Window", "bool get_resizable() const", asMETHOD(Window, IsResizable), asCALL_THISCALL);
  332. engine->RegisterObjectMethod("Window", "void set_resizeBorder(const IntRect&in)", asMETHODPR(Window, SetResizeBorder, (const IntRect&), void), asCALL_THISCALL);
  333. engine->RegisterObjectMethod("Window", "const IntRect& get_resizeBorder() const", asMETHOD(Window, GetResizeBorder), asCALL_THISCALL);
  334. }
  335. static void FileSelectorSetFilters(CScriptArray* filters, unsigned defaultIndex, FileSelector* ptr)
  336. {
  337. if (!filters)
  338. return;
  339. unsigned numFilters = filters->GetSize();
  340. Vector<String> destFilters(numFilters);
  341. for (unsigned i = 0; i < numFilters; ++i)
  342. destFilters[i] = *(static_cast<String*>(filters->At(i)));
  343. ptr->SetFilters(destFilters, defaultIndex);
  344. }
  345. static void RegisterFileSelector(asIScriptEngine* engine)
  346. {
  347. RegisterObject<FileSelector>(engine, "FileSelector");
  348. RegisterObjectConstructor<FileSelector>(engine, "FileSelector");
  349. engine->RegisterObjectMethod("FileSelector", "void SetTitle(const String&in)", asMETHOD(FileSelector, SetTitle), asCALL_THISCALL);
  350. engine->RegisterObjectMethod("FileSelector", "void SetButtonTexts(const String&in, const String&in)", asMETHOD(FileSelector, SetButtonTexts), asCALL_THISCALL);
  351. engine->RegisterObjectMethod("FileSelector", "void SetFilters(Array<String>@+, uint)", asFUNCTION(FileSelectorSetFilters), asCALL_CDECL_OBJLAST);
  352. engine->RegisterObjectMethod("FileSelector", "void UpdateElements()", asMETHOD(FileSelector, UpdateElements), asCALL_THISCALL);
  353. engine->RegisterObjectMethod("FileSelector", "void set_path(const String&in)", asMETHOD(FileSelector, SetPath), asCALL_THISCALL);
  354. engine->RegisterObjectMethod("FileSelector", "const String& get_path() const", asMETHOD(FileSelector, GetPath), asCALL_THISCALL);
  355. engine->RegisterObjectMethod("FileSelector", "void set_fileName(const String&in)", asMETHOD(FileSelector, SetFileName), asCALL_THISCALL);
  356. engine->RegisterObjectMethod("FileSelector", "const String& get_fileName() const", asMETHOD(FileSelector, GetFileName), asCALL_THISCALL);
  357. engine->RegisterObjectMethod("FileSelector", "void set_directoryMode(bool)", asMETHOD(FileSelector, SetDirectoryMode), asCALL_THISCALL);
  358. engine->RegisterObjectMethod("FileSelector", "bool get_directoryMode() const", asMETHOD(FileSelector, GetDirectoryMode), asCALL_THISCALL);
  359. engine->RegisterObjectMethod("FileSelector", "const String& get_filter() const", asMETHOD(FileSelector, GetFilter), asCALL_THISCALL);
  360. engine->RegisterObjectMethod("FileSelector", "uint get_filterIndex() const", asMETHOD(FileSelector, GetFilterIndex), asCALL_THISCALL);
  361. engine->RegisterObjectMethod("FileSelector", "void set_style(XMLFile@+)", asMETHOD(FileSelector, SetStyle), asCALL_THISCALL);
  362. engine->RegisterObjectMethod("FileSelector", "XMLFile@+ get_style() const", asMETHOD(FileSelector, GetStyle), asCALL_THISCALL);
  363. engine->RegisterObjectMethod("FileSelector", "Window@+ get_window() const", asMETHOD(FileSelector, GetWindow), asCALL_THISCALL);
  364. engine->RegisterObjectMethod("FileSelector", "Text@+ get_titleText() const", asMETHOD(FileSelector, GetTitleText), asCALL_THISCALL);
  365. engine->RegisterObjectMethod("FileSelector", "ListView@+ get_fileList() const", asMETHOD(FileSelector, GetFileList), asCALL_THISCALL);
  366. engine->RegisterObjectMethod("FileSelector", "LineEdit@+ get_pathEdit() const", asMETHOD(FileSelector, GetPathEdit), asCALL_THISCALL);
  367. engine->RegisterObjectMethod("FileSelector", "LineEdit@+ get_fileNameEdit() const", asMETHOD(FileSelector, GetFileNameEdit), asCALL_THISCALL);
  368. engine->RegisterObjectMethod("FileSelector", "DropDownList@+ get_filterList() const", asMETHOD(FileSelector, GetFilterList), asCALL_THISCALL);
  369. engine->RegisterObjectMethod("FileSelector", "Button@+ get_okButton() const", asMETHOD(FileSelector, GetOKButton), asCALL_THISCALL);
  370. engine->RegisterObjectMethod("FileSelector", "Button@+ get_cancelButton() const", asMETHOD(FileSelector, GetCancelButton), asCALL_THISCALL);
  371. }
  372. static UI* GetUI()
  373. {
  374. return GetScriptContext()->GetSubsystem<UI>();
  375. }
  376. static UIElement* UILoadLayout(XMLFile* file, UI* ptr)
  377. {
  378. SharedPtr<UIElement> root = ptr->LoadLayout(file);
  379. if (root)
  380. root->AddRef();
  381. return root.Ptr();
  382. }
  383. static UIElement* UILoadLayoutWithStyle(XMLFile* file, XMLFile* styleFile, UI* ptr)
  384. {
  385. SharedPtr<UIElement> root = ptr->LoadLayout(file, styleFile);
  386. if (root)
  387. root->AddRef();
  388. return root.Ptr();
  389. }
  390. static void RegisterUI(asIScriptEngine* engine)
  391. {
  392. RegisterObject<UI>(engine, "UI");
  393. engine->RegisterObjectMethod("UI", "void Clear()", asMETHOD(UI, Clear), asCALL_THISCALL);
  394. engine->RegisterObjectMethod("UI", "UIElement@ LoadLayout(XMLFile@+)", asFUNCTION(UILoadLayout), asCALL_CDECL_OBJLAST);
  395. engine->RegisterObjectMethod("UI", "UIElement@ LoadLayout(XMLFile@+, XMLFile@+)", asFUNCTION(UILoadLayoutWithStyle), asCALL_CDECL_OBJLAST);
  396. engine->RegisterObjectMethod("UI", "UIElement@+ GetElementAt(const IntVector2&in, bool)", asMETHODPR(UI, GetElementAt, (const IntVector2&, bool), UIElement*), asCALL_THISCALL);
  397. engine->RegisterObjectMethod("UI", "UIElement@+ GetElementAt(int, int, bool)", asMETHODPR(UI, GetElementAt, (int, int, bool), UIElement*), asCALL_THISCALL);
  398. engine->RegisterObjectMethod("UI", "void set_cursor(Cursor@+)", asMETHOD(UI, SetCursor), asCALL_THISCALL);
  399. engine->RegisterObjectMethod("UI", "Cursor@+ get_cursor() const", asMETHOD(UI, GetCursor), asCALL_THISCALL);
  400. engine->RegisterObjectMethod("UI", "IntVector2 get_cursorPosition()", asMETHOD(UI, GetCursorPosition), asCALL_THISCALL);
  401. engine->RegisterObjectMethod("UI", "void set_focusElement(UIElement@+)", asMETHOD(UI, SetFocusElement), asCALL_THISCALL);
  402. engine->RegisterObjectMethod("UI", "UIElement@+ get_focusElement() const", asMETHOD(UI, GetFocusElement), asCALL_THISCALL);
  403. engine->RegisterObjectMethod("UI", "UIElement@+ get_frontElement() const", asMETHOD(UI, GetFrontElement), asCALL_THISCALL);
  404. engine->RegisterObjectMethod("UI", "UIElement@+ get_root() const", asMETHOD(UI, GetRoot), asCALL_THISCALL);
  405. engine->RegisterGlobalFunction("UI@+ get_ui()", asFUNCTION(GetUI), asCALL_CDECL);
  406. }
  407. void RegisterUIAPI(asIScriptEngine* engine)
  408. {
  409. RegisterFont(engine);
  410. RegisterUIElement(engine);
  411. RegisterBorderImage(engine);
  412. RegisterButton(engine);
  413. RegisterCheckBox(engine);
  414. RegisterCursor(engine);
  415. RegisterSlider(engine);
  416. RegisterScrollBar(engine);
  417. RegisterScrollView(engine);
  418. RegisterListView(engine);
  419. RegisterText(engine);
  420. RegisterLineEdit(engine);
  421. RegisterMenu(engine);
  422. RegisterDropDownList(engine);
  423. RegisterWindow(engine);
  424. RegisterFileSelector(engine);
  425. RegisterUI(engine);
  426. }