diff --git a/doc/qtcreator/images/qtcreator-breakdown.png b/doc/qtcreator/images/qtcreator-breakdown.png index a5bc5f7b073..f8f789150b4 100644 Binary files a/doc/qtcreator/images/qtcreator-breakdown.png and b/doc/qtcreator/images/qtcreator-breakdown.png differ diff --git a/doc/qtcreator/src/howto/creator-ui.qdoc b/doc/qtcreator/src/howto/creator-ui.qdoc index d6e814a07d2..68d0d4e6fb4 100644 --- a/doc/qtcreator/src/howto/creator-ui.qdoc +++ b/doc/qtcreator/src/howto/creator-ui.qdoc @@ -51,6 +51,9 @@ \li Open tutorials and example projects + \li Browse Qt extensions in the \l{https://marketplace.qt.io/} + {Qt Marketplace} + \li Read news from the online community and Qt blogs \li Create or manage a Qt Account @@ -371,19 +374,12 @@ of an output pane to open the pane. To maximize an open output pane, click the \uicontrol {Maximize Output Pane} button or press \key {Alt+9}. - To search within the \uicontrol{Application Output} and \uicontrol{Compile Output} - panes, press \key {Ctrl+F} when the pane is active. Enter search criteria in - the \uicontrol Find field and click the left and right arrows to search down and - up in the pane. To increase or decrease the output text size, select \inlineimage plus.png (\uicontrol {Zoom In}) or \inlineimage minus.png (\uicontrol {Zoom Out}), or press \key Ctrl++ or \key Ctrl+-. Zooming is not supported in all output panes. - To filter the output, enter a string in the \uicontrol Filter field. - Filtering is not supported in all output panes. - To open the \uicontrol{General Messages} and \if defined(qtcreator) \l{Using Version Control Systems}{Version Control} @@ -398,6 +394,21 @@ For more information about the \uicontrol {QML Debugger Console} view, see \l{Executing JavaScript Expressions}. + \section1 Finding and Filtering Output + + To search from output, press \key {Ctrl+F} when the pane is active. Enter + search criteria in the \uicontrol Find field. For more information, see + \l{Finding and Replacing}. + + Besides searching from the output, you can enter a string in the + \uicontrol Filter field to filter it. To specify filtering options, + select the \inlineimage magnifier.png "Filtering options menu" + button. You can filter output by using regular expressions or + case-sensitivity. Select \uicontrol {Show Non-matching Lines} to + hide the lines that match the filter. + + Finding and filtering are not supported in all output panes. + \section1 Issues The \uicontrol{Issues} pane provides lists of following types of issues: diff --git a/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc b/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc index 312d51bd393..3cb1f5709a1 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-configuring.qdoc @@ -177,4 +177,8 @@ To enable and disable plugins, select \uicontrol Help > \uicontrol {About Plugins}. + The \l{https://marketplace.qt.io/}{Qt Marketplace} contains \QC plugins + that you can download and install either for free or for a price set by + their publisher. You can browse the available plugins in the + \uicontrol Marketplace tab in the Welcome mode. */ diff --git a/doc/qtcreator/src/overview/creator-only/creator-tech-support.qdoc b/doc/qtcreator/src/overview/creator-only/creator-tech-support.qdoc index e7dedaa829a..f851b19e8c5 100644 --- a/doc/qtcreator/src/overview/creator-only/creator-tech-support.qdoc +++ b/doc/qtcreator/src/overview/creator-only/creator-tech-support.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -62,6 +62,11 @@ \li \l{https://wiki.qt.io/Qt_Contribution_Guidelines} {Qt Contribution Guidelines} + \row + \li Find extensions for Qt, such as \QC plugins, development tools, + and Qt modules + \li \l{https://marketplace.qt.io/}{Qt Marketplace} + \row \li Find free Qt-based applications \li \l{https://github.com/topics/qt}{Qt Apps on GitHub} diff --git a/src/libs/qmljs/parser/qmljsdiagnosticmessage_p.h b/src/libs/qmljs/parser/qmljsdiagnosticmessage_p.h index a29d29e642e..e3c2cf56e8f 100644 --- a/src/libs/qmljs/parser/qmljsdiagnosticmessage_p.h +++ b/src/libs/qmljs/parser/qmljsdiagnosticmessage_p.h @@ -47,7 +47,7 @@ #include "qmljssourcelocation_p.h" -QT_BEGIN_NAMESPACE +QT_QML_BEGIN_NAMESPACE namespace QmlJS { class DiagnosticMessage @@ -93,7 +93,8 @@ public: }; } // namespace QmlJS +QT_QML_END_NAMESPACE + +QT_BEGIN_NAMESPACE Q_DECLARE_TYPEINFO(QmlJS::DiagnosticMessage, Q_MOVABLE_TYPE); - QT_END_NAMESPACE - diff --git a/src/libs/qmljs/parser/qmljslexer.cpp b/src/libs/qmljs/parser/qmljslexer.cpp index 58613159d37..ec8bf60a2a7 100644 --- a/src/libs/qmljs/parser/qmljslexer.cpp +++ b/src/libs/qmljs/parser/qmljslexer.cpp @@ -35,9 +35,11 @@ #include #include -QT_QML_BEGIN_NAMESPACE +QT_BEGIN_NAMESPACE Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok); -QT_QML_END_NAMESPACE +QT_END_NAMESPACE + +QT_QML_BEGIN_NAMESPACE using namespace QmlJS; @@ -1619,3 +1621,5 @@ bool Lexer::scanDirectives(Directives *directives, DiagnosticMessage *error) return true; } + +QT_QML_END_NAMESPACE diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index 4027c7a073d..b71d777dae0 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -587,9 +587,9 @@ protected: accept(ast->importUri); if (ast->version) { out(" "); - out(QString::number(ast->version->majorVersion).toUtf8()); + out(QString::number(ast->version->majorVersion)); out("."); - out(QString::number(ast->version->minorVersion).toUtf8()); + out(QString::number(ast->version->minorVersion)); } if (!ast->importId.isNull()) { out(" as ", ast->asToken); diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index dc14c647194..187a71fe1a0 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -25,8 +25,10 @@ #include "cmakekitinformation.h" #include "cmakeprojectconstants.h" -#include "cmaketoolmanager.h" +#include "cmakeprojectplugin.h" +#include "cmakespecificsettings.h" #include "cmaketool.h" +#include "cmaketoolmanager.h" #include #include @@ -611,10 +613,19 @@ QVariant CMakeGeneratorKitAspect::defaultValue(const Kit *k) const return g.matches("Ninja", extraGenerator); }); if (it != known.constEnd()) { - Utils::Environment env = Utils::Environment::systemEnvironment(); - k->addToEnvironment(env); - const Utils::FilePath ninjaExec = env.searchInPath(QLatin1String("ninja")); - if (!ninjaExec.isEmpty()) + const bool hasNinja = [k]() { + Internal::CMakeSpecificSettings *settings + = Internal::CMakeProjectPlugin::projectTypeSpecificSettings(); + + if (settings->ninjaPath().isEmpty()) { + Utils::Environment env = Utils::Environment::systemEnvironment(); + k->addToEnvironment(env); + return !env.searchInPath("ninja").isEmpty(); + } + return true; + }(); + + if (hasNinja) return GeneratorInfo({QString("Ninja"), extraGenerator, QString(), QString()}).toVariant(); } diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp index c373e5d58a6..6dce6ed9fc2 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -452,6 +453,12 @@ Utils::FilePath CompilationDatabaseProject::rootPathFromSettings() const #endif } +void CompilationDatabaseProject::configureAsExampleProject() +{ + if (KitManager::defaultKit()) + addTargetForKit(KitManager::defaultKit()); +} + void CompilationDatabaseBuildSystem::reparseProject() { if (m_parser) { diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h index 14adde037cb..34eec1d5786 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h @@ -56,6 +56,9 @@ class CompilationDatabaseProject : public ProjectExplorer::Project public: explicit CompilationDatabaseProject(const Utils::FilePath &filename); Utils::FilePath rootPathFromSettings() const; + +private: + void configureAsExampleProject() override; }; class CompilationDatabaseBuildSystem : public ProjectExplorer::BuildSystem diff --git a/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp b/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp index 4f2657fba87..bce46e68c05 100644 --- a/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp +++ b/src/plugins/coreplugin/find/highlightscrollbarcontroller.cpp @@ -139,8 +139,8 @@ void HighlightScrollBarOverlay::paintEvent(QPaintEvent *paintEvent) const int aboveValue = m_scrollBar->value(); const int belowValue = m_scrollBar->maximum() - m_scrollBar->value(); - const int sizeDocAbove = aboveValue * int(m_highlightController->lineHeight()); - const int sizeDocBelow = belowValue * int(m_highlightController->lineHeight()); + const int sizeDocAbove = int(aboveValue * m_highlightController->lineHeight()); + const int sizeDocBelow = int(belowValue * m_highlightController->lineHeight()); const int sizeDocVisible = int(m_highlightController->visibleRange()); const int scrollBarBackgroundHeight = aboveHandleRect.height() + belowHandleRect.height(); diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index d243c53f90b..cfd5def8f5a 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -310,7 +310,7 @@ bool GitEditorWidget::isValidRevision(const QString &revision) const void GitEditorWidget::addChangeActions(QMenu *menu, const QString &change) { if (contentType() != OtherContent) - GitClient::addChangeActions(menu, change, sourceWorkingDirectory()); + GitClient::addChangeActions(menu, sourceWorkingDirectory(), change); } QString GitEditorWidget::revisionSubject(const QTextBlock &inBlock) const diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index a82792b1e8b..b7426c7a43c 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -773,7 +773,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, QString version; if (import->version != nullptr) - version = QLatin1String("%1.%2").arg(import->version->majorVersion).arg(import->version->minorVersion); + version = QString("%1.%2").arg(import->version->majorVersion).arg(import->version->minorVersion); const QString &as = import->importId.toString(); if (!import->fileName.isEmpty()) { diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp index c2c9cc2aa9b..9f3befc471e 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp @@ -37,6 +37,7 @@ const char AUTO_FORMAT_ON_SAVE[] = "QmlJSEditor.AutoFormatOnSave"; const char AUTO_FORMAT_ONLY_CURRENT_PROJECT[] = "QmlJSEditor.AutoFormatOnlyCurrentProject"; const char QML_CONTEXTPANE_KEY[] = "QmlJSEditor.ContextPaneEnabled"; const char QML_CONTEXTPANEPIN_KEY[] = "QmlJSEditor.ContextPanePinned"; +const char FOLD_AUX_DATA[] = "QmlJSEditor.FoldAuxData"; using namespace QmlJSEditor; using namespace QmlJSEditor::Internal; @@ -45,7 +46,8 @@ QmlJsEditingSettings::QmlJsEditingSettings() : m_enableContextPane(false), m_pinContextPane(false), m_autoFormatOnSave(false), - m_autoFormatOnlyCurrentProject(false) + m_autoFormatOnlyCurrentProject(false), + m_foldAuxData(false) {} void QmlJsEditingSettings::set() @@ -62,6 +64,7 @@ void QmlJsEditingSettings::fromSettings(QSettings *settings) m_autoFormatOnSave = settings->value(AUTO_FORMAT_ON_SAVE, QVariant(false)).toBool(); m_autoFormatOnlyCurrentProject = settings->value(AUTO_FORMAT_ONLY_CURRENT_PROJECT, QVariant(false)).toBool(); + m_foldAuxData = settings->value(FOLD_AUX_DATA, QVariant(true)).toBool(); settings->endGroup(); } @@ -72,6 +75,7 @@ void QmlJsEditingSettings::toSettings(QSettings *settings) const settings->setValue(QML_CONTEXTPANEPIN_KEY, m_pinContextPane); settings->setValue(AUTO_FORMAT_ON_SAVE, m_autoFormatOnSave); settings->setValue(AUTO_FORMAT_ONLY_CURRENT_PROJECT, m_autoFormatOnlyCurrentProject); + settings->setValue(FOLD_AUX_DATA, m_foldAuxData); settings->endGroup(); } @@ -80,7 +84,8 @@ bool QmlJsEditingSettings::equals(const QmlJsEditingSettings &other) const return m_enableContextPane == other.m_enableContextPane && m_pinContextPane == other.m_pinContextPane && m_autoFormatOnSave == other.m_autoFormatOnSave - && m_autoFormatOnlyCurrentProject == other.m_autoFormatOnlyCurrentProject; + && m_autoFormatOnlyCurrentProject == other.m_autoFormatOnlyCurrentProject + && m_foldAuxData == other.m_foldAuxData; } bool QmlJsEditingSettings::enableContextPane() const @@ -123,6 +128,16 @@ void QmlJsEditingSettings::setAutoFormatOnlyCurrentProject(const bool autoFormat m_autoFormatOnlyCurrentProject = autoFormatOnlyCurrentProject; } +bool QmlJsEditingSettings::foldAuxData() const +{ + return m_foldAuxData; +} + +void QmlJsEditingSettings::setFoldAuxData(const bool foldAuxData) +{ + m_foldAuxData = foldAuxData; +} + class QmlJsEditingSettingsPageWidget final : public Core::IOptionsPageWidget { Q_DECLARE_TR_FUNCTIONS(QmlDesigner::Internal::QmlJsEditingSettingsPage) @@ -137,6 +152,7 @@ public: m_ui.textEditHelperCheckBoxPin->setChecked(s.pinContextPane()); m_ui.autoFormatOnSave->setChecked(s.autoFormatOnSave()); m_ui.autoFormatOnlyCurrentProject->setChecked(s.autoFormatOnlyCurrentProject()); + m_ui.foldAuxDataCheckBox->setChecked(s.foldAuxData()); } void apply() final @@ -146,6 +162,7 @@ public: s.setPinContextPane(m_ui.textEditHelperCheckBoxPin->isChecked()); s.setAutoFormatOnSave(m_ui.autoFormatOnSave->isChecked()); s.setAutoFormatOnlyCurrentProject(m_ui.autoFormatOnlyCurrentProject->isChecked()); + s.setFoldAuxData(m_ui.foldAuxDataCheckBox->isChecked()); s.set(); } diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.h b/src/plugins/qmljseditor/qmljseditingsettingspage.h index 7a8fb9be749..e3536a44ef6 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.h +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.h @@ -60,11 +60,15 @@ namespace QmlJSEditor { bool autoFormatOnlyCurrentProject() const; void setAutoFormatOnlyCurrentProject(const bool autoFormatOnlyCurrentProject); + bool foldAuxData() const; + void setFoldAuxData(const bool foldAuxData); + private: bool m_enableContextPane; bool m_pinContextPane; bool m_autoFormatOnSave; bool m_autoFormatOnlyCurrentProject; + bool m_foldAuxData; }; inline bool operator==(const QmlJsEditingSettings &s1, const QmlJsEditingSettings &s2) diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.ui b/src/plugins/qmljseditor/qmljseditingsettingspage.ui index b4dea80704d..875a1ad0733 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.ui +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.ui @@ -79,6 +79,22 @@ + + + + Features + + + + + + Auto-fold auxiliary data + + + + + + diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index c260c2f7085..9f1799eef27 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -36,6 +36,7 @@ #include "qmljsquickfixassist.h" #include "qmloutlinemodel.h" #include "quicktoolbar.h" +#include "qmljseditingsettingspage.h" #include #include @@ -158,6 +159,24 @@ void QmlJSEditorWidget::finalizeInitialization() createToolBar(); } +bool QmlJSEditorWidget::restoreState(const QByteArray &state) +{ + QStringList qmlTypes { QmlJSTools::Constants::QML_MIMETYPE, + QmlJSTools::Constants::QBS_MIMETYPE, + QmlJSTools::Constants::QMLTYPES_MIMETYPE, + QmlJSTools::Constants::QMLUI_MIMETYPE }; + + if (QmlJsEditingSettings::get().foldAuxData() && qmlTypes.contains(textDocument()->mimeType())) { + int version = 0; + QDataStream stream(state); + stream >> version; + if (version < 1) + foldAuxiliaryData(); + } + + return TextEditorWidget::restoreState(state); +} + QModelIndex QmlJSEditorWidget::outlineModelIndex() { if (!m_outlineModelIndex.isValid()) { @@ -217,6 +236,27 @@ void QmlJSEditorWidget::updateCodeWarnings(Document::Ptr doc) } } +void QmlJSEditorWidget::foldAuxiliaryData() +{ + QTextDocument *doc = document(); + auto documentLayout = qobject_cast(doc->documentLayout()); + QTC_ASSERT(documentLayout, return); + QTextBlock block = doc->lastBlock(); + + while (block.isValid() && block.isVisible()) { + if (TextDocumentLayout::canFold(block) && block.next().isVisible()) { + const QString trimmedText = block.text().trimmed(); + if (trimmedText.startsWith("/*##^##")) { + TextDocumentLayout::doFoldOrUnfold(block, false); + documentLayout->requestUpdate(); + documentLayout->emitDocumentSizeChanged(); + break; + } + } + block = block.previous(); + } +} + void QmlJSEditorWidget::modificationChanged(bool changed) { if (!changed && m_modelManager) diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 2e160527f00..cb5265e66ef 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -60,6 +60,7 @@ public: QmlJSEditorWidget(); void finalizeInitialization() override; + bool restoreState(const QByteArray &state) override; QmlJSEditorDocument *qmlJsEditorDocument() const; @@ -92,6 +93,7 @@ private: void semanticInfoUpdated(const QmlJSTools::SemanticInfo &semanticInfo); void updateCodeWarnings(QmlJS::Document::Ptr doc); + void foldAuxiliaryData(); protected: void contextMenuEvent(QContextMenuEvent *e) override; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 2e65082918f..2a6563c2199 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -8542,7 +8542,6 @@ public: TextEditorFactoryPrivate(TextEditorFactory *parent) : q(parent) , m_widgetCreator([]() { return new TextEditorWidget; }) - , m_indenterCreator([](QTextDocument *d) { return new TextIndenter(d); }) {} BaseTextEditor *duplicateTextEditor(BaseTextEditor *other) diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index 9421fc2cf54..f7b69b48221 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -190,7 +190,7 @@ public: virtual void openFinishedSuccessfully(); // IEditor QByteArray saveState() const; - bool restoreState(const QByteArray &state); + virtual bool restoreState(const QByteArray &state); void gotoLine(int line, int column = 0, bool centerLine = true, bool animate = false); int position(TextPositionOperation posOp = CurrentPosition, int at = -1) const; diff --git a/tests/auto/qml/codemodel/check/tst_check.cpp b/tests/auto/qml/codemodel/check/tst_check.cpp index 0c3ba465fc6..8a52fd0ced4 100644 --- a/tests/auto/qml/codemodel/check/tst_check.cpp +++ b/tests/auto/qml/codemodel/check/tst_check.cpp @@ -134,7 +134,7 @@ void tst_Check::test() const QRegExp messagePattern(" (\\d+) (\\d+) (\\d+)"); QList expectedMessages; - foreach (const AST::SourceLocation &comment, doc->engine()->comments()) { + foreach (const SourceLocation &comment, doc->engine()->comments()) { const QString text = doc->source().mid(comment.begin(), comment.end() - comment.begin()); if (messagePattern.indexIn(text) == -1) diff --git a/tests/tools/qml-ast2dot/main.cpp b/tests/tools/qml-ast2dot/main.cpp index 98875b81a6e..6ffd8c11b37 100644 --- a/tests/tools/qml-ast2dot/main.cpp +++ b/tests/tools/qml-ast2dot/main.cpp @@ -154,7 +154,7 @@ protected: // visiting functions: else terminal(ast->fileNameToken); - terminal(ast->versionToken); + terminal(ast->version->firstSourceLocation()); terminal(ast->asToken); terminal(ast->importIdToken); terminal(ast->semicolonToken); @@ -299,6 +299,9 @@ protected: // visiting functions: virtual bool visit(DebuggerStatement *ast) { terminal(ast->debuggerToken); terminal(ast->semicolonToken); return false; } virtual bool visit(UiParameterList *ast) { terminal(ast->commaToken); terminal(ast->identifierToken); nonterminal(ast->next); return false; } + void throwRecursionDepthError() override { + qWarning() << "Reached maximum recursion depth."; + } private: QHash _id; QList > _connections;