| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include <string> |
| #include <QLatin1Char> |
|
|
| #include <QFileInfo> |
|
|
| #include <App/Application.h> |
|
|
| #include "Exceptions.h" |
| #include "Model.h" |
| #include "ModelLibrary.h" |
| #include "ModelManager.h" |
|
|
|
|
| using namespace Materials; |
|
|
| TYPESYSTEM_SOURCE(Materials::ModelLibrary, Materials::Library) |
|
|
| ModelLibrary::ModelLibrary(const Library& other) |
| : Library(other) |
| {} |
|
|
| ModelLibrary::ModelLibrary(const QString& libraryName, |
| const QString& dir, |
| const QString& iconPath, |
| bool readOnly) |
| : Library(libraryName, dir, iconPath, readOnly) |
| {} |
|
|
| ModelLibrary::ModelLibrary() |
| { |
| } |
|
|
| std::shared_ptr<std::map<QString, std::shared_ptr<ModelTreeNode>>> |
| ModelLibrary::getModelTree(ModelFilter filter) const |
| { |
| std::shared_ptr<std::map<QString, std::shared_ptr<ModelTreeNode>>> modelTree = |
| std::make_shared<std::map<QString, std::shared_ptr<ModelTreeNode>>>(); |
|
|
| auto models = ModelManager::getManager().libraryModels(getName()); |
| for (auto& it : *models) { |
| auto uuid = it.getUUID(); |
| auto path = it.getPath(); |
| auto filename = it.getName(); |
|
|
| auto model = ModelManager::getManager().getModel(getName(), uuid); |
| if (ModelManager::passFilter(filter, model->getType())) { |
| QStringList list = path.split(QLatin1Char('/')); |
|
|
| |
| std::shared_ptr<std::map<QString, std::shared_ptr<ModelTreeNode>>> node = modelTree; |
| for (auto& itp : list) { |
| |
| if (!node->contains(itp)) { |
| auto mapPtr = |
| std::make_shared<std::map<QString, std::shared_ptr<ModelTreeNode>>>(); |
| std::shared_ptr<ModelTreeNode> child = std::make_shared<ModelTreeNode>(); |
| child->setFolder(mapPtr); |
| (*node)[itp] = child; |
| node = mapPtr; |
| } |
| else { |
| node = (*node)[itp]->getFolder(); |
| } |
| } |
| std::shared_ptr<ModelTreeNode> child = std::make_shared<ModelTreeNode>(); |
| child->setUUID(uuid); |
| child->setData(model); |
| (*node)[filename] = child; |
| } |
| } |
|
|
| return modelTree; |
| } |
|
|
| TYPESYSTEM_SOURCE(Materials::ModelLibraryLocal, Materials::ModelLibrary) |
|
|
| ModelLibraryLocal::ModelLibraryLocal(const Library& other) |
| : ModelLibrary(other) |
| { |
| setLocal(true); |
|
|
| _modelPathMap = std::make_unique<std::map<QString, std::shared_ptr<Model>>>(); |
| } |
|
|
| ModelLibraryLocal::ModelLibraryLocal(const QString& libraryName, |
| const QString& dir, |
| const QString& iconPath, |
| bool readOnly) |
| : ModelLibrary(libraryName, dir, iconPath, readOnly) |
| { |
| setLocal(true); |
|
|
| _modelPathMap = std::make_unique<std::map<QString, std::shared_ptr<Model>>>(); |
| } |
|
|
| ModelLibraryLocal::ModelLibraryLocal() |
| { |
| setLocal(true); |
|
|
| _modelPathMap = std::make_unique<std::map<QString, std::shared_ptr<Model>>>(); |
| } |
|
|
| std::shared_ptr<Model> ModelLibraryLocal::getModelByPath(const QString& path) const |
| { |
| QString filePath = getRelativePath(path); |
| try { |
| std::shared_ptr<Model> model = _modelPathMap->at(filePath); |
| return model; |
| } |
| catch (std::out_of_range&) { |
| throw ModelNotFound(); |
| } |
| } |
|
|
| std::shared_ptr<Model> ModelLibraryLocal::addModel(const Model& model, const QString& path) |
| { |
| QString filePath = getRelativePath(path); |
| QFileInfo info(filePath); |
| std::shared_ptr<Model> newModel = std::make_shared<Model>(model); |
| newModel->setLibrary(getptr()); |
| newModel->setDirectory(getLibraryPath(filePath, info.fileName())); |
| newModel->setFilename(info.fileName()); |
|
|
| (*_modelPathMap)[filePath] = newModel; |
|
|
| return newModel; |
| } |
|
|