BsGUISkinRTTI.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsPrerequisites.h"
  5. #include "BsRTTIType.h"
  6. #include "BsGUISkin.h"
  7. namespace BansheeEngine
  8. {
  9. /** @cond RTTI */
  10. /** @addtogroup RTTI-Impl-Engine
  11. * @{
  12. */
  13. class BS_EXPORT GUISkinEntry : public IReflectable
  14. {
  15. public:
  16. GUISkinEntry() { }
  17. GUISkinEntry(const String& name, const GUIElementStyle& style);
  18. String name;
  19. GUIElementStyle style;
  20. public:
  21. friend class GUISkinEntryRTTI;
  22. static RTTITypeBase* getRTTIStatic();
  23. RTTITypeBase* getRTTI() const override;
  24. };
  25. class BS_EXPORT GUISkinEntryRTTI : public RTTIType <GUISkinEntry, IReflectable, GUISkinEntryRTTI>
  26. {
  27. private:
  28. String& getName(GUISkinEntry* obj) { return obj->name; }
  29. void setName(GUISkinEntry* obj, String& val) { obj->name = val; }
  30. GUIElementStyle& getStyle(GUISkinEntry* obj) { return obj->style; }
  31. void setStyle(GUISkinEntry* obj, GUIElementStyle& val) { obj->style = val; }
  32. public:
  33. GUISkinEntryRTTI()
  34. {
  35. addPlainField("name", 0, &GUISkinEntryRTTI::getName, &GUISkinEntryRTTI::setName);
  36. addReflectableField("style", 1, &GUISkinEntryRTTI::getStyle, &GUISkinEntryRTTI::setStyle);
  37. }
  38. const String& getRTTIName() override
  39. {
  40. static String name = "GUISkinEntry";
  41. return name;
  42. }
  43. UINT32 getRTTIId() override
  44. {
  45. return TID_GUISkinEntry;
  46. }
  47. SPtr<IReflectable> newRTTIObject() override
  48. {
  49. return bs_shared_ptr_new<GUISkinEntry>();
  50. }
  51. };
  52. class BS_EXPORT GUISkinRTTI : public RTTIType <GUISkin, Resource, GUISkinRTTI>
  53. {
  54. private:
  55. GUISkinEntry& getStyle(GUISkin* obj, UINT32 idx)
  56. {
  57. Vector<GUISkinEntry>& entries = any_cast_ref<Vector<GUISkinEntry>>(obj->mRTTIData);
  58. return entries[idx];
  59. }
  60. void setStyle(GUISkin* obj, UINT32 idx, GUISkinEntry& val) { obj->mStyles[val.name] = val.style; }
  61. UINT32 getStyleArraySize(GUISkin* obj) { return (UINT32)obj->mStyles.size(); }
  62. void setStyleArraySize(GUISkin* obj, UINT32 size) { /* Do nothing */ }
  63. public:
  64. GUISkinRTTI()
  65. {
  66. addReflectableArrayField("mStyles", 0, &GUISkinRTTI::getStyle, &GUISkinRTTI::getStyleArraySize,
  67. &GUISkinRTTI::setStyle, &GUISkinRTTI::setStyleArraySize);
  68. }
  69. void onSerializationStarted(IReflectable* obj) override
  70. {
  71. GUISkin* skin = static_cast<GUISkin*>(obj);
  72. Vector<GUISkinEntry> entries;
  73. for (auto& style : skin->mStyles)
  74. {
  75. entries.push_back(GUISkinEntry(style.first, style.second));
  76. }
  77. skin->mRTTIData = entries;
  78. }
  79. void onSerializationEnded(IReflectable* obj) override
  80. {
  81. GUISkin* skin = static_cast<GUISkin*>(obj);
  82. skin->mRTTIData = nullptr;
  83. }
  84. const String& getRTTIName() override
  85. {
  86. static String name = "GUISkin";
  87. return name;
  88. }
  89. UINT32 getRTTIId() override
  90. {
  91. return TID_GUISkin;
  92. }
  93. SPtr<IReflectable> newRTTIObject() override
  94. {
  95. return GUISkin::_createPtr();
  96. }
  97. };
  98. /** @} */
  99. /** @endcond */
  100. }