BsScriptGUIArea.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "BsScriptGUIArea.h"
  2. #include "BsScriptMeta.h"
  3. #include "BsMonoField.h"
  4. #include "BsMonoClass.h"
  5. #include "BsMonoManager.h"
  6. #include "BsScriptGUIArea.h"
  7. #include "BsGUIArea.h"
  8. #include "BsGUILayout.h"
  9. #include "BsScriptGUIPanel.h"
  10. using namespace CamelotFramework;
  11. namespace BansheeEngine
  12. {
  13. ScriptGUIArea::ScriptGUIArea(GUIArea* area, ScriptGUIPanel* parentGUI)
  14. :mGUIArea(area), mParentPanel(parentGUI), mIsDestroyed(false)
  15. {
  16. mParentPanel->registerArea(this);
  17. }
  18. void ScriptGUIArea::initMetaData()
  19. {
  20. metaData = ScriptMeta(BansheeEngineAssemblyName, "BansheeEngine", "GUIArea", &ScriptGUIArea::initRuntimeData);
  21. MonoManager::registerScriptType(&metaData);
  22. }
  23. void ScriptGUIArea::initRuntimeData()
  24. {
  25. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptGUIArea::internal_createInstance);
  26. metaData.scriptClass->addInternalCall("Internal_SetArea", &ScriptGUIArea::internal_setArea);
  27. metaData.scriptClass->addInternalCall("Internal_DestroyInstance", &ScriptGUIArea::internal_destroyInstance);
  28. metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptGUIArea::internal_destroy);
  29. metaData.scriptClass->addInternalCall("Internal_SetVisible", &ScriptGUIArea::internal_setVisible);
  30. }
  31. void ScriptGUIArea::destroy()
  32. {
  33. if(!mIsDestroyed)
  34. {
  35. mParentPanel->unregisterArea(this);
  36. GUIArea::destroy(mGUIArea);
  37. mGUIArea = nullptr;
  38. mIsDestroyed = true;
  39. }
  40. }
  41. void ScriptGUIArea::internal_createInstance(MonoObject* instance, MonoObject* panel, CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height, CM::UINT16 depth)
  42. {
  43. ScriptGUIPanel* scriptGUIPanel = ScriptGUIPanel::toNative(panel);
  44. GUIArea* nativeArea = GUIArea::create(scriptGUIPanel->getWidget(), x, y, width, height, depth);
  45. ScriptGUIArea* nativeInstance = new (cm_alloc<ScriptGUIArea>()) ScriptGUIArea(nativeArea, scriptGUIPanel);
  46. nativeInstance->createInstance(instance);
  47. metaData.thisPtrField->setValue(instance, &nativeInstance);
  48. }
  49. void ScriptGUIArea::internal_destroyInstance(ScriptGUIArea* thisPtr)
  50. {
  51. thisPtr->destroy();
  52. cm_delete(thisPtr);
  53. }
  54. void ScriptGUIArea::internal_destroy(ScriptGUIArea* thisPtr)
  55. {
  56. thisPtr->destroy();
  57. }
  58. void ScriptGUIArea::internal_setVisible(ScriptGUIArea* thisPtr, bool visible)
  59. {
  60. if(visible)
  61. thisPtr->mGUIArea->enable();
  62. else
  63. thisPtr->mGUIArea->disable();
  64. }
  65. void ScriptGUIArea::internal_setArea(ScriptGUIArea* thisPtr, CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height, CM::UINT16 depth)
  66. {
  67. thisPtr->mArea.x = x;
  68. thisPtr->mArea.y = y;
  69. thisPtr->mArea.width = width;
  70. thisPtr->mArea.height = height;
  71. thisPtr->updateArea();
  72. }
  73. void ScriptGUIArea::updateArea()
  74. {
  75. RectI parentArea = mParentPanel->getClippedArea();
  76. RectI myClippedArea = mArea;
  77. myClippedArea.clip(parentArea);
  78. mGUIArea->setPosition(myClippedArea.x, myClippedArea.y);
  79. mGUIArea->setSize(myClippedArea.width, myClippedArea.height);
  80. }
  81. }