diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2019-03-01 12:20:57 +0200 |
---|---|---|
committer | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2019-03-01 13:06:57 +0200 |
commit | cbfc6e522dced7516dbfa036197476796ca1dcf8 (patch) | |
tree | e78aa7f496b1986d127e991da685bcc3382fa1f9 /src/plugins | |
parent | 89831854059144613279affc4c37eb65dbcbf6e7 (diff) | |
parent | aa14e396f03232ce97a723aaf18ab89f7dfad698 (diff) | |
download | qt-creator-cbfc6e522dced7516dbfa036197476796ca1dcf8.tar.gz |
Merge remote-tracking branch 'origin/4.9'
Change-Id: I801042a53ae4d02d1891ea582ca9ea89b00d3181
Diffstat (limited to 'src/plugins')
63 files changed, 734 insertions, 449 deletions
diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp index d00d488586..db34c904d4 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp @@ -86,7 +86,7 @@ static void addFunctionOverloadAssistProposalItem(QList<AssistProposalItemInterf const QString &name) { auto *item = static_cast<ClangAssistProposalItem *>(sameItem); - item->setHasOverloadsWithParameters(true); + item->setHasOverloadsWithParameters(codeCompletion.hasParameters); if (codeCompletion.completionKind == CodeCompletion::ConstructorCompletionKind) { // It's the constructor, currently constructor definitions do not lead here. // CLANG-UPGRADE-CHECK: Can we get here with constructor definition? diff --git a/src/plugins/clangcodemodel/clangdiagnosticfilter.h b/src/plugins/clangcodemodel/clangdiagnosticfilter.h index 0fe164ecf0..a61734718e 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticfilter.h +++ b/src/plugins/clangcodemodel/clangdiagnosticfilter.h @@ -49,7 +49,7 @@ private: void filterFixits(); private: - const QString &m_filePath; + const QString m_filePath; QVector<ClangBackEnd::DiagnosticContainer> m_warningDiagnostics; QVector<ClangBackEnd::DiagnosticContainer> m_errorDiagnostics; diff --git a/src/plugins/clangcodemodel/clangfollowsymbol.cpp b/src/plugins/clangcodemodel/clangfollowsymbol.cpp index 96df23ab20..f1113de164 100644 --- a/src/plugins/clangcodemodel/clangfollowsymbol.cpp +++ b/src/plugins/clangcodemodel/clangfollowsymbol.cpp @@ -28,6 +28,7 @@ #include <coreplugin/editormanager/editormanager.h> #include <cpptools/cppmodelmanager.h> +#include <cpptools/cppfollowsymbolundercursor.h> #include <texteditor/texteditor.h> #include <clangsupport/tokeninfocontainer.h> @@ -183,12 +184,22 @@ void ClangFollowSymbol::findLink(const CppTools::CursorInEditor &data, return processLinkCallback(Utils::Link()); if (!resolveTarget) { - processLinkCallback(linkAtCursor(cursor, - data.filePath().toString(), - static_cast<uint>(line), - static_cast<uint>(column), - processor)); - return; + Utils::Link link = linkAtCursor(cursor, + data.filePath().toString(), + static_cast<uint>(line), + static_cast<uint>(column), + processor); + if (link == Utils::Link()) { + CppTools::FollowSymbolUnderCursor followSymbol; + return followSymbol.findLink(data, + std::move(processLinkCallback), + false, + snapshot, + documentFromSemanticInfo, + symbolFinder, + inNextSplit); + } + return processLinkCallback(link); } QFuture<CppTools::SymbolInfo> infoFuture diff --git a/src/plugins/clangformat/clangformat.qbs b/src/plugins/clangformat/clangformat.qbs index c7b9182373..3e40832c57 100644 --- a/src/plugins/clangformat/clangformat.qbs +++ b/src/plugins/clangformat/clangformat.qbs @@ -15,6 +15,7 @@ QtcPlugin { Depends { name: "Qt.widgets" } condition: libclang.present + && libclang.llvmFormattingLibs.length && (!qbs.targetOS.contains("windows") || libclang.llvmBuildModeMatches) cpp.cxxFlags: { diff --git a/src/plugins/clangformat/clangformat_dependencies.pri b/src/plugins/clangformat/clangformat_dependencies.pri index 5f3f81e132..6822c5d66b 100644 --- a/src/plugins/clangformat/clangformat_dependencies.pri +++ b/src/plugins/clangformat/clangformat_dependencies.pri @@ -5,4 +5,4 @@ QTC_LIB_DEPENDS += \ QTC_PLUGIN_DEPENDS += \ cpptools \ projectexplorer \ - texteditor + cppeditor diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index 7a87eabcd7..a53eb50adb 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -136,7 +136,7 @@ int forceIndentWithExtraText(QByteArray &buffer, const QTextBlock &block, bool s int utf8Offset = Utils::Text::utf8NthLineOffset(block.document(), buffer, block.blockNumber() + 1); - if (firstNonWhitespace > 0) + if (firstNonWhitespace >= 0) utf8Offset += firstNonWhitespace; else utf8Offset += blockText.length(); @@ -336,6 +336,7 @@ ClangFormatBaseIndenter::ClangFormatBaseIndenter(QTextDocument *doc) TextEditor::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffer, const QTextBlock &startBlock, const QTextBlock &endBlock, + int cursorPositionInEditor, ReplacementsToKeep replacementsToKeep, const QChar &typedChar, bool secondTry) const @@ -353,17 +354,24 @@ TextEditor::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffer if (replacementsToKeep == ReplacementsToKeep::IndentAndBefore) rangeStart = formattingRangeStart(startBlock, buffer, lastSaveRevision()); - if (replacementsToKeep == ReplacementsToKeep::IndentAndBefore) { - buffer.insert(utf8Offset - 1, " //"); - utf8Offset += 3; - } - adjustFormatStyleForLineBreak(style, replacementsToKeep); if (typedChar == QChar::Null) { - for (int index = startBlock.blockNumber(); index <= endBlock.blockNumber(); ++index) { + if (replacementsToKeep == ReplacementsToKeep::IndentAndBefore) { + if (utf8Offset > 0) { + buffer.insert(utf8Offset - 1, " //"); + utf8Offset += 3; + } utf8Length += forceIndentWithExtraText(buffer, - m_doc->findBlockByNumber(index), + cursorPositionInEditor < 0 + ? endBlock + : m_doc->findBlock(cursorPositionInEditor), secondTry); + } else { + for (int index = startBlock.blockNumber(); index <= endBlock.blockNumber(); ++index) { + utf8Length += forceIndentWithExtraText(buffer, + m_doc->findBlockByNumber(index), + secondTry); + } } } @@ -394,6 +402,7 @@ TextEditor::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffer return replacements(originalBuffer, startBlock, endBlock, + cursorPositionInEditor, replacementsToKeep, typedChar, true); @@ -468,6 +477,7 @@ TextEditor::Replacements ClangFormatBaseIndenter::indentsFor(QTextBlock startBlo return replacements(buffer, startBlock, endBlock, + cursorPositionInEditor, replacementsToKeep, typedChar); } diff --git a/src/plugins/clangformat/clangformatbaseindenter.h b/src/plugins/clangformat/clangformatbaseindenter.h index ed63ff6efa..b412b57d6d 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.h +++ b/src/plugins/clangformat/clangformatbaseindenter.h @@ -87,6 +87,7 @@ private: TextEditor::Replacements replacements(QByteArray buffer, const QTextBlock &startBlock, const QTextBlock &endBlock, + int cursorPositionInEditor, ReplacementsToKeep replacementsToKeep, const QChar &typedChar = QChar::Null, bool secondTry = false) const; diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp index f0d4808cf5..faaf6d937f 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.cpp +++ b/src/plugins/clangformat/clangformatconfigwidget.cpp @@ -23,10 +23,10 @@ ** ****************************************************************************/ - #include "clangformatconfigwidget.h" #include "clangformatconstants.h" +#include "clangformatindenter.h" #include "clangformatsettings.h" #include "clangformatutils.h" #include "ui_clangformatconfigwidget.h" @@ -34,10 +34,17 @@ #include <clang/Format/Format.h> #include <coreplugin/icore.h> +#include <cppeditor/cpphighlighter.h> +#include <cpptools/cppcodestylesnippets.h> #include <projectexplorer/project.h> #include <projectexplorer/session.h> +#include <texteditor/displaysettings.h> +#include <texteditor/snippets/snippeteditor.h> +#include <texteditor/textdocument.h> +#include <texteditor/texteditorsettings.h> #include <QFile> +#include <QMessageBox> #include <sstream> @@ -45,79 +52,7 @@ using namespace ProjectExplorer; namespace ClangFormat { -static void readTable(QTableWidget *table, std::istringstream &stream) -{ - table->horizontalHeader()->hide(); - table->verticalHeader()->hide(); - - table->setColumnCount(2); - table->setRowCount(0); - - std::string line; - while (std::getline(stream, line)) { - if (line == "---" || line == "...") - continue; - - const size_t firstLetter = line.find_first_not_of(' '); - if (firstLetter == std::string::npos || line.at(firstLetter) == '#') - continue; - - // Increase indent where it already exists. - if (firstLetter > 0 && firstLetter < 5) - line = " " + line; - - table->insertRow(table->rowCount()); - const size_t colonPos = line.find_first_of(':'); - auto *keyItem = new QTableWidgetItem; - auto *valueItem = new QTableWidgetItem; - - keyItem->setFlags(keyItem->flags() & ~Qt::ItemFlags(Qt::ItemIsEditable)); - table->setItem(table->rowCount() - 1, 0, keyItem); - table->setItem(table->rowCount() - 1, 1, valueItem); - - if (colonPos == std::string::npos) { - keyItem->setText(QString::fromStdString(line)); - valueItem->setFlags(valueItem->flags() & ~Qt::ItemFlags(Qt::ItemIsEditable)); - continue; - } - - keyItem->setText(QString::fromStdString(line.substr(0, colonPos))); - - const size_t optionValueStart = line.find_first_not_of(' ', colonPos + 1); - if (optionValueStart == std::string::npos) - valueItem->setFlags(valueItem->flags() & ~Qt::ItemFlags(Qt::ItemIsEditable)); - else - valueItem->setText(QString::fromStdString(line.substr(optionValueStart))); - } - - table->resizeColumnToContents(0); - table->resizeColumnToContents(1); -} - -static QByteArray tableToYAML(QTableWidget *table) -{ - QByteArray text; - text += "---\n"; - for (int i = 0; i < table->rowCount(); ++i) { - auto *keyItem = table->item(i, 0); - auto *valueItem = table->item(i, 1); - - QByteArray itemText = keyItem->text().toUtf8(); - // Change the indent back to 2 spaces - itemText.replace(" ", " "); - if (!valueItem->text().isEmpty() || !itemText.trimmed().startsWith('-')) - itemText += ": "; - itemText += valueItem->text().toUtf8() + '\n'; - - text += itemText; - } - text += "...\n"; - - return text; -} - -ClangFormatConfigWidget::ClangFormatConfigWidget(ProjectExplorer::Project *project, - QWidget *parent) +ClangFormatConfigWidget::ClangFormatConfigWidget(ProjectExplorer::Project *project, QWidget *parent) : CodeStyleEditorWidget(parent) , m_project(project) , m_ui(std::make_unique<Ui::ClangFormatConfigWidget>()) @@ -153,6 +88,17 @@ void ClangFormatConfigWidget::initialize() m_ui->applyButton->show(); hideGlobalCheckboxes(); + m_preview = new TextEditor::SnippetEditorWidget(this); + m_ui->horizontalLayout_2->addWidget(m_preview); + m_preview->setPlainText(QLatin1String(CppTools::Constants::DEFAULT_CODE_STYLE_SNIPPETS[0])); + m_preview->textDocument()->setIndenter(new ClangFormatIndenter(m_preview->document())); + m_preview->textDocument()->setFontSettings(TextEditor::TextEditorSettings::fontSettings()); + m_preview->textDocument()->setSyntaxHighlighter(new CppEditor::CppHighlighter); + + TextEditor::DisplaySettings displaySettings = m_preview->displaySettings(); + displaySettings.m_visualizeWhitespace = true; + m_preview->setDisplaySettings(displaySettings); + QLayoutItem *lastItem = m_ui->verticalLayout->itemAt(m_ui->verticalLayout->count() - 1); if (lastItem->spacerItem()) m_ui->verticalLayout->removeItem(lastItem); @@ -164,8 +110,7 @@ void ClangFormatConfigWidget::initialize() m_ui->applyButton->hide(); m_ui->verticalLayout->addStretch(1); - connect(m_ui->createFileButton, &QPushButton::clicked, - this, [this]() { + connect(m_ui->createFileButton, &QPushButton::clicked, this, [this]() { createStyleFileIfNeeded(false); initialize(); }); @@ -174,9 +119,11 @@ void ClangFormatConfigWidget::initialize() m_ui->createFileButton->hide(); + Utils::FileName fileName; if (m_project) { m_ui->projectHasClangFormat->hide(); connect(m_ui->applyButton, &QPushButton::clicked, this, &ClangFormatConfigWidget::apply); + fileName = m_project->projectFilePath().appendPath("snippet.cpp"); } else { const Project *currentProject = SessionManager::startupProject(); if (!currentProject @@ -186,15 +133,27 @@ void ClangFormatConfigWidget::initialize() m_ui->projectHasClangFormat->hide(); } else { m_ui->projectHasClangFormat->setText( - tr("Current project has its own .clang-format file " - "and can be configured in Projects > Code Style > C++.")); + tr("Current project has its own .clang-format file " + "and can be configured in Projects > Code Style > C++.")); } createStyleFileIfNeeded(true); showGlobalCheckboxes(); m_ui->applyButton->hide(); + fileName = Utils::FileName::fromString(Core::ICore::userResourcePath()) + .appendPath("snippet.cpp"); } + m_preview->textDocument()->indenter()->setFileName(fileName); fillTable(); + updatePreview(); +} + +void ClangFormatConfigWidget::updatePreview() +{ + QTextCursor cursor(m_preview->document()); + cursor.setPosition(0); + cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); + m_preview->textDocument()->autoFormatOrIndent(cursor); } void ClangFormatConfigWidget::fillTable() @@ -202,8 +161,7 @@ void ClangFormatConfigWidget::fillTable() clang::format::FormatStyle style = m_project ? currentProjectStyle() : currentGlobalStyle(); std::string configText = clang::format::configurationAsText(style); - std::istringstream stream(configText); - readTable(m_ui->clangFormatOptionsTable, stream); + m_ui->clangFormatOptionsTable->setPlainText(QString::fromStdString(configText)); } ClangFormatConfigWidget::~ClangFormatConfigWidget() = default; @@ -218,7 +176,19 @@ void ClangFormatConfigWidget::apply() settings.write(); } - const QByteArray text = tableToYAML(m_ui->clangFormatOptionsTable); + const QString text = m_ui->clangFormatOptionsTable->toPlainText(); + clang::format::FormatStyle style; + style.Language = clang::format::FormatStyle::LK_Cpp; + const std::error_code error = clang::format::parseConfiguration(text.toStdString(), &style); + if (error.value() != static_cast<int>(clang::format::ParseError::Success)) { + QMessageBox::warning(this, + tr("Error in ClangFormat configuration"), + QString::fromStdString(error.message())); + fillTable(); + updatePreview(); + return; + } + QString filePath; if (m_project) filePath = m_project->projectDirectory().appendPath(Constants::SETTINGS_FILE_NAME).toString(); @@ -228,8 +198,10 @@ void ClangFormatConfigWidget::apply() if (!file.open(QFile::WriteOnly)) return; - file.write(text); + file.write(text.toUtf8()); file.close(); + + updatePreview(); } } // namespace ClangFormat diff --git a/src/plugins/clangformat/clangformatconfigwidget.h b/src/plugins/clangformat/clangformatconfigwidget.h index 7d3818b7a5..58570d9bf6 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.h +++ b/src/plugins/clangformat/clangformatconfigwidget.h @@ -29,7 +29,12 @@ #include <memory> -namespace ProjectExplorer { class Project; } +namespace ProjectExplorer { +class Project; +} +namespace TextEditor { +class SnippetEditorWidget; +} namespace ClangFormat { @@ -54,7 +59,10 @@ private: void hideGlobalCheckboxes(); void showGlobalCheckboxes(); + void updatePreview(); + ProjectExplorer::Project *m_project; + TextEditor::SnippetEditorWidget *m_preview; std::unique_ptr<Ui::ClangFormatConfigWidget> m_ui; }; diff --git a/src/plugins/clangformat/clangformatconfigwidget.ui b/src/plugins/clangformat/clangformatconfigwidget.ui index 2094bca109..41e40ef1fd 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.ui +++ b/src/plugins/clangformat/clangformatconfigwidget.ui @@ -55,7 +55,11 @@ </widget> </item> <item> - <widget class="QTableWidget" name="clangFormatOptionsTable"/> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QPlainTextEdit" name="clangFormatOptionsTable"/> + </item> + </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> diff --git a/src/plugins/clangformat/clangformatindenter.cpp b/src/plugins/clangformat/clangformatindenter.cpp index ef9dbf5d1c..42cedb7b6c 100644 --- a/src/plugins/clangformat/clangformatindenter.cpp +++ b/src/plugins/clangformat/clangformatindenter.cpp @@ -84,7 +84,10 @@ Utils::optional<TabSettings> ClangFormatIndenter::tabSettings() const int ClangFormatIndenter::lastSaveRevision() const { - return qobject_cast<TextEditor::TextDocumentLayout *>(m_doc->documentLayout())->lastSaveRevision; + auto *layout = qobject_cast<TextEditor::TextDocumentLayout *>(m_doc->documentLayout()); + if (!layout) + return 0; + return layout->lastSaveRevision; } bool ClangFormatIndenter::formatOnSave() const diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp index 6b151020d6..babe94da24 100644 --- a/src/plugins/clangformat/clangformatutils.cpp +++ b/src/plugins/clangformat/clangformatutils.cpp @@ -106,19 +106,44 @@ static Utils::FileName globalPath() return Utils::FileName::fromString(Core::ICore::userResourcePath()); } -static bool configForFileExists(Utils::FileName fileName) +static QString configForFile(Utils::FileName fileName) { + Utils::FileName topProjectPath = projectPath(); + if (topProjectPath.isEmpty()) + return QString(); + QDir projectDir(fileName.parentDir().toString()); while (!projectDir.exists(Constants::SETTINGS_FILE_NAME) && !projectDir.exists(Constants::SETTINGS_FILE_ALT_NAME)) { - if (!projectDir.cdUp()) - return false; + if (projectDir.path() == topProjectPath.toString() + || !Utils::FileName::fromString(projectDir.path()).isChildOf(topProjectPath) + || !projectDir.cdUp()) { + return QString(); + } } - return true; + + if (projectDir.exists(Constants::SETTINGS_FILE_NAME)) + return projectDir.filePath(Constants::SETTINGS_FILE_NAME); + return projectDir.filePath(Constants::SETTINGS_FILE_ALT_NAME); } -static clang::format::FormatStyle constructStyle(bool isGlobal) +static clang::format::FormatStyle constructStyle(bool isGlobal, + const QByteArray &baseStyle = QByteArray()) { + if (!baseStyle.isEmpty()) { + // Try to get the style for this base style. + Expected<FormatStyle> style = getStyle(baseStyle.toStdString(), + "dummy.cpp", + baseStyle.toStdString()); + if (style) + return *style; + + handleAllErrors(style.takeError(), [](const ErrorInfoBase &) { + // do nothing + }); + // Fallthrough to the default style. + } + FormatStyle style = getLLVMStyle(); style.BreakBeforeBraces = FormatStyle::BS_Custom; @@ -151,18 +176,37 @@ void createStyleFileIfNeeded(bool isGlobal) } } +static QByteArray configBaseStyleName(const QString &configFile) +{ + if (configFile.isEmpty()) + return QByteArray(); + + QFile config(configFile); + if (!config.open(QIODevice::ReadOnly)) + return QByteArray(); + + const QByteArray content = config.readAll(); + const char basedOnStyle[] = "BasedOnStyle:"; + int basedOnStyleIndex = content.indexOf(basedOnStyle); + if (basedOnStyleIndex < 0) + return QByteArray(); + + basedOnStyleIndex += sizeof(basedOnStyle) - 1; + const int endOfLineIndex = content.indexOf('\n', basedOnStyleIndex); + return content + .mid(basedOnStyleIndex, endOfLineIndex < 0 ? -1 : endOfLineIndex - basedOnStyleIndex) + .trimmed(); +} + clang::format::FormatStyle styleForFile(Utils::FileName fileName) { bool isGlobal = false; - if (!configForFileExists(fileName)) { - if (fileName.isChildOf(projectPath()) && CppCodeStyleSettings::currentProjectCodeStyle()) { - fileName = projectPath(); - } else { - fileName = globalPath(); - isGlobal = true; - } + QString configFile = configForFile(fileName); + if (configFile.isEmpty()) { + Utils::FileName path = fileName = globalPath(); fileName.appendPath(Constants::SAMPLE_FILE_NAME); - createStyleFileIfNeeded(isGlobal); + createStyleFileIfNeeded(true); + configFile = path.appendPath(Constants::SETTINGS_FILE_NAME).toString(); } Expected<FormatStyle> style = format::getStyle("file", @@ -175,7 +219,7 @@ clang::format::FormatStyle styleForFile(Utils::FileName fileName) // do nothing }); - return constructStyle(isGlobal); + return constructStyle(isGlobal, configBaseStyleName(configFile)); } clang::format::FormatStyle currentProjectStyle() diff --git a/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp b/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp index 90ba8f62bc..8f7ea72242 100644 --- a/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp +++ b/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp @@ -65,12 +65,19 @@ public: Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}, 1000ms}; ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database}; ClangBackEnd::FilePathCaching filePathCache{database}; - ClangPchManager::ProgressManager progressManager{ - [] (QFutureInterface<void> &promise) { - auto title = QCoreApplication::translate("ClangPchProgressManager", "Creating PCHs", "PCH stands for precompiled header"); - Core::ProgressManager::addTask(promise.future(), title, "pch creation", nullptr); + ClangPchManager::ProgressManager pchCreationProgressManager{[](QFutureInterface<void> &promise) { + auto title = QCoreApplication::translate("ClangPchProgressManager", + "Creating PCHs", + "PCH stands for precompiled header"); + Core::ProgressManager::addTask(promise.future(), title, "pch creation", nullptr); }}; - PchManagerClient pchManagerClient{progressManager}; + ClangPchManager::ProgressManager dependencyCreationProgressManager{ + [](QFutureInterface<void> &promise) { + auto title = QCoreApplication::translate("ClangPchProgressManager", + "Creating Dependencies"); + Core::ProgressManager::addTask(promise.future(), title, "dependency creation", nullptr); + }}; + PchManagerClient pchManagerClient{pchCreationProgressManager, dependencyCreationProgressManager}; PchManagerConnectionClient connectionClient{&pchManagerClient}; QtCreatorProjectUpdater<PchManagerProjectUpdater> projectUpdate{connectionClient.serverProxy(), pchManagerClient, diff --git a/src/plugins/clangpchmanager/pchmanagerclient.cpp b/src/plugins/clangpchmanager/pchmanagerclient.cpp index 56e64b2b56..4b0b5430d7 100644 --- a/src/plugins/clangpchmanager/pchmanagerclient.cpp +++ b/src/plugins/clangpchmanager/pchmanagerclient.cpp @@ -53,7 +53,16 @@ void PchManagerClient::precompiledHeadersUpdated(ClangBackEnd::PrecompiledHeader void PchManagerClient::progress(ClangBackEnd::ProgressMessage &&message) { - m_progressManager.setProgress(message.progress, message.total); + switch (message.progressType) { + case ClangBackEnd::ProgressType::PrecompiledHeader: + m_pchCreationProgressManager.setProgress(message.progress, message.total); + break; + case ClangBackEnd::ProgressType::DependencyCreation: + m_dependencyCreationProgressManager.setProgress(message.progress, message.total); + break; + default: + break; + } } void PchManagerClient::precompiledHeaderRemoved(const QString &projectPartId) diff --git a/src/plugins/clangpchmanager/pchmanagerclient.h b/src/plugins/clangpchmanager/pchmanagerclient.h index d7c0b68f71..ccbd03299a 100644 --- a/src/plugins/clangpchmanager/pchmanagerclient.h +++ b/src/plugins/clangpchmanager/pchmanagerclient.h @@ -42,8 +42,10 @@ class CLANGPCHMANAGER_EXPORT PchManagerClient final : public ClangBackEnd::PchMa { friend class PchManagerNotifierInterface; public: - PchManagerClient(ProgressManagerInterface &progressManager) - : m_progressManager(progressManager) + PchManagerClient(ProgressManagerInterface &pchCreationProgressManager, + ProgressManagerInterface &dependencyCreationProgressManager) + : m_pchCreationProgressManager(pchCreationProgressManager) + , m_dependencyCreationProgressManager(dependencyCreationProgressManager) {} void alive() override; @@ -78,7 +80,8 @@ private: ClangBackEnd::ProjectPartPchs m_projectPartPchs; std::vector<PchManagerNotifierInterface*> m_notifiers; PchManagerConnectionClient *m_connectionClient=nullptr; - ProgressManagerInterface &m_progressManager; + ProgressManagerInterface &m_pchCreationProgressManager; + ProgressManagerInterface &m_dependencyCreationProgressManager; }; } // namespace ClangPchManager diff --git a/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp b/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp index 812445610e..6db0db0974 100644 --- a/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp +++ b/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp @@ -87,9 +87,9 @@ QString PchManagerConnectionClient::outputName() const return QStringLiteral("PchManagerConnectionClient"); } -void PchManagerConnectionClient::newConnectedServer(QIODevice *ioDevice) +void PchManagerConnectionClient::newConnectedServer(QLocalSocket *localSocket) { - m_serverProxy.setIoDevice(ioDevice); + m_serverProxy.setLocalSocket(localSocket); } } // namespace ClangPchManager diff --git a/src/plugins/clangpchmanager/pchmanagerconnectionclient.h b/src/plugins/clangpchmanager/pchmanagerconnectionclient.h index 672b6ef7cf..7189c83c0b 100644 --- a/src/plugins/clangpchmanager/pchmanagerconnectionclient.h +++ b/src/plugins/clangpchmanager/pchmanagerconnectionclient.h @@ -42,7 +42,7 @@ protected: void sendEndCommand() override; void resetState() override; QString outputName() const override; - void newConnectedServer(QIODevice *ioDevice) override; + void newConnectedServer(QLocalSocket *localSocket) override; private: ClangBackEnd::PchManagerServerProxy m_serverProxy; diff --git a/src/plugins/clangpchmanager/progressmanager.h b/src/plugins/clangpchmanager/progressmanager.h index cc6ab1946c..9dc9fc0366 100644 --- a/src/plugins/clangpchmanager/progressmanager.h +++ b/src/plugins/clangpchmanager/progressmanager.h @@ -52,7 +52,8 @@ public: if (!m_promise) initialize(); - m_promise->setExpectedResultCount(maximumProgress); + if (m_promise->progressMaximum() != maximumProgress) + m_promise->setProgressRange(0, maximumProgress); m_promise->setProgressValue(currentProgress); if (currentProgress >= maximumProgress) diff --git a/src/plugins/clangrefactoring/refactoringconnectionclient.cpp b/src/plugins/clangrefactoring/refactoringconnectionclient.cpp index 865c9d53d1..ff66ec20cb 100644 --- a/src/plugins/clangrefactoring/refactoringconnectionclient.cpp +++ b/src/plugins/clangrefactoring/refactoringconnectionclient.cpp @@ -44,9 +44,8 @@ QString currentProcessId() RefactoringConnectionClient::RefactoringConnectionClient(RefactoringClientInterface *client) : ConnectionClient(Utils::TemporaryDirectory::masterDirectoryPath() - + QStringLiteral("/ClangRefactoringBackEnd-") - + currentProcessId()), - m_serverProxy(client, nullptr) + + QStringLiteral("/ClangRefactoringBackEnd-") + currentProcessId()) + , m_serverProxy(client) { m_processCreator.setTemporaryDirectoryPattern("clangrefactoringbackend-XXXXXX"); m_processCreator.setArguments({connectionName(), @@ -81,9 +80,9 @@ QString RefactoringConnectionClient::outputName() const return QStringLiteral("RefactoringConnectionClient"); } -void RefactoringConnectionClient::newConnectedServer(QIODevice *ioDevice) +void RefactoringConnectionClient::newConnectedServer(QLocalSocket *localSocket) { - m_serverProxy.setIoDevice(ioDevice); + m_serverProxy.setLocalSocket(localSocket); } } // namespace ClangBackEnd diff --git a/src/plugins/clangrefactoring/refactoringconnectionclient.h b/src/plugins/clangrefactoring/refactoringconnectionclient.h index 16734f7ed9..3db871e6a2 100644 --- a/src/plugins/clangrefactoring/refactoringconnectionclient.h +++ b/src/plugins/clangrefactoring/refactoringconnectionclient.h @@ -44,7 +44,7 @@ protected: void sendEndCommand() override; void resetState() override; QString outputName() const override; - void newConnectedServer(QIODevice *ioDevice) override; + void newConnectedServer(QLocalSocket *localSocket) override; private: RefactoringServerProxy m_serverProxy; diff --git a/src/plugins/clangtools/clangfixitsrefactoringchanges.cpp b/src/plugins/clangtools/clangfixitsrefactoringchanges.cpp index 4be95a2744..c3b6f4ac3e 100644 --- a/src/plugins/clangtools/clangfixitsrefactoringchanges.cpp +++ b/src/plugins/clangtools/clangfixitsrefactoringchanges.cpp @@ -85,9 +85,6 @@ bool FixitsRefactoringFile::apply() ICodeStylePreferencesFactory *factory = TextEditorSettings::codeStyleFactory( CppTools::Constants::CPP_SETTINGS_ID); - const TextEditor::TabSettings tabSettings - = CppTools::CppCodeStyleSettings::currentProjectTabSettings(); - // Apply changes std::unique_ptr<TextEditor::Indenter> indenter; QString lastFilename; diff --git a/src/plugins/cppeditor/cpphighlighter.cpp b/src/plugins/cppeditor/cpphighlighter.cpp index 075791b021..a7531acf1e 100644 --- a/src/plugins/cppeditor/cpphighlighter.cpp +++ b/src/plugins/cppeditor/cpphighlighter.cpp @@ -35,7 +35,7 @@ #include <QTextDocument> -using namespace CppEditor::Internal; +using namespace CppEditor; using namespace TextEditor; using namespace CPlusPlus; diff --git a/src/plugins/cppeditor/cpphighlighter.h b/src/plugins/cppeditor/cpphighlighter.h index e43ce63172..a982191b7e 100644 --- a/src/plugins/cppeditor/cpphighlighter.h +++ b/src/plugins/cppeditor/cpphighlighter.h @@ -25,6 +25,8 @@ #pragma once +#include "cppeditor_global.h" + #include <texteditor/syntaxhighlighter.h> #include <cplusplus/Token.h> @@ -33,10 +35,7 @@ namespace CppEditor { -namespace Internal { - - -class CppHighlighter : public TextEditor::SyntaxHighlighter +class CPPEDITOR_EXPORT CppHighlighter : public TextEditor::SyntaxHighlighter { Q_OBJECT @@ -58,5 +57,4 @@ private: CPlusPlus::LanguageFeatures m_languageFeatures = CPlusPlus::LanguageFeatures::defaultFeatures(); }; -} // namespace Internal } // namespace CppEditor diff --git a/src/plugins/cpptools/cppcodestylesettingspage.cpp b/src/plugins/cpptools/cppcodestylesettingspage.cpp index 39517e6e35..ef62ad1fa3 100644 --- a/src/plugins/cpptools/cppcodestylesettingspage.cpp +++ b/src/plugins/cpptools/cppcodestylesettingspage.cpp @@ -26,6 +26,7 @@ #include "cppcodestylesettingspage.h" #include "cppcodestylepreferences.h" +#include "cppcodestylesnippets.h" #include "cpppointerdeclarationformatter.h" #include "cppqtstyleindenter.h" #include "cpptoolsconstants.h" @@ -49,170 +50,6 @@ #include <QTextBlock> #include <QTextStream> -static const char *defaultCodeStyleSnippets[] = { - "#include <math.h>\n" - "\n" - "class Complex\n" - " {\n" - "public:\n" - " Complex(double re, double im)\n" - " : _re(re), _im(im)\n" - " {}\n" - " double modulus() const\n" - " {\n" - " return sqrt(_re * _re + _im * _im);\n" - " }\n" - "private:\n" - " double _re;\n" - " double _im;\n" - " };\n" - "\n" - "void bar(int i)\n" - " {\n" - " static int counter = 0;\n" - " counter += i;\n" - " }\n" - "\n" - "namespace Foo\n" - " {\n" - " namespace Bar\n" - " {\n" - " void foo(int a, int b)\n" - " {\n" - " for (int i = 0; i < a; i++)\n" - " {\n" - " if (i < b)\n" - " bar(i);\n" - " else\n" - " {\n" - " bar(i);\n" - " bar(b);\n" - " }\n" - " }\n" - " }\n" - " } // namespace Bar\n" - " } // namespace Foo\n" - , - "#include <math.h>\n" - "\n" - "class Complex\n" - " {\n" - "public:\n" - " Complex(double re, double im)\n" - " : _re(re), _im(im)\n" - " {}\n" - " double modulus() const\n" - " {\n" - " return sqrt(_re * _re + _im * _im);\n" - " }\n" - "private:\n" - " double _re;\n" - " double _im;\n" - " };\n" - "\n" - "void bar(int i)\n" - " {\n" - " static int counter = 0;\n" - " counter += i;\n" - " }\n" - "\n" - "namespace Foo\n" - " {\n" - " namespace Bar\n" - " {\n" - " void foo(int a, int b)\n" - " {\n" - " for (int i = 0; i < a; i++)\n" - " {\n" - " if (i < b)\n" - " bar(i);\n" - " else\n" - " {\n" - " bar(i);\n" - " bar(b);\n" - " }\n" - " }\n" - " }\n" - " } // namespace Bar\n" - " } // namespace Foo\n" - , - "namespace Foo\n" - "{\n" - "namespace Bar\n" - "{\n" - "class FooBar\n" - " {\n" - "public:\n" - " FooBar(int a)\n" - " : _a(a)\n" - " {}\n" - " int calculate() const\n" - " {\n" - " if (a > 10)\n" - " {\n" - " int b = 2 * a;\n" - " return a * b;\n" - " }\n" - " return -a;\n" - " }\n" - "private:\n" - " int _a;\n" - " };\n" - "}\n" - "}\n" - , - "#include \"bar.h\"\n" - "\n" - "int foo(int a)\n" - " {\n" - " switch (a)\n" - " {\n" - " case 1:\n" - " bar(1);\n" - " break;\n" - " case 2:\n" - " {\n" - " bar(2);\n" - " break;\n" - " }\n" - " case 3:\n" - " default:\n" - " bar(3);\n" - " break;\n" - " }\n" - " return 0;\n" - " }\n" - , - "void foo() {\n" - " if (a &&\n" - " b)\n" - " c;\n" - "\n" - " while (a ||\n" - " b)\n" - " break;\n" - " a = b +\n" - " c;\n" - " myInstance.longMemberName +=\n" - " foo;\n" - " myInstance.longMemberName += bar +\n" - " foo;\n" - "}\n" - , - "int *foo(const Bar &b1, Bar &&b2, int*, int *&rpi)\n" - "{\n" - " int*pi = 0;\n" - " int*const*const cpcpi = π\n" - " int*const*pcpi = π\n" - " int**const cppi = π\n" - "\n" - " void (*foo)(char *s) = 0;\n" - " int (*bar)[] = 0;\n" - "\n" - " return pi;\n" - "}\n" -}; - using namespace TextEditor; namespace CppTools { @@ -270,7 +107,7 @@ CppCodeStylePreferencesWidget::CppCodeStylePreferencesWidget(QWidget *parent) << m_ui->previewTextEditBraces << m_ui->previewTextEditSwitch << m_ui->previewTextEditPadding << m_ui->previewTextEditPointerReferences; for (int i = 0; i < m_previews.size(); ++i) - m_previews[i]->setPlainText(QLatin1String(defaultCodeStyleSnippets[i])); + m_previews[i]->setPlainText(QLatin1String(Constants::DEFAULT_CODE_STYLE_SNIPPETS[i])); decorateEditors(TextEditorSettings::fontSettings()); connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged, diff --git a/src/plugins/cpptools/cppcodestylesnippets.h b/src/plugins/cpptools/cppcodestylesnippets.h new file mode 100644 index 0000000000..b1f8ce199c --- /dev/null +++ b/src/plugins/cpptools/cppcodestylesnippets.h @@ -0,0 +1,190 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +namespace CppTools { +namespace Constants { + +static const char *DEFAULT_CODE_STYLE_SNIPPETS[] + = {"#include <math.h>\n" + "\n" + "class Complex\n" + " {\n" + "public:\n" + " Complex(double re, double im)\n" + " : _re(re), _im(im)\n" + " {}\n" + " double modulus() const\n" + " {\n" + " return sqrt(_re * _re + _im * _im);\n" + " }\n" + "private:\n" + " double _re;\n" + " double _im;\n" + " };\n" + "\n" + "void bar(int i)\n" + " {\n" + " static int counter = 0;\n" + " counter += i;\n" + " }\n" + "\n" + "namespace Foo\n" + " {\n" + " namespace Bar\n" + " {\n" + " void foo(int a, int b)\n" + " {\n" + " for (int i = 0; i < a; i++)\n" + " {\n" + " if (i < b)\n" + " bar(i);\n" + " else\n" + " {\n" + " bar(i);\n" + " bar(b);\n" + " }\n" + " }\n" + " }\n" + " } // namespace Bar\n" + " } // namespace Foo\n", + "#include <math.h>\n" + "\n" + "class Complex\n" + " {\n" + "public:\n" + " Complex(double re, double im)\n" + " : _re(re), _im(im)\n" + " {}\n" + " double modulus() const\n" + " {\n" + " return sqrt(_re * _re + _im * _im);\n" + " }\n" + "private:\n" + " double _re;\n" + " double _im;\n" + " };\n" + "\n" + "void bar(int i)\n" + " {\n" + " static int counter = 0;\n" + " counter += i;\n" + " }\n" + "\n" + "namespace Foo\n" + " {\n" + " namespace Bar\n" + " {\n" + " void foo(int a, int b)\n" + " {\n" + " for (int i = 0; i < a; i++)\n" + " {\n" + " if (i < b)\n" + " bar(i);\n" + " else\n" + " {\n" + " bar(i);\n" + " bar(b);\n" + " }\n" + " }\n" + " }\n" + " } // namespace Bar\n" + " } // namespace Foo\n", + "namespace Foo\n" + "{\n" + "namespace Bar\n" + "{\n" + "class FooBar\n" + " {\n" + "public:\n" + " FooBar(int a)\n" + " : _a(a)\n" + " {}\n" + " int calculate() const\n" + " {\n" + " if (a > 10)\n" + " {\n" + " int b = 2 * a;\n" + " return a * b;\n" + " }\n" + " return -a;\n" + " }\n" + "private:\n" + " int _a;\n" + " };\n" + "}\n" + "}\n", + "#include \"bar.h\"\n" + "\n" + "int foo(int a)\n" + " {\n" + " switch (a)\n" + " {\n" + " case 1:\n" + " bar(1);\n" + " break;\n" + " case 2:\n" + " {\n" + " bar(2);\n" + " break;\n" + " }\n" + " case 3:\n" + " default:\n" + " bar(3);\n" + " break;\n" + " }\n" + " return 0;\n" + " }\n", + "void foo() {\n" + " if (a &&\n" + " b)\n" + " c;\n" + "\n" + " while (a ||\n" + " b)\n" + " break;\n" + " a = b +\n" + " c;\n" + " myInstance.longMemberName +=\n" + " foo;\n" + " myInstance.longMemberName += bar +\n" + " foo;\n" + "}\n", + "int *foo(const Bar &b1, Bar &&b2, int*, int *&rpi)\n" + "{\n" + " int*pi = 0;\n" + " int*const*const cpcpi = π\n" + " int*const*pcpi = π\n" + " int**const cppi = π\n" + "\n" + " void (*foo)(char *s) = 0;\n" + " int (*bar)[] = 0;\n" + "\n" + " return pi;\n" + "}\n"}; + +} // namespace Constants +} // namespace CppTools diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp index 5ff64b165d..187f5d5913 100644 --- a/src/plugins/cpptools/cppfilesettingspage.cpp +++ b/src/plugins/cpptools/cppfilesettingspage.cpp @@ -37,6 +37,7 @@ #include <utils/environment.h> #include <utils/fileutils.h> +#include <utils/hostosinfo.h> #include <utils/mimetypes/mimedatabase.h> #include <QSettings> @@ -173,7 +174,8 @@ static bool keyWordReplacement(const QString &keyWord, return true; } if (keyWord == QLatin1String("%USER%")) { - *value = QLatin1String("%{Env:USER}"); + *value = Utils::HostOsInfo::isWindowsHost() ? QLatin1String("%{Env:USERNAME}") + : QLatin1String("%{Env:USER}"); return true; } // Environment variables (for example '%$EMAIL%'). diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro index a55e805af4..04b7ce1adc 100644 --- a/src/plugins/cpptools/cpptools.pro +++ b/src/plugins/cpptools/cpptools.pro @@ -26,6 +26,7 @@ HEADERS += \ cppcodestylepreferencesfactory.h \ cppcodestylesettings.h \ cppcodestylesettingspage.h \ + cppcodestylesnippets.h \ cppcompletionassist.h \ cppcompletionassistprocessor.h \ cppcompletionassistprovider.h \ diff --git a/src/plugins/cpptools/cpptools.qbs b/src/plugins/cpptools/cpptools.qbs index 89062d3a21..85e086ddf9 100644 --- a/src/plugins/cpptools/cpptools.qbs +++ b/src/plugins/cpptools/cpptools.qbs @@ -82,6 +82,7 @@ Project { "cppcodestylesettingspage.cpp", "cppcodestylesettingspage.h", "cppcodestylesettingspage.ui", + "cppcodestylesnippets.h", "cppcompletionassist.cpp", "cppcompletionassist.h", "cppcompletionassistprocessor.cpp", diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 76f6301db6..9acc34e6ab 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -372,24 +372,16 @@ void DebuggerMainWindowPrivate::fixupLayoutIfNeeded() { // Evil workaround for QTCREATORBUG-21455: In some so far unknown situation // the saveLayout/restoreLayout process leads to a situation where some docks - // does not end up below the perspective toolbar even though they were there + // do not end up below the perspective toolbar even though they were there // initially, leading to an awkward dock layout. - // This here tries to detect the situation (no other dock directly below the - // toolbar) and "corrects" that by restoring the default layout. - const QRect toolbarRect = m_toolBarDock->geometry(); - const int targetX = toolbarRect.left(); - const int targetY = toolbarRect.bottom(); - - const QList<QDockWidget *> docks = q->dockWidgets(); - for (QDockWidget *dock : docks) { - const QRect dockRect = dock->geometry(); - // 10 for some decoration wiggle room. Found something below? Good. - if (targetX == dockRect.left() && qAbs(targetY - dockRect.top()) < 10) - return; - } + // This here tries to detect the situation (sonmething else in the bottom + // area is at the right of the toolbar) "corrects" that by restoring the + // default layout. - qDebug() << "Scrambled dock layout found. Resetting it."; - resetCurrentPerspective(); + if (m_toolBarDock->width() != q->width()) { + qDebug() << "Scrambled dock layout found. Resetting it."; + resetCurrentPerspective(); + } } void DebuggerMainWindowPrivate::selectPerspective(Perspective *perspective) diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 648213c862..fd1f92ec64 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1410,7 +1410,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, m_perspective.addWindow(m_engineManagerWindow, Perspective::SplitVertical, nullptr); m_perspective.addWindow(m_breakpointManagerWindow, Perspective::SplitHorizontal, m_engineManagerWindow); - m_perspective.addWindow(m_globalLogWindow, Perspective::AddToTab, m_breakpointManagerWindow, false); + m_perspective.addWindow(m_globalLogWindow, Perspective::AddToTab, nullptr, false, Qt::TopDockWidgetArea); setInitialState(); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index d28c6bb263..9fdd6a2790 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -291,6 +291,7 @@ GitDiffEditorController::GitDiffEditorController(IDocument *document, const QStr { connect(&m_decorator, &DescriptionWidgetDecorator::branchListRequested, this, &GitDiffEditorController::updateBranchList); + setDisplayName("Git Diff"); } void GitDiffEditorController::updateBranchList() @@ -514,7 +515,9 @@ public: GitDiffEditorController(document, dir), m_id(id), m_state(Idle) - { } + { + setDisplayName("Git Show"); + } void reload() override; void processCommandOutput(const QString &output) override; diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 4e3f6e37e3..f311d824c3 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -68,6 +68,7 @@ protected: MercurialDiffEditorController::MercurialDiffEditorController(IDocument *document, const QString &workingDirectory): VcsBaseDiffEditorController(document, MercurialPlugin::client(), workingDirectory) { + setDisplayName("Hg Diff"); } void MercurialDiffEditorController::runCommand(const QList<QStringList> &args, QTextCodec *codec) diff --git a/src/plugins/perfprofiler/PerfProfiler.json.in b/src/plugins/perfprofiler/PerfProfiler.json.in index 7a0d175bc1..af54edf549 100644 --- a/src/plugins/perfprofiler/PerfProfiler.json.in +++ b/src/plugins/perfprofiler/PerfProfiler.json.in @@ -3,7 +3,6 @@ \"Version\" : \"$$QTCREATOR_VERSION\", \"CompatVersion\" : \"$$QTCREATOR_COMPAT_VERSION\", \"Revision\" : \"$$QTC_PLUGIN_REVISION\", - \"DisabledByDefault\" : true, \"Vendor\" : \"The Qt Company Ltd\", \"Copyright\" : \"(C) $$QTCREATOR_COPYRIGHT_YEAR The Qt Company Ltd\", \"License\" : [ \"Commercial Usage\", diff --git a/src/plugins/projectexplorer/abiwidget.cpp b/src/plugins/projectexplorer/abiwidget.cpp index 835dff757d..7135f2891a 100644 --- a/src/plugins/projectexplorer/abiwidget.cpp +++ b/src/plugins/projectexplorer/abiwidget.cpp @@ -140,10 +140,12 @@ AbiWidget::AbiWidget(QWidget *parent) : QWidget(parent), d->m_wordWidthComboBox = new QComboBox(this); layout->addWidget(d->m_wordWidthComboBox); + d->m_wordWidthComboBox->addItem(Abi::toString(16), 16); d->m_wordWidthComboBox->addItem(Abi::toString(32), 32); d->m_wordWidthComboBox->addItem(Abi::toString(64), 64); d->m_wordWidthComboBox->addItem(Abi::toString(0), 0); - d->m_wordWidthComboBox->setCurrentIndex(2); + // Setup current word width of 0 by default. + d->m_wordWidthComboBox->setCurrentIndex(d->m_wordWidthComboBox->count() - 1); connect(d->m_wordWidthComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &AbiWidget::customComboBoxesChanged); diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index f36a6b9440..26763ed5d5 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -52,7 +52,6 @@ #include <QLoggingCategory> #include <QRegularExpression> -#include <algorithm> #include <memory> namespace { @@ -343,6 +342,11 @@ bool GccToolChain::isValid() const return fi.isExecutable(); } +static bool isNetworkCompiler(const QString &dirPath) +{ + return dirPath.contains("icecc") || dirPath.contains("distcc"); +} + static Utils::FileName findLocalCompiler(const Utils::FileName &compilerPath, const Environment &env) { @@ -351,21 +355,13 @@ static Utils::FileName findLocalCompiler(const Utils::FileName &compilerPath, // Get the path to the compiler, ignoring direct calls to icecc and distcc as we cannot // do anything about those. - const Utils::FileName compilerDir = compilerPath.parentDir(); - const QString compilerDirString = compilerDir.toString(); - if (!compilerDirString.contains("icecc") && !compilerDirString.contains("distcc")) + if (!isNetworkCompiler(compilerPath.parentDir().toString())) return compilerPath; - FileNameList pathComponents = env.path(); - auto it = std::find_if(pathComponents.begin(), pathComponents.end(), - [compilerDir](const FileName &p) { - return p == compilerDir; + // Filter out network compilers + const FileNameList pathComponents = Utils::filtered(env.path(), [] (const FileName &dirPath) { + return !isNetworkCompiler(dirPath.toString()); }); - if (it != pathComponents.end()) { - std::rotate(pathComponents.begin(), it, pathComponents.end()); - pathComponents.removeFirst(); // remove directory of compilerPath - // No need to put it at the end again, it is in PATH anyway... - } // This effectively searches the PATH twice, once via pathComponents and once via PATH itself: // searchInPath filters duplicates, so that will not hurt. @@ -402,15 +398,7 @@ ToolChain::MacroInspectionRunner GccToolChain::createMacroInspectionRunner() con || a == "-gcc-toolchain" || a == "-target") { if (++iArg < allFlags.length()) arguments << a << allFlags.at(iArg); - } else if (a == "-m128bit-long-double" || a == "-m32" || a == "-m3dnow" - || a == "-m3dnowa" || a == "-m64" || a == "-m96bit-long-double" - || a == "-mabm" || a == "-maes" || a.startsWith("-march=") || a == "-mavx" - || a.startsWith("-masm=") || a.startsWith("-mfloat-abi") || a == "-mcx16" - || a == "-mfma" || a == "-mfma4" || a == "-mlwp" || a == "-mpclmul" - || a == "-mpopcnt" || a == "-msse" || a == "-msse2" || a == "-msse2avx" - || a == "-msse3" || a == "-msse4" || a == "-msse4.1" || a == "-msse4.2" - || a == "-msse4a" || a == "-mssse3" || a.startsWith("-mtune=") - || a == "-mxop" || a == "-Os" || a == "-O0" || a == "-O1" || a == "-O2" + } else if (a.startsWith("-m") || a == "-Os" || a == "-O0" || a == "-O1" || a == "-O2" || a == "-O3" || a == "-ffinite-math-only" || a == "-fshort-double" || a == "-fshort-wchar" || a == "-fsignaling-nans" || a == "-fno-inline" || a == "-fno-exceptions" || a == "-fstack-protector" diff --git a/src/plugins/projectexplorer/makestep.ui b/src/plugins/projectexplorer/makestep.ui index 0ce98f0bae..b6ddcc6897 100644 --- a/src/plugins/projectexplorer/makestep.ui +++ b/src/plugins/projectexplorer/makestep.ui @@ -79,6 +79,9 @@ <property name="minimum"> <number>1</number> </property> + <property name="maximum"> + <number>999</number> + </property> </widget> </item> <item> diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index c3b5d68806..ad588a12bd 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -44,6 +44,7 @@ #include "projectexplorersettingspage.h" #include "projectmanager.h" #include "removetaskhandler.h" +#include "runconfigurationaspects.h" #include "kitfeatureprovider.h" #include "kitmanager.h" #include "kitoptionspage.h" @@ -1595,8 +1596,14 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er tr("The currently active run configuration's executable (if applicable)."), []() -> QString { if (Target *target = activeTarget()) { - if (RunConfiguration *rc = target->activeRunConfiguration()) - return rc->runnable().executable; + if (RunConfiguration *rc = target->activeRunConfiguration()) { + // TODO: This duplicates code and is not always correct, but see + // QTCREATORBUG-18317. + // Solution: Re-introduce RunConfiguration::executable()? + if (auto executableAspect = rc->aspect<ExecutableAspect>()) + return executableAspect->executable().toString(); + return QString(); + } } return QString(); }); @@ -3459,15 +3466,12 @@ void ProjectExplorerPluginPrivate::removeProject() Node *node = ProjectTree::findCurrentNode(); if (!node) return; - ProjectNode *subProjectNode = node->managingProject(); - if (!subProjectNode) - return; - ProjectNode *projectNode = subProjectNode->managingProject(); + ProjectNode *projectNode = node->managingProject(); if (projectNode) { - Utils::RemoveFileDialog removeFileDialog(subProjectNode->filePath().toString(), ICore::mainWindow()); + Utils::RemoveFileDialog removeFileDialog(node->filePath().toString(), ICore::mainWindow()); removeFileDialog.setDeleteFileVisible(false); if (removeFileDialog.exec() == QDialog::Accepted) - projectNode->removeSubProject(subProjectNode->filePath().toString()); + projectNode->removeSubProject(node->filePath().toString()); } } diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index ae0c72bdd2..874b38df57 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -378,6 +378,8 @@ void FlatModel::saveExpandData() void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet<Node *> *seen) { for (Node *node : folderNode->nodes()) { + if (m_filterGeneratedFiles && node->isGenerated()) + continue; if (FolderNode *subFolderNode = node->asFolderNode()) { const bool isHidden = m_filterProjects && !subFolderNode->showInSimpleTree(); if (!isHidden && !seen->contains(subFolderNode)) { @@ -390,8 +392,7 @@ void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet< addFolderNode(parent, subFolderNode, seen); } } else if (FileNode *fileNode = node->asFileNode()) { - const bool isHidden = m_filterGeneratedFiles && fileNode->isGenerated(); - if (!isHidden && !seen->contains(fileNode)) { + if (!seen->contains(fileNode)) { seen->insert(fileNode); parent->appendChild(new WrapperNode(fileNode)); } diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index fc1cdc4e5a..a3c06295ae 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -132,7 +132,7 @@ bool QmakePriFileNode::supportsAction(ProjectAction action, const Node *node) co break; } case ProjectType::SubDirsTemplate: - if (action == AddSubProject || action == RemoveSubProject || action == AddExistingProject) + if (action == AddSubProject || action == AddExistingProject) return true; break; default: @@ -344,6 +344,13 @@ bool QmakeProFileNode::includedInExactParse() const return pro && pro->includedInExactParse(); } +bool QmakeProFileNode::supportsAction(ProjectAction action, const Node *node) const +{ + if (action == RemoveSubProject) + return parentProjectNode() && !parentProjectNode()->asContainerNode(); + return QmakePriFileNode::supportsAction(action, node); +} + FolderNode::AddNewInformation QmakeProFileNode::addNewInformation(const QStringList &files, Node *context) const { Q_UNUSED(files) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h index 6b2f79131d..0f25f13474 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.h +++ b/src/plugins/qmakeprojectmanager/qmakenodes.h @@ -90,6 +90,7 @@ public: bool isQtcRunnable() const; bool includedInExactParse() const; + bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const override; bool showInSimpleTree() const override; QString buildKey() const override; diff --git a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp index adba361c15..5e7f1e7880 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp @@ -168,8 +168,12 @@ static void createTree(const QmakePriFile *pri, QmakePriFileNode *node, const Fi int eid = vfs->idForFileName(file.toString(), QMakeVfs::VfsExact); vfs->readFile(eid, &contents, &errorMessage); } - vfolder->addNode(std::make_unique<ResourceEditor::ResourceTopLevelNode> - (file, vfolder->filePath(), contents)); + auto topLevel = std::make_unique<ResourceEditor::ResourceTopLevelNode> + (file, vfolder->filePath(), contents); + const QString baseName = file.toFileInfo().completeBaseName(); + topLevel->setIsGenerated(baseName.startsWith("qmake_") + || baseName.endsWith("_qmlcache")); + vfolder->addNode(std::move(topLevel)); } } else { for (const FileName &fn : newFilePaths) { diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index c0034972d6..1a401ee953 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -1246,6 +1246,7 @@ static bool evaluateOne(const QmakeEvalInput &input, ProFile *pro, QStringList basecfgs = reader->values(build + QLatin1String(".CONFIG")); basecfgs += build; basecfgs += QLatin1String("build_pass"); + basecfgs += "qtc_run"; basevars[QLatin1String("BUILD_PASS")] = QStringList(build); QStringList buildname = reader->values(build + QLatin1String(".name")); basevars[QLatin1String("BUILD_NAME")] = (buildname.isEmpty() ? QStringList(build) : buildname); diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp index b5a29ba620..d440818d4c 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp @@ -265,19 +265,30 @@ void QmakeProjectImporter::deleteDirectoryData(void *directoryData) const delete static_cast<DirectoryData *>(directoryData); } -static ToolChain *preferredToolChain(BaseQtVersion *qtVersion, const FileName &ms, - const QMakeStepConfig::TargetArchConfig &archConfig) +static const QList<ToolChain *> preferredToolChains(BaseQtVersion *qtVersion, const FileName &ms, + const QMakeStepConfig::TargetArchConfig &archConfig) { const FileName spec = ms.isEmpty() ? qtVersion->mkspec() : ms; const QList<ToolChain *> toolchains = ToolChainManager::toolChains(); QList<Abi> qtAbis = qtVersion->qtAbis(); - return findOr(toolchains, toolchains.isEmpty() ? nullptr : toolchains.first(), - [&](ToolChain *tc) { + const auto matcher = [&](const ToolChain *tc) { return qtAbis.contains(tc->targetAbi()) - && tc->suggestedMkspecList().contains(spec) - && QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig; + && tc->suggestedMkspecList().contains(spec) + && QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig; + }; + ToolChain * const cxxToolchain = findOrDefault(toolchains, [matcher](const ToolChain *tc) { + return tc->language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID && matcher(tc); }); + ToolChain * const cToolchain = findOrDefault(toolchains, [matcher](const ToolChain *tc) { + return tc->language() == ProjectExplorer::Constants::C_LANGUAGE_ID && matcher(tc); + }); + QList<ToolChain *> chosenToolchains; + for (ToolChain * const tc : {cxxToolchain, cToolchain}) { + if (tc) + chosenToolchains << tc; + }; + return chosenToolchains; } Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersionData &data, @@ -288,7 +299,8 @@ Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersion Q_UNUSED(osType); // TODO use this to select the right toolchain? return QtProjectImporter::createTemporaryKit(data, [&data, parsedSpec, archConfig](Kit *k) -> void { - ToolChainKitAspect::setToolChain(k, preferredToolChain(data.qt, parsedSpec, archConfig)); + for (ToolChain * const tc : preferredToolChains(data.qt, parsedSpec, archConfig)) + ToolChainKitAspect::setToolChain(k, tc); if (parsedSpec != data.qt->mkspec()) QmakeKitAspect::setMkspec(k, parsedSpec); }); diff --git a/src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp b/src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp index aa46476ae0..83217ce2bf 100644 --- a/src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp @@ -32,6 +32,8 @@ #include <QTextStream> #include <QStringList> +#include <cstring> + namespace QmakeProjectManager { namespace Internal { @@ -150,7 +152,7 @@ void LibraryParameters::generateCode(QtProjectParameters:: Type t, } QTC_ASSERT(nameIndex != -1, continue); sourceStr << '\n' << namespaceIndent << signature.left(nameIndex); - if (signature.at(nameIndex - 1) != ' ') + if (!std::strchr("&* ", signature.at(nameIndex - 1).toLatin1())) sourceStr << ' '; sourceStr << unqualifiedClassName << "::" << signature.mid(nameIndex) << '\n'; sourceStr << namespaceIndent << "{\n" << indent diff --git a/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp b/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp index 0381e2670a..2aed6d43cd 100644 --- a/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp @@ -56,7 +56,7 @@ using QSL = QStringList; static const PluginBaseClasses pluginBaseClasses[] = { {"QAccessiblePlugin", "QtGui", - QSL{"QAccessibleInterface * create(const QString &key, QObject *object)"}, + QSL{"QAccessibleInterface *create(const QString &key, QObject *object)"}, "QtCore", "accessible", "QAccessibleFactoryInterface"}, {"QGenericPlugin", "QtGui", QSL{"QObject *create(const QString &name, const QString &spec)"}, "QtCore", "generic", "QGenericPluginFactoryInterface"}, diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index 8c0c322858..a6616cf05f 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -104,28 +104,29 @@ int GradientModel::addStop(qreal position, const QColor &color) return -1; if (m_itemNode.modelNode().hasNodeProperty(gradientPropertyName().toUtf8())) { - //QmlDesigner::RewriterTransaction transaction = m_itemNode.modelNode().view()->beginRewriterTransaction(); - //### TODO does not work + int properPos = 0; + try { - QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode(); + QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode(); - QmlDesigner::ModelNode gradientStopNode = - m_itemNode.modelNode().view()->createModelNode("QtQuick.GradientStop", - m_itemNode.modelNode().view()->majorQtQuickVersion(), 0); - gradientStopNode.variantProperty("position").setValue(position); - gradientStopNode.variantProperty("color").setValue(color); - gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode); + QmlDesigner::ModelNode gradientStopNode = createGradientStopNode(); - const QList<QmlDesigner::ModelNode> stopNodes = gradientNode.nodeListProperty("stops").toModelNodeList(); + gradientStopNode.variantProperty("position").setValue(position); + gradientStopNode.variantProperty("color").setValue(color); + gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode); - int properPos = 0; - for (int i = 0; i < stopNodes.count(); i++) { - if (QmlDesigner::QmlObjectNode(stopNodes.at(i)).modelValue("position").toReal() < position) - properPos = i + 1; - } - gradientNode.nodeListProperty("stops").slide(stopNodes.count() - 1, properPos); + const QList<QmlDesigner::ModelNode> stopNodes = gradientNode.nodeListProperty("stops").toModelNodeList(); - setupModel(); + for (int i = 0; i < stopNodes.count(); i++) { + if (QmlDesigner::QmlObjectNode(stopNodes.at(i)).modelValue("position").toReal() < position) + properPos = i + 1; + } + gradientNode.nodeListProperty("stops").slide(stopNodes.count() - 1, properPos); + + setupModel(); + } catch (const QmlDesigner::Exception &e) { + e.showException(); + } return properPos; } @@ -155,12 +156,12 @@ void GradientModel::addGradient() m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).reparentHere(gradientNode); - QmlDesigner::ModelNode gradientStopNode = view()->createModelNode("QtQuick.GradientStop", view()->majorQtQuickVersion(), 0); + QmlDesigner::ModelNode gradientStopNode = createGradientStopNode(); gradientStopNode.variantProperty("position").setValue(0.0); gradientStopNode.variantProperty("color").setValue(color); gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode); - gradientStopNode = view()->createModelNode("QtQuick.GradientStop", view()->majorQtQuickVersion(), 0); + gradientStopNode = createGradientStopNode(); gradientStopNode.variantProperty("position").setValue(1.0); gradientStopNode.variantProperty("color").setValue(QColor(Qt::black)); gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode); @@ -459,6 +460,17 @@ QmlDesigner::ModelNode GradientModel::createGradientNode() return gradientNode; } +QmlDesigner::ModelNode GradientModel::createGradientStopNode() +{ + QByteArray fullTypeName = "QtQuick.GradientStop"; + auto metaInfo = model()->metaInfo(fullTypeName); + + int minorVersion = metaInfo.minorVersion(); + int majorVersion = metaInfo.majorVersion(); + + return view()->createModelNode(fullTypeName, majorVersion, minorVersion); +} + void GradientModel::setGradientProperty(const QString &propertyName, qreal value) { QTC_ASSERT(m_itemNode.isValid(), return); diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h index ecb9ba53fd..804731c1e2 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h @@ -86,6 +86,7 @@ private: bool hasGradient() const; bool locked() const; QmlDesigner::ModelNode createGradientNode(); + QmlDesigner::ModelNode createGradientStopNode(); private: QmlDesigner::QmlItemNode m_itemNode; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index f4cd9c7e79..2b22844bb9 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -486,6 +486,8 @@ QString RewriterView::auxiliaryDataAsQML() const QString str = "Designer {\n "; + QTC_ASSERT(!m_canonicalIntModelNode.isEmpty(), return {}); + int columnCount = 0; for (const auto &node : allModelNodes()) { QHash<PropertyName, QVariant> data = node.auxiliaryData(); @@ -727,8 +729,11 @@ void RewriterView::setupCanonicalHashes() const using myPair = std::pair<ModelNode,int>; std::vector<myPair> data; - for (const ModelNode &node : allModelNodes()) - data.emplace_back(std::make_pair(node, nodeOffset(node))); + for (const ModelNode &node : allModelNodes()) { + int offset = nodeOffset(node); + QTC_ASSERT(offset > 0, qDebug() << Q_FUNC_INFO << "no offset" << node; return); + data.emplace_back(std::make_pair(node, offset)); + } std::sort(data.begin(), data.end(), [](myPair a, myPair b) { return a.second < b.second; @@ -1066,6 +1071,8 @@ void RewriterView::restoreAuxiliaryData() setupCanonicalHashes(); + QTC_ASSERT(!m_canonicalIntModelNode.isEmpty(), return); + const QString text = m_textModifier->text(); int startIndex = text.indexOf(annotationsStart()); diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index bdaa22bb4b..9b73dc1faf 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -65,6 +65,7 @@ const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* These setti const char IGNORE_DEVICE_PIXEL_RATIO[] = "IgnoreDevicePixelRaio"; /* The settings can be used to turn off the feature, if there are serious issues */ const char STANDALONE_MODE[] = "StandAloneMode"; const char ENABLE_TIMELINEVIEW[] = "EnableTimelineView"; +const char ENABLE_TIMELINEVIEW_ENVVAR[] = "QTC_ENABLE_QTQUICKTIMELINE_EDITOR"; } class DesignerSettings : public QHash<QByteArray, QVariant> diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 84b95cccc3..09e10c3b0c 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -194,7 +194,8 @@ bool QmlDesignerPlugin::delayedInitialize() d->settings.fromSettings(Core::ICore::settings()); d->viewManager.registerViewTakingOwnership(new QmlDesigner::Internal::ConnectionView); - if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()) + if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool() + || qEnvironmentVariableIsSet(DesignerSettingsKey::ENABLE_TIMELINEVIEW_ENVVAR)) d->viewManager.registerViewTakingOwnership(new QmlDesigner::TimelineView); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::SourceTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::ColorTool); diff --git a/src/plugins/qtsupport/profilereader.cpp b/src/plugins/qtsupport/profilereader.cpp index ba0eb7dd90..9c04012b05 100644 --- a/src/plugins/qtsupport/profilereader.cpp +++ b/src/plugins/qtsupport/profilereader.cpp @@ -79,6 +79,7 @@ ProFileReader::ProFileReader(QMakeGlobals *option, QMakeVfs *vfs) , ProFileEvaluator(option, this, vfs, this) , m_ignoreLevel(0) { + setExtraConfigs(QStringList("qtc_run")); } ProFileReader::~ProFileReader() diff --git a/src/plugins/qtsupport/qtoutputformatter.cpp b/src/plugins/qtsupport/qtoutputformatter.cpp index c5a4d7a427..cb98654858 100644 --- a/src/plugins/qtsupport/qtoutputformatter.cpp +++ b/src/plugins/qtsupport/qtoutputformatter.cpp @@ -228,7 +228,7 @@ void QtOutputFormatter::handleLink(const QString &href) if (qmlLineMatch.hasMatch()) { const QUrl fileUrl = QUrl(qmlLineMatch.captured(1)); const int line = qmlLineMatch.captured(2).toInt(); - openEditor(d->projectFinder.findFile(d->projectFinder.findFile(fileUrl)), line); + openEditor(d->projectFinder.findFile(fileUrl), line); return; } diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index 39e85f5031..a910de019c 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -65,18 +65,17 @@ public: InternalEngine() : m_widget(new QWidget) {} ~InternalEngine() override { delete m_widget;} QString title() const override { return TextEditor::SearchEngine::tr("Internal"); } - QString toolTip() const override { return QString(); } + QString toolTip() const override { return {}; } QWidget *widget() const override { return m_widget; } - QVariant parameters() const override { return QVariant(); } + QVariant parameters() const override { return {}; } void readSettings(QSettings * /*settings*/) override {} void writeSettings(QSettings * /*settings*/) const override {} QFuture<Utils::FileSearchResultList> executeSearch( const TextEditor::FileFindParameters ¶meters, BaseFileFind *baseFileFind) override { - auto func = parameters.flags & FindRegularExpression - ? Utils::findInFilesRegExp - : Utils::findInFiles; + const auto func = parameters.flags & FindRegularExpression ? Utils::findInFilesRegExp + : Utils::findInFiles; return func(parameters.text, baseFileFind->files(parameters.nameFilters, parameters.exclusionFilters, @@ -112,7 +111,8 @@ public: class BaseFileFindPrivate { public: - ~BaseFileFindPrivate() { delete m_internalSearchEngine; } + BaseFileFindPrivate() : m_internalSearchEngine(std::make_unique<InternalEngine>()) {} + QPointer<IFindSupport> m_currentFindSupport; QLabel *m_resultLabel = nullptr; @@ -125,7 +125,7 @@ public: QPointer<QComboBox> m_filterCombo; QPointer<QComboBox> m_exclusionCombo; QVector<SearchEngine *> m_searchEngines; - SearchEngine *m_internalSearchEngine; + std::unique_ptr<SearchEngine> m_internalSearchEngine; int m_currentSearchEngineIndex = -1; }; @@ -182,8 +182,7 @@ void SearchEngine::setEnabled(bool enabled) BaseFileFind::BaseFileFind() : d(new BaseFileFindPrivate) { - d->m_internalSearchEngine = new InternalEngine; - addSearchEngine(d->m_internalSearchEngine); + addSearchEngine(d->m_internalSearchEngine.get()); } BaseFileFind::~BaseFileFind() @@ -200,14 +199,14 @@ QStringList BaseFileFind::fileNameFilters() const { if (d->m_filterCombo) return splitFilterUiText(d->m_filterCombo->currentText()); - return QStringList(); + return {}; } QStringList BaseFileFind::fileExclusionFilters() const { if (d->m_exclusionCombo) return splitFilterUiText(d->m_exclusionCombo->currentText()); - return QStringList(); + return {}; } SearchEngine *BaseFileFind::currentSearchEngine() const @@ -233,11 +232,11 @@ void BaseFileFind::setCurrentSearchEngine(int index) static void displayResult(QFutureWatcher<FileSearchResultList> *watcher, SearchResult *search, int index) { - FileSearchResultList results = watcher->resultAt(index); + const FileSearchResultList results = watcher->resultAt(index); QList<SearchResultItem> items; - foreach (const FileSearchResult &result, results) { + for (const FileSearchResult &result : results) { SearchResultItem item; - item.path = QStringList() << QDir::toNativeSeparators(result.fileName); + item.path = QStringList(QDir::toNativeSeparators(result.fileName)); item.mainRange.begin.line = result.lineNumber; item.mainRange.begin.column = result.matchStart; item.mainRange.end = item.mainRange.begin; @@ -258,7 +257,7 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, updateComboEntries(d->m_filterCombo, true); if (d->m_exclusionCombo) updateComboEntries(d->m_exclusionCombo, true); - QString tooltip = toolTip(); + const QString tooltip = toolTip(); SearchResult *search = SearchResultWindow::instance()->startNewSearch( label(), @@ -276,20 +275,26 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, parameters.searchEngineParameters = currentSearchEngine()->parameters(); parameters.searchEngineIndex = d->m_currentSearchEngineIndex; search->setUserData(qVariantFromValue(parameters)); - connect(search, &SearchResult::activated, this, &BaseFileFind::openEditor); + connect(search, &SearchResult::activated, this, [this, search](const SearchResultItem &item) { + openEditor(search, item); + }); if (searchMode == SearchResultWindow::SearchAndReplace) connect(search, &SearchResult::replaceButtonClicked, this, &BaseFileFind::doReplace); connect(search, &SearchResult::visibilityChanged, this, &BaseFileFind::hideHighlightAll); - connect(search, &SearchResult::searchAgainRequested, this, &BaseFileFind::searchAgain); + connect(search, &SearchResult::searchAgainRequested, this, [this, search] { + searchAgain(search); + }); connect(this, &BaseFileFind::enabledChanged, search, &SearchResult::requestEnabledCheck); - connect(search, &SearchResult::requestEnabledCheck, this, &BaseFileFind::recheckEnabled); + connect(search, &SearchResult::requestEnabledCheck, this, [this, search] { + recheckEnabled(search); + }); runSearch(search); } void BaseFileFind::runSearch(SearchResult *search) { - FileFindParameters parameters = search->userData().value<FileFindParameters>(); + const FileFindParameters parameters = search->userData().value<FileFindParameters>(); auto label = new CountingLabel; connect(search, &SearchResult::countChanged, label, &CountingLabel::updateCount); auto statusLabel = new CountingLabel; @@ -341,7 +346,7 @@ void BaseFileFind::doReplace(const QString &text, const QList<SearchResultItem> &items, bool preserveCase) { - QStringList files = replaceAll(text, items, preserveCase); + const QStringList files = replaceAll(text, items, preserveCase); if (!files.isEmpty()) { Utils::FadingIndicator::showText(ICore::mainWindow(), tr("%n occurrences replaced.", nullptr, items.size()), @@ -391,7 +396,7 @@ QList<QPair<QWidget *, QWidget *>> BaseFileFind::createPatternWidgets() void BaseFileFind::writeCommonSettings(QSettings *settings) { - std::function<QStringList(const QStringList &)> fromNativeSeparators = [](const QStringList &files) { + const auto fromNativeSeparators = [](const QStringList &files) -> QStringList { return Utils::transform(files, &QDir::fromNativeSeparators); }; @@ -404,7 +409,7 @@ void BaseFileFind::writeCommonSettings(QSettings *settings) settings->setValue("currentExclusionFilter", QDir::fromNativeSeparators(d->m_exclusionCombo->currentText())); - foreach (SearchEngine *searchEngine, d->m_searchEngines) + for (const SearchEngine *searchEngine : qAsConst(d->m_searchEngines)) searchEngine->writeSettings(settings); settings->setValue("currentSearchEngineIndex", d->m_currentSearchEngineIndex); } @@ -412,13 +417,13 @@ void BaseFileFind::writeCommonSettings(QSettings *settings) void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaultFilter, const QString &defaultExclusionFilter) { - std::function<QStringList(const QStringList &)> toNativeSeparators = [](const QStringList &files) { + const auto toNativeSeparators = [](const QStringList &files) -> QStringList { return Utils::transform(files, &QDir::toNativeSeparators); }; - QStringList filters = settings->value("filters").toStringList(); - if (filters.isEmpty()) - filters << defaultFilter; + const QStringList filterSetting = settings->value("filters").toStringList(); + const QStringList filters = filterSetting.isEmpty() ? QStringList(defaultFilter) + : filterSetting; const QVariant currentFilter = settings->value("currentFilter"); d->m_filterSetting = currentFilter.isValid() ? currentFilter.toString() : filters.first(); @@ -436,16 +441,15 @@ void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaul if (d->m_exclusionCombo) syncComboWithSettings(d->m_exclusionCombo, d->m_exclusionSetting); - foreach (SearchEngine* searchEngine, d->m_searchEngines) + for (SearchEngine* searchEngine : qAsConst(d->m_searchEngines)) searchEngine->readSettings(settings); const int currentSearchEngineIndex = settings->value("currentSearchEngineIndex", 0).toInt(); syncSearchEngineCombo(currentSearchEngineIndex); } -void BaseFileFind::openEditor(const SearchResultItem &item) +void BaseFileFind::openEditor(SearchResult *result, const SearchResultItem &item) { - auto result = qobject_cast<SearchResult *>(sender()); - FileFindParameters parameters = result->userData().value<FileFindParameters>(); + const FileFindParameters parameters = result->userData().value<FileFindParameters>(); IEditor *openedEditor = d->m_searchEngines[parameters.searchEngineIndex]->openEditor(item, parameters); if (!openedEditor) @@ -468,16 +472,14 @@ void BaseFileFind::hideHighlightAll(bool visible) d->m_currentFindSupport->clearHighlights(); } -void BaseFileFind::searchAgain() +void BaseFileFind::searchAgain(SearchResult *search) { - auto search = qobject_cast<SearchResult *>(sender()); search->restart(); runSearch(search); } -void BaseFileFind::recheckEnabled() +void BaseFileFind::recheckEnabled(SearchResult *search) { - auto search = qobject_cast<SearchResult *>(sender()); if (!search) return; search->setSearchAgainEnabled(isEnabled()); @@ -493,7 +495,7 @@ QStringList BaseFileFind::replaceAll(const QString &text, RefactoringChanges refactoring; QHash<QString, QList<SearchResultItem> > changes; - foreach (const SearchResultItem &item, items) + for (const SearchResultItem &item : items) changes[QDir::fromNativeSeparators(item.path.first())].append(item); // Checking for files without write permissions @@ -523,7 +525,7 @@ QStringList BaseFileFind::replaceAll(const QString &text, ChangeSet changeSet; RefactoringFilePtr file = refactoring.file(fileName); QSet<QPair<int, int> > processed; - foreach (const SearchResultItem &item, changeItems) { + for (const SearchResultItem &item : changeItems) { const QPair<int, int> &p = qMakePair(item.mainRange.begin.line, item.mainRange.begin.column); if (processed.contains(p)) diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h index 32595b0398..1297e1a2ac 100644 --- a/src/plugins/texteditor/basefilefind.h +++ b/src/plugins/texteditor/basefilefind.h @@ -67,6 +67,7 @@ class TEXTEDITOR_EXPORT SearchEngine : public QObject public: SearchEngine(QObject *parent = nullptr); ~SearchEngine() override; + virtual QString title() const = 0; virtual QString toolTip() const = 0; // add %1 placeholder where the find flags should be put virtual QWidget *widget() const = 0; @@ -132,13 +133,13 @@ signals: void currentSearchEngineChanged(); private: - void openEditor(const Core::SearchResultItem &item); + void openEditor(Core::SearchResult *result, const Core::SearchResultItem &item); void doReplace(const QString &txt, const QList<Core::SearchResultItem> &items, bool preserveCase); void hideHighlightAll(bool visible); - void searchAgain(); - void recheckEnabled(); + void searchAgain(Core::SearchResult *search); + void recheckEnabled(Core::SearchResult *search); void runNewSearch(const QString &txt, Core::FindFlags findFlags, Core::SearchResultWindow::SearchMode searchMode); diff --git a/src/plugins/texteditor/highlighter.cpp b/src/plugins/texteditor/highlighter.cpp index 857c0f88cc..b21af3644c 100644 --- a/src/plugins/texteditor/highlighter.cpp +++ b/src/plugins/texteditor/highlighter.cpp @@ -43,6 +43,10 @@ using namespace TextEditor; +static const char kDefinitionForMimeType[] = "definitionForMimeType"; +static const char kDefinitionForExtension[] = "definitionForExtension"; +static const char kDefinitionForFilePath[] = "definitionForFilePath"; + KSyntaxHighlighting::Repository *highlightRepository() { static KSyntaxHighlighting::Repository *repository = nullptr; @@ -107,18 +111,24 @@ Highlighter::Definition Highlighter::definitionForDocument(const TextDocument *d if (mimeType.isValid()) definition = Highlighter::definitionForMimeType(mimeType.name()); if (!definition.isValid()) - definition = Highlighter::definitionForFileName(document->filePath().fileName()); + definition = Highlighter::definitionForFilePath(document->filePath()); return definition; } Highlighter::Definition Highlighter::definitionForMimeType(const QString &mimeType) { + const Definitions definitions = definitionsForMimeType(mimeType); + if (definitions.size() == 1) + return definitions.first(); return highlightRepository()->definitionForMimeType(mimeType); } -Highlighter::Definition Highlighter::definitionForFileName(const QString &fileName) +Highlighter::Definition Highlighter::definitionForFilePath(const Utils::FileName &fileName) { - return highlightRepository()->definitionForFileName(fileName); + const Definitions definitions = definitionsForFileName(fileName); + if (definitions.size() == 1) + return definitions.first(); + return highlightRepository()->definitionForFileName(fileName.fileName()); } Highlighter::Definition Highlighter::definitionForName(const QString &name) @@ -133,18 +143,88 @@ Highlighter::Definitions Highlighter::definitionsForDocument(const TextDocument if (mimeType.isValid()) definitions = Highlighter::definitionsForMimeType(mimeType.name()); if (definitions.isEmpty()) - definitions = Highlighter::definitionsForFileName(document->filePath().fileName()); + definitions = Highlighter::definitionsForFileName(document->filePath()); return definitions; } +static Highlighter::Definition definitionForSetting(const QString &settingsKey, + const QString &mapKey) +{ + QSettings *settings = Core::ICore::settings(); + settings->beginGroup(Constants::HIGHLIGHTER_SETTINGS_CATEGORY); + const QString &definitionName = settings->value(settingsKey).toMap().value(mapKey).toString(); + settings->endGroup(); + return Highlighter::definitionForName(definitionName); +} + Highlighter::Definitions Highlighter::definitionsForMimeType(const QString &mimeType) { - return highlightRepository()->definitionsForMimeType(mimeType).toList(); + Definitions definitions = highlightRepository()->definitionsForMimeType(mimeType).toList(); + if (definitions.size() > 1) { + const Definition &rememberedDefinition = definitionForSetting(kDefinitionForMimeType, + mimeType); + if (rememberedDefinition.isValid() && definitions.contains(rememberedDefinition)) + definitions = {rememberedDefinition}; + } + return definitions; +} + +Highlighter::Definitions Highlighter::definitionsForFileName(const Utils::FileName &fileName) +{ + Definitions definitions + = highlightRepository()->definitionsForFileName(fileName.fileName()).toList(); + + if (definitions.size() > 1) { + const QString &fileExtension = fileName.toFileInfo().completeSuffix(); + const Definition &rememberedDefinition + = fileExtension.isEmpty() + ? definitionForSetting(kDefinitionForFilePath, + fileName.toFileInfo().canonicalFilePath()) + : definitionForSetting(kDefinitionForExtension, fileExtension); + if (rememberedDefinition.isValid() && definitions.contains(rememberedDefinition)) + definitions = {rememberedDefinition}; + } + + return definitions; +} + +void Highlighter::rememberDefintionForDocument(const Highlighter::Definition &definition, + const TextDocument *document) +{ + if (!definition.isValid()) + return; + const QString &mimeType = document->mimeType(); + const QString &fileExtension = document->filePath().toFileInfo().completeSuffix(); + const QString &path = document->filePath().toFileInfo().canonicalFilePath(); + QSettings *settings = Core::ICore::settings(); + settings->beginGroup(Constants::HIGHLIGHTER_SETTINGS_CATEGORY); + if (!mimeType.isEmpty()) { + const QString id(kDefinitionForMimeType); + QMap<QString, QVariant> map = settings->value(id).toMap(); + map.insert(mimeType, definition.name()); + settings->setValue(id, map); + } else if (!fileExtension.isEmpty()) { + const QString id(kDefinitionForExtension); + QMap<QString, QVariant> map = settings->value(id).toMap(); + map.insert(fileExtension, definition.name()); + settings->setValue(id, map); + } else if (!path.isEmpty()) { + const QString id(kDefinitionForFilePath); + QMap<QString, QVariant> map = settings->value(id).toMap(); + map.insert(document->filePath().toFileInfo().absoluteFilePath(), definition.name()); + settings->setValue(id, map); + } + settings->endGroup(); } -Highlighter::Definitions Highlighter::definitionsForFileName(const QString &fileName) +void Highlighter::clearDefintionForDocumentCache() { - return highlightRepository()->definitionsForFileName(fileName).toList(); + QSettings *settings = Core::ICore::settings(); + settings->beginGroup(Constants::HIGHLIGHTER_SETTINGS_CATEGORY); + settings->remove(kDefinitionForMimeType); + settings->remove(kDefinitionForExtension); + settings->remove(kDefinitionForFilePath); + settings->endGroup(); } void Highlighter::addCustomHighlighterPath(const Utils::FileName &path) diff --git a/src/plugins/texteditor/highlighter.h b/src/plugins/texteditor/highlighter.h index 776f92faf3..92e7e136c1 100644 --- a/src/plugins/texteditor/highlighter.h +++ b/src/plugins/texteditor/highlighter.h @@ -38,6 +38,8 @@ class TextDocument; class Highlighter : public SyntaxHighlighter, public KSyntaxHighlighting::AbstractHighlighter { + Q_OBJECT + Q_INTERFACES(KSyntaxHighlighting::AbstractHighlighter) public: using Definition = KSyntaxHighlighting::Definition; using Definitions = QList<Definition>; @@ -45,12 +47,16 @@ public: static Definition definitionForDocument(const TextDocument *document); static Definition definitionForMimeType(const QString &mimeType); - static Definition definitionForFileName(const QString &fileName); + static Definition definitionForFilePath(const Utils::FileName &fileName); static Definition definitionForName(const QString &name); static Definitions definitionsForDocument(const TextDocument *document); static Definitions definitionsForMimeType(const QString &mimeType); - static Definitions definitionsForFileName(const QString &fileName); + static Definitions definitionsForFileName(const Utils::FileName &fileName); + + static void rememberDefintionForDocument(const Definition &definition, + const TextDocument *document); + static void clearDefintionForDocumentCache(); static void addCustomHighlighterPath(const Utils::FileName &path); static void updateDefinitions(std::function<void()> callback = nullptr); diff --git a/src/plugins/texteditor/highlightersettings.cpp b/src/plugins/texteditor/highlightersettings.cpp index 76b88b063a..84afbd79de 100644 --- a/src/plugins/texteditor/highlightersettings.cpp +++ b/src/plugins/texteditor/highlightersettings.cpp @@ -25,6 +25,8 @@ #include "highlightersettings.h" +#include "texteditorconstants.h" + #include <coreplugin/icore.h> #include <utils/hostosinfo.h> #include <utils/synchronousprocess.h> @@ -97,7 +99,6 @@ namespace { static const QLatin1String kDefinitionFilesPath("UserDefinitionFilesPath"); static const QLatin1String kIgnoredFilesPatterns("IgnoredFilesPatterns"); -static const QLatin1String kGroupPostfix("HighlighterSettings"); QString groupSpecifier(const QString &postFix, const QString &category) { @@ -113,7 +114,7 @@ using namespace Internal; void HighlighterSettings::toSettings(const QString &category, QSettings *s) const { - const QString &group = groupSpecifier(kGroupPostfix, category); + const QString &group = groupSpecifier(Constants::HIGHLIGHTER_SETTINGS_CATEGORY, category); s->beginGroup(group); s->setValue(kDefinitionFilesPath, m_definitionFilesPath); s->setValue(kIgnoredFilesPatterns, ignoredFilesPatterns()); @@ -122,7 +123,7 @@ void HighlighterSettings::toSettings(const QString &category, QSettings *s) cons void HighlighterSettings::fromSettings(const QString &category, QSettings *s) { - const QString &group = groupSpecifier(kGroupPostfix, category); + const QString &group = groupSpecifier(Constants::HIGHLIGHTER_SETTINGS_CATEGORY, category); s->beginGroup(group); m_definitionFilesPath = s->value(kDefinitionFilesPath, QString()).toString(); if (!s->contains(kDefinitionFilesPath)) diff --git a/src/plugins/texteditor/highlightersettingspage.cpp b/src/plugins/texteditor/highlightersettingspage.cpp index ec9d34ee65..86a1a7fdbf 100644 --- a/src/plugins/texteditor/highlightersettingspage.cpp +++ b/src/plugins/texteditor/highlightersettingspage.cpp @@ -112,6 +112,9 @@ QWidget *HighlighterSettingsPage::widget() label->setText(tr("Update finished")); }); }); + connect(m_d->m_page->resetCache, &QPushButton::clicked, []() { + Highlighter::clearDefintionForDocumentCache(); + }); settingsToUI(); } diff --git a/src/plugins/texteditor/highlightersettingspage.ui b/src/plugins/texteditor/highlightersettingspage.ui index bcc5d5fe11..fcd4919b12 100644 --- a/src/plugins/texteditor/highlightersettingspage.ui +++ b/src/plugins/texteditor/highlightersettingspage.ui @@ -110,6 +110,30 @@ </item> </layout> </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="resetCache"> + <property name="text"> + <string>Reset Remembered Definitions</string> + </property> + </widget> + </item> + </layout> + </item> </layout> </widget> </item> diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 559617ac2d..36abfc01e2 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -613,6 +613,7 @@ public: void reconfigure(); void updateSyntaxInfoBar(const Highlighter::Definitions &definitions, const QString &fileName); void configureGenericHighlighter(const KSyntaxHighlighting::Definition &definition); + void rememberCurrentSyntaxDefinition(); public: TextEditorWidget *q; @@ -3306,6 +3307,11 @@ void TextEditorWidgetPrivate::updateSyntaxInfoBar(const Highlighter::Definitions this->configureGenericHighlighter(Highlighter::definitionForName(definition)); }); + info.setCustomButtonInfo(BaseTextEditor::tr("Remember My Choice"), [multiple, this]() { + m_document->infoBar()->removeInfo(multiple); + rememberCurrentSyntaxDefinition(); + }); + infoBar->removeInfo(missing); infoBar->addInfo(info); } else { @@ -3333,6 +3339,16 @@ void TextEditorWidgetPrivate::configureGenericHighlighter( m_document->setFontSettings(TextEditorSettings::fontSettings()); } +void TextEditorWidgetPrivate::rememberCurrentSyntaxDefinition() +{ + auto highlighter = qobject_cast<Highlighter *>(m_document->syntaxHighlighter()); + if (!highlighter) + return; + const Highlighter::Definition &definition = highlighter->definition(); + if (definition.isValid()) + Highlighter::rememberDefintionForDocument(definition, m_document.data()); +} + bool TextEditorWidget::codeFoldingVisible() const { return d->m_codeFoldingVisible; @@ -8539,7 +8555,7 @@ QString TextEditorWidget::textAt(int from, int to) const void TextEditorWidget::configureGenericHighlighter() { - const Highlighter::Definitions definitions = Highlighter::definitionsForDocument(textDocument()); + Highlighter::Definitions definitions = Highlighter::definitionsForDocument(textDocument()); d->configureGenericHighlighter(definitions.isEmpty() ? Highlighter::Definition() : definitions.first()); d->updateSyntaxInfoBar(definitions, textDocument()->filePath().fileName()); diff --git a/src/plugins/texteditor/texteditorconstants.h b/src/plugins/texteditor/texteditorconstants.h index 949b493457..78c9c1cb71 100644 --- a/src/plugins/texteditor/texteditorconstants.h +++ b/src/plugins/texteditor/texteditorconstants.h @@ -214,6 +214,8 @@ const char TEXT_EDITOR_DISPLAY_SETTINGS[] = "D.DisplaySettings"; const char TEXT_EDITOR_HIGHLIGHTER_SETTINGS[] = "E.HighlighterSettings"; const char TEXT_EDITOR_SNIPPETS_SETTINGS[] = "F.SnippetsSettings"; +const char HIGHLIGHTER_SETTINGS_CATEGORY[] = "HighlighterSettings"; + const char SNIPPET_EDITOR_ID[] = "TextEditor.SnippetEditor"; const char TEXT_SNIPPET_GROUP_ID[] = "Text"; diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp index 6ece9c8b9d..cb41e7e7d2 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp @@ -98,6 +98,7 @@ public: const QString m_directory; QString m_startupFile; QString m_output; + QString m_displayName; QPointer<VcsCommand> m_command; QPointer<VcsCommandResultProxy> m_commandResultProxy; QFutureWatcher<QList<FileData>> *m_processWatcher = nullptr; @@ -251,6 +252,7 @@ void VcsBaseDiffEditorController::runCommand(const QList<QStringList> &args, uns d->cancelReload(); d->m_command = new VcsCommand(workingDirectory(), d->m_client->processEnvironment()); + d->m_command->setDisplayName(d->m_displayName); d->m_command->setCodec(codec ? codec : EditorManager::defaultTextCodec()); d->m_commandResultProxy = new VcsCommandResultProxy(d->m_command.data(), d); d->m_command->addFlags(flags); @@ -289,6 +291,11 @@ QString VcsBaseDiffEditorController::startupFile() const return d->m_startupFile; } +void VcsBaseDiffEditorController::setDisplayName(const QString &displayName) +{ + d->m_displayName = displayName; +} + } // namespace VcsBase #include "vcsbasediffeditorcontroller.moc" diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h index eb6e97157f..8b4668dbf0 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h @@ -53,6 +53,7 @@ protected: QString workingDirectory() const; void setStartupFile(const QString &startupFile); QString startupFile() const; + void setDisplayName(const QString &displayName); private: friend class VcsBaseDiffEditorControllerPrivate; |