BsScriptGUIElement.h 2.5 KB

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