1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
3 | #pragma once |
4 | |
5 | #include "BsPrerequisites.h" |
6 | #include "Reflection/BsRTTIType.h" |
7 | #include "GUI/BsGUISkin.h" |
8 | |
9 | namespace bs |
10 | { |
11 | /** @cond RTTI */ |
12 | /** @addtogroup RTTI-Impl-Engine |
13 | * @{ |
14 | */ |
15 | |
16 | class BS_EXPORT GUISkinEntry : public IReflectable |
17 | { |
18 | public: |
19 | GUISkinEntry() = default; |
20 | GUISkinEntry(const String& name, const GUIElementStyle& style); |
21 | |
22 | String name; |
23 | GUIElementStyle style; |
24 | |
25 | public: |
26 | friend class GUISkinEntryRTTI; |
27 | static RTTITypeBase* getRTTIStatic(); |
28 | RTTITypeBase* getRTTI() const override; |
29 | }; |
30 | |
31 | class BS_EXPORT GUISkinEntryRTTI : public RTTIType <GUISkinEntry, IReflectable, GUISkinEntryRTTI> |
32 | { |
33 | private: |
34 | String& getName(GUISkinEntry* obj) { return obj->name; } |
35 | void setName(GUISkinEntry* obj, String& val) { obj->name = val; } |
36 | |
37 | GUIElementStyle& getStyle(GUISkinEntry* obj) { return obj->style; } |
38 | void setStyle(GUISkinEntry* obj, GUIElementStyle& val) { obj->style = val; } |
39 | |
40 | public: |
41 | GUISkinEntryRTTI() |
42 | { |
43 | addPlainField("name" , 0, &GUISkinEntryRTTI::getName, &GUISkinEntryRTTI::setName); |
44 | addReflectableField("style" , 1, &GUISkinEntryRTTI::getStyle, &GUISkinEntryRTTI::setStyle); |
45 | } |
46 | |
47 | const String& getRTTIName() override |
48 | { |
49 | static String name = "GUISkinEntry" ; |
50 | return name; |
51 | } |
52 | |
53 | UINT32 getRTTIId() override |
54 | { |
55 | return TID_GUISkinEntry; |
56 | } |
57 | |
58 | SPtr<IReflectable> newRTTIObject() override |
59 | { |
60 | return bs_shared_ptr_new<GUISkinEntry>(); |
61 | } |
62 | }; |
63 | |
64 | class BS_EXPORT GUISkinRTTI : public RTTIType <GUISkin, Resource, GUISkinRTTI> |
65 | { |
66 | private: |
67 | GUISkinEntry& getStyle(GUISkin* obj, UINT32 idx) |
68 | { |
69 | return mStyles[idx]; |
70 | } |
71 | |
72 | void setStyle(GUISkin* obj, UINT32 idx, GUISkinEntry& val) { obj->mStyles[val.name] = val.style; } |
73 | UINT32 getStyleArraySize(GUISkin* obj) { return (UINT32)obj->mStyles.size(); } |
74 | void setStyleArraySize(GUISkin* obj, UINT32 size) { /* Do nothing */ } |
75 | |
76 | public: |
77 | GUISkinRTTI() |
78 | { |
79 | addReflectableArrayField("mStyles" , 0, &GUISkinRTTI::getStyle, &GUISkinRTTI::getStyleArraySize, |
80 | &GUISkinRTTI::setStyle, &GUISkinRTTI::setStyleArraySize); |
81 | } |
82 | |
83 | void onSerializationStarted(IReflectable* obj, SerializationContext* context) override |
84 | { |
85 | GUISkin* skin = static_cast<GUISkin*>(obj); |
86 | |
87 | for (auto& style : skin->mStyles) |
88 | mStyles.push_back(GUISkinEntry(style.first, style.second)); |
89 | } |
90 | |
91 | const String& getRTTIName() override |
92 | { |
93 | static String name = "GUISkin" ; |
94 | return name; |
95 | } |
96 | |
97 | UINT32 getRTTIId() override |
98 | { |
99 | return TID_GUISkin; |
100 | } |
101 | |
102 | SPtr<IReflectable> newRTTIObject() override |
103 | { |
104 | return GUISkin::_createPtr(); |
105 | } |
106 | |
107 | private: |
108 | Vector<GUISkinEntry> mStyles; |
109 | }; |
110 | |
111 | /** @} */ |
112 | /** @endcond */ |
113 | } |