BsScriptGUIListBox.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/GUI/BsScriptGUIListBox.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoMethod.h"
  8. #include "BsMonoManager.h"
  9. #include "Image/BsSpriteTexture.h"
  10. #include "BsMonoUtil.h"
  11. #include "GUI/BsGUILayout.h"
  12. #include "GUI/BsGUIListBox.h"
  13. #include "GUI/BsGUIOptions.h"
  14. #include "Wrappers/GUI/BsScriptGUIElementStyle.h"
  15. #include "Wrappers/GUI/BsScriptGUILayout.h"
  16. #include "Wrappers/BsScriptHString.h"
  17. using namespace std::placeholders;
  18. namespace bs
  19. {
  20. ScriptGUIListBox::OnSelectionChangedThunkDef ScriptGUIListBox::onSelectionChangedThunk;
  21. ScriptGUIListBox::ScriptGUIListBox(MonoObject* instance, GUIListBox* listBox)
  22. :TScriptGUIElement(instance, listBox)
  23. {
  24. }
  25. void ScriptGUIListBox::initRuntimeData()
  26. {
  27. metaData.scriptClass->addInternalCall("Internal_CreateInstance", (void*)&ScriptGUIListBox::internal_createInstance);
  28. metaData.scriptClass->addInternalCall("Internal_SetElements", (void*)&ScriptGUIListBox::internal_setElements);
  29. metaData.scriptClass->addInternalCall("Internal_SetTint", (void*)&ScriptGUIListBox::internal_setTint);
  30. metaData.scriptClass->addInternalCall("Internal_SelectElement", (void*)&ScriptGUIListBox::internal_selectElement);
  31. metaData.scriptClass->addInternalCall("Internal_DeselectElement", (void*)&ScriptGUIListBox::internal_deselectElement);
  32. metaData.scriptClass->addInternalCall("Internal_GetElementStates", (void*)&ScriptGUIListBox::internal_getElementStates);
  33. metaData.scriptClass->addInternalCall("Internal_SetElementStates", (void*)&ScriptGUIListBox::internal_setElementStates);
  34. onSelectionChangedThunk = (OnSelectionChangedThunkDef)metaData.scriptClass->getMethod("DoOnSelectionChanged", 1)->getThunk();
  35. }
  36. void ScriptGUIListBox::internal_createInstance(MonoObject* instance, MonoArray* elements, bool multiselect,
  37. MonoString* style, MonoArray* guiOptions)
  38. {
  39. GUIOptions options;
  40. ScriptArray scriptArray(guiOptions);
  41. UINT32 arrayLen = scriptArray.size();
  42. for (UINT32 i = 0; i < arrayLen; i++)
  43. options.addOption(scriptArray.get<GUIOption>(i));
  44. ScriptArray elemsArray(elements);
  45. UINT32 elementsArrayLen = elemsArray.size();
  46. Vector<HString> nativeElements;
  47. for(UINT32 i = 0; i < elementsArrayLen; i++)
  48. {
  49. MonoObject* stringManaged = elemsArray.get<MonoObject*>(i);
  50. if(stringManaged == nullptr)
  51. nativeElements.push_back(HString::dummy());
  52. else
  53. {
  54. ScriptHString* textScript = ScriptHString::toNative(stringManaged);
  55. nativeElements.push_back(textScript->getInternalValue());
  56. }
  57. }
  58. GUIListBox* guiListBox = GUIListBox::create(nativeElements, multiselect, options, MonoUtil::monoToString(style));
  59. auto nativeInstance = new (bs_alloc<ScriptGUIListBox>()) ScriptGUIListBox(instance, guiListBox);
  60. guiListBox->onSelectionToggled.connect(std::bind(&ScriptGUIListBox::onSelectionChanged, nativeInstance, _1, _2));
  61. }
  62. void ScriptGUIListBox::internal_setElements(ScriptGUIListBox* nativeInstance, MonoArray* elements)
  63. {
  64. ScriptArray elemsArray(elements);
  65. UINT32 elementsArrayLen = elemsArray.size();
  66. Vector<HString> nativeElements;
  67. for(UINT32 i = 0; i < elementsArrayLen; i++)
  68. {
  69. MonoObject* stringManaged = elemsArray.get<MonoObject*>(i);
  70. if(stringManaged == nullptr)
  71. nativeElements.push_back(HString::dummy());
  72. else
  73. {
  74. ScriptHString* textScript = ScriptHString::toNative(stringManaged);
  75. nativeElements.push_back(textScript->getInternalValue());
  76. }
  77. }
  78. GUIListBox* listBox = (GUIListBox*)nativeInstance->getGUIElement();
  79. listBox->setElements(nativeElements);
  80. }
  81. void ScriptGUIListBox::internal_setTint(ScriptGUIListBox* nativeInstance, Color* color)
  82. {
  83. GUIListBox* listBox = (GUIListBox*)nativeInstance->getGUIElement();
  84. listBox->setTint(*color);
  85. }
  86. void ScriptGUIListBox::internal_selectElement(ScriptGUIListBox* nativeInstance, int idx)
  87. {
  88. GUIListBox* listBox = (GUIListBox*)nativeInstance->getGUIElement();
  89. listBox->selectElement(idx);
  90. }
  91. void ScriptGUIListBox::internal_deselectElement(ScriptGUIListBox* nativeInstance, int idx)
  92. {
  93. GUIListBox* listBox = (GUIListBox*)nativeInstance->getGUIElement();
  94. listBox->deselectElement(idx);
  95. }
  96. MonoArray* ScriptGUIListBox::internal_getElementStates(ScriptGUIListBox* nativeInstance)
  97. {
  98. GUIListBox* listBox = (GUIListBox*)nativeInstance->getGUIElement();
  99. const Vector<bool>& states = listBox->getElementStates();
  100. UINT32 numElements = (UINT32)states.size();
  101. ScriptArray outStates = ScriptArray::create<bool>(numElements);
  102. for (UINT32 i = 0; i < numElements; i++)
  103. outStates.set(i, (bool)states[i]);
  104. return outStates.getInternal();
  105. }
  106. void ScriptGUIListBox::internal_setElementStates(ScriptGUIListBox* nativeInstance, MonoArray* monoStates)
  107. {
  108. if (monoStates == nullptr)
  109. return;
  110. ScriptArray inStates(monoStates);
  111. UINT32 numElements = inStates.size();
  112. Vector<bool> states(numElements);
  113. for (UINT32 i = 0; i < numElements; i++)
  114. states[i] = inStates.get<bool>(i);
  115. GUIListBox* listBox = (GUIListBox*)nativeInstance->getGUIElement();
  116. listBox->setElementStates(states);
  117. }
  118. void ScriptGUIListBox::onSelectionChanged(UINT32 index, bool enabled)
  119. {
  120. MonoUtil::invokeThunk(onSelectionChangedThunk, getManagedInstance(), index);
  121. }
  122. }