SPtr<EditorWidgetLayout> EditorWidgetManager::getLayout() const { auto GetWidgetNamesInContainer = [&] (const EditorWidgetContainer* container) { Vector<String> widgetNames; if(container != nullptr) { UINT32 numWidgets = container->getNumWidgets(); for(UINT32 i = 0; i < numWidgets; i++) { EditorWidgetBase* widget = container->getWidget(i); widgetNames.push_back(widget->getName()); } } return widgetNames; }; MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); DockManager& dockManager = mainWindow->getDockManager(); SPtr<EditorWidgetLayout> layout = bs_shared_ptr_new<EditorWidgetLayout>(dockManager.getLayout()); Vector<EditorWidgetLayout::Entry>& layoutEntries = layout->getEntries(); UnorderedSet<EditorWidgetContainer*> widgetContainers; for(auto& widget : mActiveWidgets) { widgetContainers.insert(widget.second->_getParent()); } for(auto& widgetContainer : widgetContainers) { if(widgetContainer == nullptr) continue; layoutEntries.push_back(EditorWidgetLayout::Entry()); EditorWidgetLayout::Entry& entry = layoutEntries.back(); entry.widgetNames = GetWidgetNamesInContainer(widgetContainer); EditorWindowBase* parentWindow = widgetContainer->getParentWindow(); entry.isDocked = parentWindow->isMain(); // Assumed widget is docked if part of main window if(!entry.isDocked) { entry.x = parentWindow->getLeft(); entry.y = parentWindow->getTop(); entry.width = parentWindow->getWidth(); entry.height = parentWindow->getHeight(); } } layout->setIsMainWindowMaximized(mainWindow->getRenderWindow()->getProperties().isMaximized()); return layout; }
void EditorWidgetManager::setLayout(const SPtr<EditorWidgetLayout>& layout) { // Unparent all widgets Vector<EditorWidgetBase*> unparentedWidgets; for(auto& widget : mActiveWidgets) { if(widget.second->_getParent() != nullptr) widget.second->_getParent()->remove(*(widget.second)); unparentedWidgets.push_back(widget.second); } // Restore floating widgets for(auto& entry : layout->getEntries()) { if(entry.isDocked) continue; EditorWindow* window = EditorWindow::create(); for(auto& widgetName : entry.widgetNames) { create(widgetName, window->widgets()); } window->setPosition(entry.x, entry.y); window->setSize(entry.width, entry.height); if(window->widgets().getNumWidgets() == 0) window->close(); } // Restore docked widgets MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow(); DockManager& dockManager = mainWindow->getDockManager(); dockManager.setLayout(layout->getDockLayout()); // Destroy any widgets that are no longer have parents for(auto& widget : unparentedWidgets) { if(widget->_getParent() == nullptr) widget->close(); } if (layout->getIsMainWindowMaximized()) mainWindow->getRenderWindow()->maximize(gCoreAccessor()); }