diff options
Diffstat (limited to 'src/plugins/cmakeprojectmanager/builddirmanager.cpp')
-rw-r--r-- | src/plugins/cmakeprojectmanager/builddirmanager.cpp | 98 |
1 files changed, 76 insertions, 22 deletions
diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 7e92932d20..aa0caae7ec 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -51,6 +51,8 @@ #include <QPushButton> #include <QSet> +#include <app/app_version.h> + using namespace ProjectExplorer; using namespace Utils; @@ -123,28 +125,44 @@ void BuildDirManager::emitErrorOccured(const QString &message) const void BuildDirManager::emitReparseRequest() const { - if (m_reparseParameters & REPARSE_URGENT) + if (m_reparseParameters & REPARSE_URGENT) { + qCDebug(cmakeBuildDirManagerLog) << "emitting requestReparse"; emit requestReparse(); - else + } else { + qCDebug(cmakeBuildDirManagerLog) << "emitting requestDelayedReparse"; emit requestDelayedReparse(); + } } void BuildDirManager::updateReaderType(const BuildDirParameters &p, std::function<void()> todo) { - if (!m_reader || !m_reader->isCompatible(p)) + if (!m_reader || !m_reader->isCompatible(p)) { + if (m_reader) { + stopParsingAndClearState(); + qCDebug(cmakeBuildDirManagerLog) << "Creating new reader do to incompatible parameters"; + } else { + qCDebug(cmakeBuildDirManagerLog) << "Creating first reader"; + } m_reader = BuildDirReader::createReader(p); - QTC_ASSERT(m_reader, return); + connect(m_reader.get(), + &BuildDirReader::configurationStarted, + this, + &BuildDirManager::parsingStarted); + connect(m_reader.get(), + &BuildDirReader::dataAvailable, + this, + &BuildDirManager::emitDataAvailable); + connect(m_reader.get(), + &BuildDirReader::errorOccured, + this, + &BuildDirManager::emitErrorOccured); + connect(m_reader.get(), &BuildDirReader::dirty, this, &BuildDirManager::becameDirty); + connect(m_reader.get(), &BuildDirReader::isReadyNow, this, todo); + } - connect(m_reader.get(), &BuildDirReader::configurationStarted, - this, &BuildDirManager::parsingStarted); - connect(m_reader.get(), &BuildDirReader::dataAvailable, - this, &BuildDirManager::emitDataAvailable); - connect(m_reader.get(), &BuildDirReader::errorOccured, - this, &BuildDirManager::emitErrorOccured); - connect(m_reader.get(), &BuildDirReader::dirty, this, &BuildDirManager::becameDirty); - connect(m_reader.get(), &BuildDirReader::isReadyNow, this, todo); + QTC_ASSERT(m_reader, return ); m_reader->setParameters(p); } @@ -213,6 +231,28 @@ bool BuildDirManager::hasConfigChanged() return mustReparse || kcit != targetConfig.constEnd(); } +void BuildDirManager::writeConfigurationIntoBuildDirectory(const Utils::MacroExpander *expander) +{ + QTC_ASSERT(expander, return ); + + const FilePath buildDir = workDirectory(m_parameters); + QTC_ASSERT(buildDir.exists(), return ); + + const FilePath settingsFile = buildDir.pathAppended("qtcsettings.cmake"); + + QByteArray contents; + contents.append("# This file is managed by Qt Creator, do not edit!\n\n"); + contents.append( + transform(m_parameters.configuration, + [expander](const CMakeConfigItem &item) { return item.toCMakeSetLine(expander); }) + .join('\n') + .toUtf8()); + + QFile file(settingsFile.toString()); + QTC_ASSERT(file.open(QFile::WriteOnly | QFile::Truncate), return ); + file.write(contents); +} + bool BuildDirManager::isParsing() const { return m_reader && m_reader->isParsing(); @@ -220,7 +260,10 @@ bool BuildDirManager::isParsing() const void BuildDirManager::stopParsingAndClearState() { + qCDebug(cmakeBuildDirManagerLog) << "stopping parsing run!"; if (m_reader) { + if (m_reader->isParsing()) + m_reader->errorOccured(tr("Parsing has been canceled.")); disconnect(m_reader.get(), nullptr, this, nullptr); m_reader->stop(); } @@ -231,6 +274,7 @@ void BuildDirManager::stopParsingAndClearState() void BuildDirManager::setParametersAndRequestParse(const BuildDirParameters ¶meters, const int reparseParameters) { + qCDebug(cmakeBuildDirManagerLog) << "setting parameters and requesting reparse"; if (!parameters.cmakeTool()) { TaskHub::addTask(Task::Error, tr("The kit needs to define a CMake tool to parse this project."), @@ -239,8 +283,6 @@ void BuildDirManager::setParametersAndRequestParse(const BuildDirParameters &par } QTC_ASSERT(parameters.isValid(), return ); - stopParsingAndClearState(); - m_parameters = parameters; m_parameters.workDirectory = workDirectory(parameters); updateReparseParameters(reparseParameters); @@ -262,6 +304,7 @@ FilePath BuildDirManager::buildDirectory() const void BuildDirManager::becameDirty() { + qCDebug(cmakeBuildDirManagerLog) << "BuildDirManager: becameDirty was triggered."; if (isParsing() || !buildConfiguration()) return; @@ -310,8 +353,10 @@ bool BuildDirManager::isFilesystemScanRequested() const void BuildDirManager::parse() { + qCDebug(cmakeBuildDirManagerLog) << "parsing!"; QTC_ASSERT(m_parameters.isValid(), return ); - QTC_ASSERT(m_reader, return); + QTC_ASSERT(m_reader, return ); + QTC_ASSERT(!m_reader->isParsing(), return ); m_reader->stop(); @@ -335,6 +380,9 @@ void BuildDirManager::parse() } } + writeConfigurationIntoBuildDirectory(m_parameters.expander); + + qCDebug(cmakeBuildDirManagerLog) << "Asking reader to parse"; m_reader->parse(reparseParameters & REPARSE_FORCE_CMAKE_RUN, reparseParameters & REPARSE_FORCE_CONFIGURATION); } @@ -512,21 +560,27 @@ bool BuildDirManager::checkConfiguration() QStringList keyList = changedKeys.keys(); Utils::sort(keyList); QString table = QString::fromLatin1("<table><tr><th>%1</th><th>%2</th><th>%3</th></tr>") - .arg(tr("Key")).arg(tr("CMakeCache.txt")).arg(tr("Project")); + .arg(tr("Key")) + .arg(tr("%1 Project").arg(Core::Constants::IDE_DISPLAY_NAME)) + .arg(tr("Changed value")); foreach (const QString &k, keyList) { const QPair<QString, QString> data = changedKeys.value(k); table += QString::fromLatin1("\n<tr><td>%1</td><td>%2</td><td>%3</td></tr>") - .arg(k) - .arg(data.first.toHtmlEscaped()) - .arg(data.second.toHtmlEscaped()); + .arg(k) + .arg(data.second.toHtmlEscaped()) + .arg(data.first.toHtmlEscaped()); } table += QLatin1String("\n</table>"); QPointer<QMessageBox> box = new QMessageBox(Core::ICore::mainWindow()); - box->setText(tr("CMake configuration has changed on disk.")); + box->setText(tr("The project has been changed outside of %1.") + .arg(Core::Constants::IDE_DISPLAY_NAME)); box->setInformativeText(table); - auto *defaultButton = box->addButton(tr("Overwrite Changes in CMakeCache.txt"), QMessageBox::RejectRole); - auto *applyButton = box->addButton(tr("Apply Changes to Project"), QMessageBox::ApplyRole); + auto *defaultButton = box->addButton(tr("Discard external changes"), + QMessageBox::RejectRole); + auto *applyButton = box->addButton(tr("Adapt %1 project to changes") + .arg(Core::Constants::IDE_DISPLAY_NAME), + QMessageBox::ApplyRole); box->setDefaultButton(defaultButton); box->exec(); |