src/documentmanager.cpp

changeset 200
ca23936b455b
parent 195
6e79c1cb83e6
child 201
5d201ee4a9c3
equal deleted inserted replaced
199:6988973515d2 200:ca23936b455b
19 #include <QFile> 19 #include <QFile>
20 #include <QDir> 20 #include <QDir>
21 #include <QFileInfo> 21 #include <QFileInfo>
22 #include <QSaveFile> 22 #include <QSaveFile>
23 #include "documentmanager.h" 23 #include "documentmanager.h"
24 #include "modeleditor.h"
25 #include "linetypes/subfilereference.h"
26 #include "parser.h" 24 #include "parser.h"
27 25
28 /** 26 /**
29 * @brief Constructs a new document manager 27 * @brief Constructs a new document manager
30 * @param parent Parent object 28 * @param parent Parent object
41 ModelId DocumentManager::newModel() 39 ModelId DocumentManager::newModel()
42 { 40 {
43 const ModelId modelId{++this->modelIdCounter}; 41 const ModelId modelId{++this->modelIdCounter};
44 const QString name = makeNewModelName(); 42 const QString name = makeNewModelName();
45 this->openModels[modelId] = ModelInfo{ 43 this->openModels[modelId] = ModelInfo{
46 .model = std::make_unique<Model>(), 44 .model = std::make_unique<Model>(this),
47 .id = modelId, 45 .id = modelId,
48 .opentype = OpenType::ManuallyOpened, 46 .opentype = OpenType::ManuallyOpened,
49 }; 47 };
50 this->makePolygonCacheForModel(modelId); 48 this->makePolygonCacheForModel(modelId);
51 return modelId; 49 return modelId;
398 referencedFilePath = libraries.findFile(referenceName); 396 referencedFilePath = libraries.findFile(referenceName);
399 } 397 }
400 return referencedFilePath; 398 return referencedFilePath;
401 } 399 }
402 400
401 template<typename T>
402 void iterate(const Model& model, std::function<void(const T&)> fn)
403 {
404 for (int i = 0; i < model.size(); ++i) {
405 if (std::holds_alternative<T>(model[i])) {
406 fn(std::get<T>(model[i]));
407 }
408 }
409 }
410
403 void DocumentManager::loadDependenciesForModel( 411 void DocumentManager::loadDependenciesForModel(
404 const ModelId modelId, 412 const ModelId modelId,
405 const QString &path, 413 const QString &path,
406 LoadDepedenciesBag& bag) 414 LoadDepedenciesBag& bag)
407 { 415 {
416 bag.errorStream << tr("bad model ID %1").arg(modelId.value); 424 bag.errorStream << tr("bad model ID %1").arg(modelId.value);
417 return; 425 return;
418 } 426 }
419 ModelInfo& modelInfo = this->openModels[modelId]; 427 ModelInfo& modelInfo = this->openModels[modelId];
420 modelInfo.dependencies.clear(); 428 modelInfo.dependencies.clear();
421 for (int i = 0; i < modelInfo.model->size(); i += 1) 429 iterate<Colored<SubfileReference>>(*modelInfo.model, [&](const SubfileReference& ref) {
422 { 430 const QString referenceName = ref.name;
423 const QString referenceName = (*modelInfo.model)[i]->getProperty(ldraw::Property::ReferenceName).toString();
424 if (not referenceName.isEmpty() 431 if (not referenceName.isEmpty()
425 and modelInfo.dependencies.count(referenceName) == 0 432 and modelInfo.dependencies.count(referenceName) == 0
426 and not failedToOpen.contains(referenceName)) 433 and not failedToOpen.contains(referenceName))
427 { 434 {
428 try 435 try
456 bag.errorStream << error.message << "\n"; 463 bag.errorStream << error.message << "\n";
457 failedToOpen.insert(referenceName); 464 failedToOpen.insert(referenceName);
458 bag.missing.append(referenceName); 465 bag.missing.append(referenceName);
459 } 466 }
460 } 467 }
461 } 468 });
462 } 469 }

mercurial