diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 8fb3a7b45f1..1a223c07d8e 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -286,6 +286,10 @@ void CMakeBuildSystem::triggerParsing() reparseParameters |= REPARSE_FORCE_CMAKE_RUN | REPARSE_FORCE_EXTRA_CONFIGURATION; } + // The code model will be updated after the CMake run. There is no need to have an + // active code model updater when the next one will be triggered. + m_cppCodeModelUpdater->cancel(); + qCDebug(cmakeBuildSystemLog) << "Asking reader to parse"; m_reader.parse(reparseParameters & REPARSE_FORCE_CMAKE_RUN, reparseParameters & REPARSE_FORCE_INITIAL_CONFIGURATION, @@ -370,27 +374,6 @@ QString CMakeBuildSystem::reparseParametersString(int reparseFlags) return result.trimmed(); } -void CMakeBuildSystem::writeConfigurationIntoBuildDirectory() -{ - const MacroExpander *expander = cmakeBuildConfiguration()->macroExpander(); - 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(cmakeBuildConfiguration()->configurationChanges(), - [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); -} - void CMakeBuildSystem::setParametersAndRequestParse(const BuildDirParameters ¶meters, const int reparseParameters) { @@ -424,8 +407,6 @@ void CMakeBuildSystem::setParametersAndRequestParse(const BuildDirParameters &pa m_reader.setParameters(m_parameters); - writeConfigurationIntoBuildDirectory(); - if (reparseParameters & REPARSE_URGENT) { qCDebug(cmakeBuildSystemLog) << "calling requestReparse"; requestParse(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h index 39e849830e6..2cda4a6ab63 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h @@ -158,8 +158,6 @@ private: void runCTest(); - void writeConfigurationIntoBuildDirectory(); - ProjectExplorer::TreeScanner m_treeScanner; QHash m_mimeBinaryCache; QList m_allFiles; diff --git a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp index 4887bd130dd..7e30f661fb2 100644 --- a/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeconfigitem.cpp @@ -200,7 +200,7 @@ QString CMakeConfigItem::expandedValue(const ProjectExplorer::Kit *k) const QString CMakeConfigItem::expandedValue(const Utils::MacroExpander *expander) const { - return expander->expand(QString::fromUtf8(value)); + return expander ? expander->expand(QString::fromUtf8(value)) : QString::fromUtf8(value); } std::function CMakeConfigItem::sortOperator() diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp index 909636c2dfc..78a3a599410 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.cpp +++ b/src/plugins/cmakeprojectmanager/fileapiparser.cpp @@ -870,7 +870,9 @@ static QStringList uniqueTargetFiles(const Configuration &config) return files; } -FileApiData FileApiParser::parseData(const QFileInfo &replyFileInfo, const QString &cmakeBuildType, +FileApiData FileApiParser::parseData(QFutureInterface> &fi, + const QFileInfo &replyFileInfo, + const QString &cmakeBuildType, QString &errorMessage) { QTC_CHECK(errorMessage.isEmpty()); @@ -878,16 +880,29 @@ FileApiData FileApiParser::parseData(const QFileInfo &replyFileInfo, const QStri FileApiData result; + const auto cancelCheck = [&fi, &errorMessage]() -> bool { + if (fi.isCanceled()) { + errorMessage = FileApiParser::tr("CMake parsing was cancelled."); + return true; + } + return false; + }; + result.replyFile = readReplyFile(replyFileInfo, errorMessage); + if (cancelCheck()) + return {}; result.cache = readCacheFile(result.replyFile.jsonFile("cache", replyDir), errorMessage); + if (cancelCheck()) + return {}; result.cmakeFiles = readCMakeFilesFile(result.replyFile.jsonFile("cmakeFiles", replyDir), errorMessage); + if (cancelCheck()) + return {}; auto codeModels = readCodemodelFile(result.replyFile.jsonFile("codemodel", replyDir), errorMessage); if (codeModels.size() == 0) { errorMessage = "No CMake configuration found!"; - qWarning() << errorMessage; return result; } @@ -911,14 +926,17 @@ FileApiData FileApiParser::parseData(const QFileInfo &replyFileInfo, const QStri .arg(cmakeBuildType) .arg(buildTypes.join(", ")); } - qWarning() << errorMessage; return result; } result.codemodel = std::move(*it); + if (cancelCheck()) + return {}; const QStringList targetFiles = uniqueTargetFiles(result.codemodel); for (const QString &targetFile : targetFiles) { + if (cancelCheck()) + return {}; QString targetErrorMessage; TargetDetails td = readTargetFile(replyDir.absoluteFilePath(targetFile), targetErrorMessage); if (targetErrorMessage.isEmpty()) { diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.h b/src/plugins/cmakeprojectmanager/fileapiparser.h index 6650d5e75ae..850a3de859f 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.h +++ b/src/plugins/cmakeprojectmanager/fileapiparser.h @@ -27,6 +27,8 @@ #include "cmakeconfigitem.h" +#include "fileapidataextractor.h" + #include #include @@ -34,6 +36,7 @@ #include #include +#include #include #include @@ -247,7 +250,9 @@ class FileApiParser { Q_DECLARE_TR_FUNCTIONS(FileApiParser) public: - static FileApiData parseData(const QFileInfo &replyFileInfo, const QString& cmakeBuildType, + static FileApiData parseData(QFutureInterface> &fi, + const QFileInfo &replyFileInfo, + const QString &cmakeBuildType, QString &errorMessage); static bool setupCMakeFileApi(const Utils::FilePath &buildDirectory, diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index 2b3a086b1ec..1171b9d5480 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -265,11 +265,14 @@ void FileApiReader::endState(const QFileInfo &replyFi) m_lastReplyTimestamp = replyFi.lastModified(); m_future = runAsync(ProjectExplorerPlugin::sharedThreadPool(), - [replyFi, sourceDirectory, buildDirectory, topCmakeFile, cmakeBuildType]() { + [replyFi, sourceDirectory, buildDirectory, topCmakeFile, cmakeBuildType]( + QFutureInterface> &fi) { auto result = std::make_shared(); - FileApiData data = FileApiParser::parseData(replyFi, cmakeBuildType, result->errorMessage); + FileApiData data = FileApiParser::parseData(fi, + replyFi, + cmakeBuildType, + result->errorMessage); if (!result->errorMessage.isEmpty()) { - qWarning() << result->errorMessage; *result = generateFallbackData(topCmakeFile, sourceDirectory, buildDirectory, @@ -281,7 +284,7 @@ void FileApiReader::endState(const QFileInfo &replyFi) qWarning() << result->errorMessage; } - return result; + fi.reportResult(result); }); onResultReady(m_future.value(), this, @@ -336,6 +339,28 @@ void FileApiReader::makeBackupConfiguration(bool store) } +void FileApiReader::writeConfigurationIntoBuildDirectory(const QStringList &configurationArguments) +{ + const FilePath buildDir = m_parameters.workDirectory; + 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(CMakeConfigItem::itemsFromArguments(configurationArguments), + [](const CMakeConfigItem &item) { + return item.toCMakeSetLine(nullptr); + }) + .join('\n') + .toUtf8()); + + QFile file(settingsFile.toString()); + QTC_ASSERT(file.open(QFile::WriteOnly | QFile::Truncate), return ); + file.write(contents); +} + void FileApiReader::startCMakeState(const QStringList &configurationArguments) { qCDebug(cmakeFileApiMode) << "FileApiReader: START CMAKE STATE."; @@ -347,6 +372,7 @@ void FileApiReader::startCMakeState(const QStringList &configurationArguments) qCDebug(cmakeFileApiMode) << ">>>>>> Running cmake with arguments:" << configurationArguments; makeBackupConfiguration(true); + writeConfigurationIntoBuildDirectory(configurationArguments); m_cmakeProcess->run(m_parameters, configurationArguments); } diff --git a/src/plugins/cmakeprojectmanager/fileapireader.h b/src/plugins/cmakeprojectmanager/fileapireader.h index 505f5fd5065..1a7d7dc3d38 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.h +++ b/src/plugins/cmakeprojectmanager/fileapireader.h @@ -93,6 +93,8 @@ private: void replyDirectoryHasChanged(const QString &directory) const; void makeBackupConfiguration(bool store); + void writeConfigurationIntoBuildDirectory(const QStringList &configuration); + std::unique_ptr m_cmakeProcess; // cmake data: diff --git a/src/plugins/coreplugin/fancyactionbar.cpp b/src/plugins/coreplugin/fancyactionbar.cpp index ed4d5ddb278..d0b757a5863 100644 --- a/src/plugins/coreplugin/fancyactionbar.cpp +++ b/src/plugins/coreplugin/fancyactionbar.cpp @@ -86,6 +86,42 @@ bool FancyToolButton::event(QEvent *e) return QToolButton::event(e); } +static int findSplitPos(const QString &text, const QFontMetrics &fontMetrics, qreal availableWidth) +{ + if (text.length() == 0) + return -1; + int splitPos = -1; + int lastWhiteSpace; + int firstWhiteSpace = text.length(); + do { + // search backwards for ranges of whitespaces + // search first whitespace (backwards) + lastWhiteSpace = firstWhiteSpace - 1; // start before last blob (or at end of text) + while (lastWhiteSpace >= 0) { + if (text.at(lastWhiteSpace).isSpace()) + break; + --lastWhiteSpace; + } + // search last whitespace (backwards) + firstWhiteSpace = lastWhiteSpace; + while (firstWhiteSpace > 0) { + if (!text.at(firstWhiteSpace - 1).isSpace()) + break; + --firstWhiteSpace; + } + // if the text after the whitespace range fits into the available width, that's a great + // position for splitting, but look if we can fit more + if (firstWhiteSpace != -1) { + if (fontMetrics.horizontalAdvance(text.mid(lastWhiteSpace + 1)) <= availableWidth) + splitPos = lastWhiteSpace + 1; + else + break; + } + } while (firstWhiteSpace > 0 + && fontMetrics.horizontalAdvance(text.left(firstWhiteSpace)) > availableWidth); + return splitPos; +} + static QVector splitInTwoLines(const QString &text, const QFontMetrics &fontMetrics, qreal availableWidth) @@ -95,21 +131,7 @@ static QVector splitInTwoLines(const QString &text, // to put them in the second line. First line is drawn with ellipsis, // second line gets ellipsis if it couldn't split off full words. QVector splitLines(2); - const QRegularExpression rx(QLatin1String("\\s+")); - int splitPos = -1; - int nextSplitPos = text.length(); - do { - int offset = nextSplitPos - text.length() - 1; - nextSplitPos = text.lastIndexOf(rx, offset); - if (nextSplitPos != -1) { - const QRegularExpressionMatch match = rx.match(text, offset); - int splitCandidate = nextSplitPos + match.capturedLength(); - if (fontMetrics.horizontalAdvance(text.mid(splitCandidate)) <= availableWidth) - splitPos = splitCandidate; - else - break; - } - } while (nextSplitPos > 0 && fontMetrics.horizontalAdvance(text.left(nextSplitPos)) > availableWidth); + const int splitPos = findSplitPos(text, fontMetrics, availableWidth); // check if we could split at white space at all if (splitPos < 0) { splitLines[0] = fontMetrics.elidedText(text, Qt::ElideRight, int(availableWidth)); diff --git a/src/plugins/cpptools/symbolfinder.cpp b/src/plugins/cpptools/symbolfinder.cpp index 0c0c1f3d15a..7147f1d1c41 100644 --- a/src/plugins/cpptools/symbolfinder.cpp +++ b/src/plugins/cpptools/symbolfinder.cpp @@ -436,6 +436,9 @@ QList SymbolFinder::findMatchingDeclaration(const LookupContext & Function *functionType) { QList result; + if (!functionType) + return result; + QList nameMatch, argumentCountMatch, typeMatch; findMatchingDeclaration(context, functionType, &typeMatch, &argumentCountMatch, &nameMatch); result.append(typeMatch); diff --git a/src/plugins/ios/iosprobe.cpp b/src/plugins/ios/iosprobe.cpp index 0b9f9a03133..bbef7f57e8b 100644 --- a/src/plugins/ios/iosprobe.cpp +++ b/src/plugins/ios/iosprobe.cpp @@ -68,7 +68,6 @@ void XcodeProbe::detectDeveloperPaths() Utils::SynchronousProcess selectedXcode; selectedXcode.setTimeoutS(5); selectedXcode.setCommand({"/usr/bin/xcode-select", {"--print-path"}}); - selectedXcode.setProcessUserEventWhileRunning(); selectedXcode.runBlocking(); if (selectedXcode.result() != QtcProcess::FinishedWithSuccess) qCWarning(probeLog) diff --git a/src/plugins/studiowelcome/qml/welcomepage/SaturationEffect.qml b/src/plugins/studiowelcome/qml/welcomepage/SaturationEffect.qml index 4f85e681a46..32d2448d6ee 100644 --- a/src/plugins/studiowelcome/qml/welcomepage/SaturationEffect.qml +++ b/src/plugins/studiowelcome/qml/welcomepage/SaturationEffect.qml @@ -24,14 +24,18 @@ ****************************************************************************/ import QtQuick 2.0 -import QtGraphicalEffects 1.0 Item { id: root property real desaturation: 1.0 - layer.enabled: true - layer.effect: Desaturate { - desaturation: root.desaturation + + Rectangle { + z: 10 + anchors.fill: parent + color: "#2d2e30" + anchors.margins: -16 + + opacity: root.desaturation * 0.6 } } diff --git a/src/plugins/texteditor/texteditoractionhandler.cpp b/src/plugins/texteditor/texteditoractionhandler.cpp index ee965e8e9cd..98b66f10008 100644 --- a/src/plugins/texteditor/texteditoractionhandler.cpp +++ b/src/plugins/texteditor/texteditoractionhandler.cpp @@ -273,7 +273,7 @@ void TextEditorActionHandlerPrivate::createActions() QKeySequence(tr("Ctrl+Shift+V")), G_EDIT_COPYPASTE, editMenu); m_modifyingActions << registerAction(NO_FORMAT_PASTE, [] (TextEditorWidget *w) { w->pasteWithoutFormat(); }, false, tr("Paste Without Formatting"), - QKeySequence(Core::useMacShortcuts ? tr("Cmd+Opt+Shift+V") : QString()), G_EDIT_COPYPASTE, editMenu); + QKeySequence(Core::useMacShortcuts ? tr("Ctrl+Alt+Shift+V") : QString()), G_EDIT_COPYPASTE, editMenu); // register "Edit -> Advanced" Menu Actions Core::ActionContainer *advancedEditMenu = Core::ActionManager::actionContainer(M_EDIT_ADVANCED); diff --git a/src/shared/qbs b/src/shared/qbs index 86eb6974126..f002b866e7e 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 86eb6974126b4fdf4cfa3340b7a80833479f2d37 +Subproject commit f002b866e7e190ddcadfb61ca935c6f0b6ef7e1a