BsScriptGUIElement.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsScriptObject.h"
  4. #include "BsGUIOptions.h"
  5. namespace BansheeEngine
  6. {
  7. class BS_SCR_BE_EXPORT ScriptGUIElementBaseTBase : public ScriptObjectBase
  8. {
  9. public:
  10. ScriptGUIElementBaseTBase(MonoObject* instance);
  11. virtual ~ScriptGUIElementBaseTBase() {}
  12. GUIElementBase* getGUIElement() const { return (GUIElementBase*)mElement; }
  13. virtual void destroy() = 0;
  14. virtual void setParent(GUILayout* layout) = 0;
  15. virtual void setLayoutOptions(GUIOptions options) { }
  16. protected:
  17. void initialize(GUIElementBase* element);
  18. bool mIsDestroyed;
  19. GUIElementBase* mElement;
  20. };
  21. template <class Type>
  22. class TScriptGUIElementBase : public ScriptObject<Type, ScriptGUIElementBaseTBase>
  23. {
  24. public:
  25. virtual ~TScriptGUIElementBase() {}
  26. protected:
  27. TScriptGUIElementBase(MonoObject* instance, GUIElementBase* element)
  28. :ScriptObject(instance)
  29. {
  30. initialize(element);
  31. }
  32. void _onManagedInstanceDeleted()
  33. {
  34. // Elements with a GUIWidget parent are destroyed automatically when widget is destroyed, but those without one
  35. // we need to destroy manually.
  36. if (getGUIElement()->_getParentWidget() == nullptr)
  37. destroy();
  38. ScriptObject::_onManagedInstanceDeleted();
  39. }
  40. };
  41. class BS_SCR_BE_EXPORT ScriptGUIElementTBase : public ScriptGUIElementBaseTBase
  42. {
  43. public:
  44. ScriptGUIElementTBase(MonoObject* instance);
  45. virtual ~ScriptGUIElementTBase() {}
  46. virtual void destroy();
  47. virtual void setParent(GUILayout* layout);
  48. virtual void setLayoutOptions(GUIOptions options);
  49. };
  50. template <class Type>
  51. class TScriptGUIElement : public ScriptObject<Type, ScriptGUIElementTBase>
  52. {
  53. public:
  54. virtual ~TScriptGUIElement() {}
  55. protected:
  56. TScriptGUIElement(MonoObject* instance, GUIElementBase* element)
  57. :ScriptObject(instance)
  58. {
  59. initialize(element);
  60. }
  61. void _onManagedInstanceDeleted()
  62. {
  63. // Elements with a GUIWidget parent are destroyed automatically when widget is destroyed, but those without one
  64. // we need to destroy manually.
  65. if (getGUIElement()->_getParentWidget() == nullptr)
  66. destroy();
  67. ScriptObject::_onManagedInstanceDeleted();
  68. }
  69. };
  70. class BS_SCR_BE_EXPORT ScriptGUIElement : public ScriptObject<ScriptGUIElement>
  71. {
  72. public:
  73. SCRIPT_OBJ(BansheeEngineAssemblyName, "BansheeEngine", "GUIElement")
  74. private:
  75. static void internal_destroy(ScriptGUIElementBaseTBase* nativeInstance);
  76. static void internal_setVisible(ScriptGUIElementBaseTBase* nativeInstance, bool visible);
  77. static void internal_setParent(ScriptGUIElementBaseTBase* nativeInstance, MonoObject* parentLayout);
  78. static void internal_setLayoutOptions(ScriptGUIElementBaseTBase* nativeInstance, MonoArray* guiOptions);
  79. ScriptGUIElement(MonoObject* instance);
  80. };
  81. }