void ModelIndexer::IndexerThread::onFilesQueued() { QMutexLocker locker(&m_indexer->d->indexerMutex); while (!m_indexer->d->filesQueue.isEmpty()) { ModelIndexer::QueuedFile queuedFile = m_indexer->d->filesQueue.takeFirst(); m_indexer->d->queuedFilesSet.remove(queuedFile); qCDebug(logger) << "handle queued file " << queuedFile.file() << "from project " << queuedFile.project()->displayName(); bool scanModel = false; IndexedModel *indexedModel = m_indexer->d->indexedModels.value(queuedFile.file()); if (!indexedModel) { qCDebug(logger) << "create new indexed model"; indexedModel = new IndexedModel(queuedFile.file(), queuedFile.lastModified()); indexedModel->addOwningProject(queuedFile.project()); m_indexer->d->indexedModels.insert(queuedFile.file(), indexedModel); scanModel = true; } else if (queuedFile.lastModified() > indexedModel->lastModified()) { qCDebug(logger) << "update indexed model"; indexedModel->addOwningProject(queuedFile.project()); indexedModel->reset(queuedFile.lastModified()); scanModel = true; } if (scanModel) { locker.unlock(); // load model file qmt::ProjectSerializer projectSerializer; qmt::Project project; try { projectSerializer.load(queuedFile.file(), &project); } catch (const qmt::Exception &e) { qWarning() << e.errorMessage(); return; } locker.relock(); indexedModel->setModelUid(project.uid()); // add indexedModel to set of indexedModelsByUid QSet<IndexedModel *> indexedModels = m_indexer->d->indexedModelsByUid.value(project.uid()); indexedModels.insert(indexedModel); m_indexer->d->indexedModelsByUid.insert(project.uid(), indexedModels); // collect all diagrams of model DiagramsCollectorVisitor visitor(indexedModel); project.rootPackage()->accept(&visitor); if (m_indexer->d->defaultModelFiles.contains(queuedFile)) { m_indexer->d->defaultModelFiles.remove(queuedFile); // check if model has a diagram which could be opened qmt::FindRootDiagramVisitor diagramVisitor; project.rootPackage()->accept(&diagramVisitor); if (diagramVisitor.diagram()) emit m_indexer->openDefaultModel(project.uid()); } } } }