MappingPtr ViewAreaImpl::storeSplitterState(QSplitter* splitter, Archive* archive) { MappingPtr state = new Mapping; ListingPtr children = new Listing; for(int i=0; i < splitter->count(); ++i){ QSplitter* childSplitter = dynamic_cast<QSplitter*>(splitter->widget(i)); if(childSplitter){ MappingPtr childState = storeSplitterState(childSplitter, archive); if(childState){ children->append(childState); } } else { ViewPane* pane = dynamic_cast<ViewPane*>(splitter->widget(i)); if(pane && pane->count() > 0){ MappingPtr childState = storePaneState(pane, archive); if(childState){ children->append(childState); } } } } const int numChildren = children->size(); if(numChildren == 0){ state.reset(); } else if(numChildren == 1){ state = children->at(0)->toMapping(); } else if(numChildren == 2){ state->write("type", "splitter"); state->write("orientation", (splitter->orientation() == Qt::Vertical) ? "vertical" : "horizontal"); Listing* sizeSeq = state->createFlowStyleListing("sizes"); QList<int> sizes = splitter->sizes(); for(int i=0; i < sizes.size(); ++i){ sizeSeq->append(sizes[i]); } state->insert("children", children); } return state; }
bool SensorVisualizerItem::restore(const Archive& archive) { impl->restoredSubItems.clear(); ListingPtr subItems = archive.findListing("subItems"); if(subItems->isValid()){ for(int i=0; i < subItems->size(); i++){ Archive* subArchive = dynamic_cast<Archive*>(subItems->at(i)->toMapping()); string className, itemName; subArchive->read("class", className); subArchive->read("name", itemName); ItemPtr item; item = ItemManager::create("Body", className); item->setName(itemName); item->restore(*subArchive); impl->restoredSubItems.push_back(item); } } return true; }