//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #pragma once #include "BsEditorPrerequisites.h" #include "EditorWindow/BsDockManagerLayout.h" #include "Reflection/BsRTTIType.h" namespace bs { /** @cond RTTI */ /** @addtogroup RTTI-Impl-Editor * @{ */ class DockManagerLayoutRTTI : public RTTIType { private: DockManagerLayout::Entry& getRootEntry(DockManagerLayout* obj) { return obj->mRootEntry; } void setRootEntry(DockManagerLayout* obj, DockManagerLayout::Entry& val) { obj->mRootEntry = val; } bool& getIsMaximized(DockManagerLayout* obj) { return obj->mIsMaximized; } void setIsMaximized(DockManagerLayout* obj, bool& val) { obj->mIsMaximized = val; } Vector& getMaximizedWidgetNames(DockManagerLayout* obj) { return obj->mMaximizedWidgetNames; } void setMaximizedWidgetNames(DockManagerLayout* obj, Vector& val) { obj->mMaximizedWidgetNames = val; } public: DockManagerLayoutRTTI() { addPlainField("mRootEntry", 0, &DockManagerLayoutRTTI::getRootEntry, &DockManagerLayoutRTTI::setRootEntry); addPlainField("mIsMaximized", 1, &DockManagerLayoutRTTI::getIsMaximized, &DockManagerLayoutRTTI::setIsMaximized); addPlainField("mMaximizedWidgetNames", 2, &DockManagerLayoutRTTI::getMaximizedWidgetNames, &DockManagerLayoutRTTI::setMaximizedWidgetNames); } void onDeserializationEnded(IReflectable* obj, SerializationContext* context) override { DockManagerLayout* layout = static_cast(obj); Stack todo; todo.push(&layout->mRootEntry); while (!todo.empty()) { DockManagerLayout::Entry* current = todo.top(); todo.pop(); if (!current->isLeaf) { current->children[0]->parent = current; current->children[1]->parent = current; todo.push(current->children[0]); todo.push(current->children[1]); } } } const String& getRTTIName() override { static String name = "DockManagerLayout"; return name; } UINT32 getRTTIId() override { return TID_DockManagerLayout; } SPtr newRTTIObject() override { return bs_shared_ptr_new(); } }; template<> struct RTTIPlainType { enum { id = bs::TID_DockManagerLayoutEntry }; enum { hasDynamicSize = 1 }; static void toMemory(const bs::DockManagerLayout::Entry& data, char* memory) { UINT32 size = 0; char* memoryStart = memory; memory += sizeof(UINT32); size += sizeof(UINT32); memory = rttiWriteElem(data.isLeaf, memory, size); memory = rttiWriteElem(data.horizontalSplit, memory, size); memory = rttiWriteElem(data.splitPosition, memory, size); memory = rttiWriteElem(data.widgetNames, memory, size); if(!data.isLeaf) { memory = rttiWriteElem(*data.children[0], memory, size); memory = rttiWriteElem(*data.children[1], memory, size); } memcpy(memoryStart, &size, sizeof(UINT32)); } static UINT32 fromMemory(bs::DockManagerLayout::Entry& data, char* memory) { UINT32 size = 0; memcpy(&size, memory, sizeof(UINT32)); memory += sizeof(UINT32); memory = rttiReadElem(data.isLeaf, memory); memory = rttiReadElem(data.horizontalSplit, memory); memory = rttiReadElem(data.splitPosition, memory); memory = rttiReadElem(data.widgetNames, memory); if(!data.isLeaf) { data.children[0] = bs_new(); data.children[1] = bs_new(); memory = rttiReadElem(*data.children[0], memory); memory = rttiReadElem(*data.children[1], memory); data.children[0]->parent = &data; data.children[1]->parent = &data; } return size; } static UINT32 getDynamicSize(const bs::DockManagerLayout::Entry& data) { UINT64 dataSize = sizeof(UINT32) + rttiGetElemSize(data.isLeaf) + rttiGetElemSize(data.horizontalSplit) + rttiGetElemSize(data.splitPosition) + rttiGetElemSize(data.widgetNames); if(!data.isLeaf) { dataSize += rttiGetElemSize(*data.children[0]); dataSize += rttiGetElemSize(*data.children[1]); } #if BS_DEBUG_MODE if(dataSize > std::numeric_limits::max()) { __string_throwDataOverflowException(); } #endif return (UINT32)dataSize; } }; /** @} */ /** @endcond */ }