From 298bd125c0109156e85fb2dd42e28f4feca639c8 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 3 Jan 2024 16:21:55 +0100 Subject: [PATCH 1/7] Markdown: Fix that file links were shown as blank in preview Handle links ourselves since QTextBrowser doesn't do what we want. - anchors without file path just jump to anchor - local files (potentially relative to the markdown file) open in Qt Creator (anchors ignored) - otherwise QDesktopServices is used Fixes: QTCREATORBUG-30120 Change-Id: I9a68607a0b32255ec075c698a1265cc6d1387e0c Reviewed-by: David Schulz --- src/plugins/texteditor/markdowneditor.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/plugins/texteditor/markdowneditor.cpp b/src/plugins/texteditor/markdowneditor.cpp index 935d215f321..c8106692e3a 100644 --- a/src/plugins/texteditor/markdowneditor.cpp +++ b/src/plugins/texteditor/markdowneditor.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -70,9 +71,22 @@ public: // preview m_previewWidget = new QTextBrowser(); - m_previewWidget->setOpenExternalLinks(true); + m_previewWidget->setOpenLinks(false); // we want to open files in QtC, not the browser m_previewWidget->setFrameShape(QFrame::NoFrame); new Utils::MarkdownHighlighter(m_previewWidget->document()); + connect(m_previewWidget, &QTextBrowser::anchorClicked, this, [this](const QUrl &link) { + if (link.hasFragment() && link.path().isEmpty() && link.scheme().isEmpty()) { + // local anchor + m_previewWidget->scrollToAnchor(link.fragment(QUrl::FullyEncoded)); + } else if (link.isLocalFile() || link.scheme().isEmpty()) { + // absolute path or relative (to the document) + // open in Qt Creator + EditorManager::openEditor( + document()->filePath().parentDir().resolvePath(link.path())); + } else { + QDesktopServices::openUrl(link); + } + }); // editor m_textEditorWidget = new TextEditorWidget; From 6831e11c3e8b58fe0daf9ebc11ad0c491f076b7d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 4 Jan 2024 10:47:58 +0100 Subject: [PATCH 2/7] Markdown: Add anchors for headings It looks like GitHub creates heading IDs by - converting spaces to '-' - removing anything that is not '-', '_', a number, or a letter - converting to lower case Task-number: QTBUG-120518 Change-Id: If09a8e2e0d964e751869eaebd3326a6f983ac495 Reviewed-by: David Schulz --- src/plugins/texteditor/markdowneditor.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/plugins/texteditor/markdowneditor.cpp b/src/plugins/texteditor/markdowneditor.cpp index c8106692e3a..877b032465a 100644 --- a/src/plugins/texteditor/markdowneditor.cpp +++ b/src/plugins/texteditor/markdowneditor.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -184,6 +185,26 @@ public: m_previewRestoreScrollPosition.reset(); m_previewWidget->setMarkdown(m_document->plainText()); + // Add anchors to headings. This should actually be done by Qt QTBUG-120518 + for (QTextBlock block = m_previewWidget->document()->begin(); block.isValid(); + block = block.next()) { + QTextBlockFormat fmt = block.blockFormat(); + if (fmt.hasProperty(QTextFormat::HeadingLevel)) { + QTextCharFormat cFormat = block.charFormat(); + QString anchor; + const QString text = block.text(); + for (const QChar &c : text) { + if (c == ' ') + anchor.append('-'); + else if (c == '_' || c == '-' || c.isDigit() || c.isLetter()) + anchor.append(c.toLower()); + } + cFormat.setAnchor(true); + cFormat.setAnchorNames({anchor}); + QTextCursor cursor(block); + cursor.setBlockCharFormat(cFormat); + } + } m_previewWidget->horizontalScrollBar()->setValue(positions.x()); m_previewWidget->verticalScrollBar()->setValue(positions.y()); From d8b8c1d8a684a4109f823cc811307befafb3fa3c Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 16 Oct 2023 15:07:08 +0200 Subject: [PATCH 3/7] Core: Use icon based on document's full path This makes a difference when one wants to e.g. mark non existing files. Fixes: QTCREATORBUG-29999 Change-Id: Id7c2a53fa91fb9638e9a08a746614a3f04da400f Reviewed-by: Eike Ziller (cherry picked from commit 13f5367611af2084eca5202428f1e0cacec9f0bf) Reviewed-by: David Schulz --- src/plugins/coreplugin/editormanager/documentmodel.cpp | 2 ++ src/plugins/coreplugin/editormanager/documentmodel.h | 2 ++ src/plugins/coreplugin/editormanager/openeditorsview.cpp | 6 ++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp index e8183401bf6..d7eb164dd2e 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.cpp +++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp @@ -307,6 +307,8 @@ QVariant DocumentModelPrivate::data(const QModelIndex &index, int role) const return QVariant(); case Qt::ToolTipRole: return entry->filePath().isEmpty() ? entry->displayName() : entry->filePath().toUserOutput(); + case DocumentModel::FilePathRole: + return entry->filePath().toVariant(); default: break; } diff --git a/src/plugins/coreplugin/editormanager/documentmodel.h b/src/plugins/coreplugin/editormanager/documentmodel.h index 6c7d0f0be32..3ac2a52c202 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.h +++ b/src/plugins/coreplugin/editormanager/documentmodel.h @@ -69,6 +69,8 @@ public: static QList editorsForDocuments(const QList &entries); static QList editorsForOpenedDocuments(); + static const int FilePathRole = Qt::UserRole + 23; + private: DocumentModel(); }; diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.cpp b/src/plugins/coreplugin/editormanager/openeditorsview.cpp index ebf2d751ec9..34e58565a94 100644 --- a/src/plugins/coreplugin/editormanager/openeditorsview.cpp +++ b/src/plugins/coreplugin/editormanager/openeditorsview.cpp @@ -17,6 +17,8 @@ #include #include +using namespace Utils; + namespace Core::Internal { class ProxyModel : public QAbstractProxyModel @@ -253,8 +255,8 @@ QVariant ProxyModel::data(const QModelIndex &index, int role) const const QVariant sourceDecoration = QAbstractProxyModel::data(index, role); if (sourceDecoration.isValid()) return sourceDecoration; - const QString fileName = QAbstractProxyModel::data(index, Qt::DisplayRole).toString(); - return Utils::FileIconProvider::icon(Utils::FilePath::fromString(fileName)); + const QVariant filePath = QAbstractProxyModel::data(index, DocumentModel::FilePathRole); + return FileIconProvider::icon(FilePath::fromVariant(filePath)); } return QAbstractProxyModel::data(index, role); From f5fd5f1fd3ecbc87bb59257374df38ca3419d675 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 5 Dec 2023 21:05:58 +0100 Subject: [PATCH 4/7] CMakePM: Fix Conan iOS/macOS package manager auto-setup CMAKE_SYSROOT is used by Qt Creator for cross-compiling, and also selecting toolchain on macOS. Whilst for iOS CMAKE_OSX_SYSROOT is used for the same task. Make sure to pass these CMake variables to conan via the generated toolchain file. Qt Creator also uses for iOS the Xcode generator, which is a multi- configuration generator. This patchset will set the "Debug" and "Release" configurations that usually conan scripts use. Fixes: QTCREATORBUG-29978 Change-Id: I23c5d94f830aaf81c5d27f821c09545ddfd45df6 Reviewed-by: Eike Ziller --- .../3rdparty/package-manager/auto-setup.cmake | 86 ++++++++++++------- 1 file changed, 54 insertions(+), 32 deletions(-) diff --git a/src/share/3rdparty/package-manager/auto-setup.cmake b/src/share/3rdparty/package-manager/auto-setup.cmake index 59a43692dfb..2b14e4ae2b9 100644 --- a/src/share/3rdparty/package-manager/auto-setup.cmake +++ b/src/share/3rdparty/package-manager/auto-setup.cmake @@ -31,6 +31,13 @@ macro(qtc_auto_setup_compiler_standard toolchainFile) endif() endforeach() endforeach() + + foreach(osx_var CMAKE_SYSROOT CMAKE_OSX_SYSROOT CMAKE_OSX_ARCHITECTURES) + if (${osx_var}) + file(APPEND "${toolchainFile}" + "set(${osx_var} ${${osx_var}})\n") + endif() + endforeach() endmacro() # @@ -101,47 +108,61 @@ macro(qtc_auto_setup_conan) "include(\"${CMAKE_TOOLCHAIN_FILE}\")\n") endif() - file(WRITE "${CMAKE_BINARY_DIR}/conan-dependencies/CMakeLists.txt" " - cmake_minimum_required(VERSION 3.15) + file(WRITE "${CMAKE_BINARY_DIR}/conan-dependencies/CMakeLists.txt" " + cmake_minimum_required(VERSION 3.15) - unset(CMAKE_PROJECT_INCLUDE_BEFORE CACHE) - project(conan-setup) + unset(CMAKE_PROJECT_INCLUDE_BEFORE CACHE) + project(conan-setup) - if (${conan_version} VERSION_GREATER_EQUAL 2.0) - set(CONAN_COMMAND \"${conan_program}\") - include(\"${CMAKE_CURRENT_LIST_DIR}/conan_provider.cmake\") - conan_profile_detect_default() - detect_host_profile(\"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\") + if (${conan_version} VERSION_GREATER_EQUAL 2.0) + set(CONAN_COMMAND \"${conan_program}\") + include(\"${CMAKE_CURRENT_LIST_DIR}/conan_provider.cmake\") + conan_profile_detect_default() + detect_host_profile(\"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\") + set(build_types \${CMAKE_BUILD_TYPE}) + if (CMAKE_CONFIGURATION_TYPES) + set(build_types \${CMAKE_CONFIGURATION_TYPES}) + endif() + + foreach(type \${build_types}) conan_install( -pr \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\" --build=${QT_CREATOR_CONAN_BUILD_POLICY} - -s build_type=${CMAKE_BUILD_TYPE} + -s build_type=\${type} -g CMakeDeps) + endforeach() - get_property(CONAN_INSTALL_SUCCESS GLOBAL PROPERTY CONAN_INSTALL_SUCCESS) - if (CONAN_INSTALL_SUCCESS) - get_property(CONAN_GENERATORS_FOLDER GLOBAL PROPERTY CONAN_GENERATORS_FOLDER) - file(WRITE \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake\" \" - list(PREPEND CMAKE_PREFIX_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") - list(PREPEND CMAKE_MODULE_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") - list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH) - list(REMOVE_DUPLICATES CMAKE_MODULE_PATH) - set(CMAKE_PREFIX_PATH \\\"\\\${CMAKE_PREFIX_PATH}\\\" CACHE STRING \\\"\\\" FORCE) - set(CMAKE_MODULE_PATH \\\"\\\${CMAKE_MODULE_PATH}\\\" CACHE STRING \\\"\\\" FORCE) - \") - endif() - else() - include(\"${CMAKE_CURRENT_LIST_DIR}/conan.cmake\") - conan_cmake_run( - CONANFILE \"${conanfile_txt}\" - INSTALL_FOLDER \"${CMAKE_BINARY_DIR}/conan-dependencies\" - GENERATORS cmake_paths cmake_find_package json - BUILD ${QT_CREATOR_CONAN_BUILD_POLICY} - ENV CONAN_CMAKE_TOOLCHAIN_FILE=\"${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake\" - ) + get_property(CONAN_INSTALL_SUCCESS GLOBAL PROPERTY CONAN_INSTALL_SUCCESS) + if (CONAN_INSTALL_SUCCESS) + get_property(CONAN_GENERATORS_FOLDER GLOBAL PROPERTY CONAN_GENERATORS_FOLDER) + file(WRITE \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake\" \" + list(PREPEND CMAKE_PREFIX_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") + list(PREPEND CMAKE_MODULE_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") + list(PREPEND CMAKE_FIND_ROOT_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") + list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH) + list(REMOVE_DUPLICATES CMAKE_MODULE_PATH) + list(REMOVE_DUPLICATES CMAKE_FIND_ROOT_PATH) + set(CMAKE_PREFIX_PATH \\\"\\\${CMAKE_PREFIX_PATH}\\\" CACHE STRING \\\"\\\" FORCE) + set(CMAKE_MODULE_PATH \\\"\\\${CMAKE_MODULE_PATH}\\\" CACHE STRING \\\"\\\" FORCE) + set(CMAKE_FIND_ROOT_PATH \\\"\\\${CMAKE_FIND_ROOT_PATH}\\\" CACHE STRING \\\"\\\" FORCE) + \") endif() - ") + else() + include(\"${CMAKE_CURRENT_LIST_DIR}/conan.cmake\") + conan_cmake_run( + CONANFILE \"${conanfile_txt}\" + INSTALL_FOLDER \"${CMAKE_BINARY_DIR}/conan-dependencies\" + GENERATORS cmake_paths cmake_find_package json + BUILD ${QT_CREATOR_CONAN_BUILD_POLICY} + ENV CONAN_CMAKE_TOOLCHAIN_FILE=\"${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake\" + ) + endif() + ") + + if (NOT DEFINED CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES) + set(CMAKE_CONFIGURATION_TYPES "Debug;Release") + endif() execute_process(COMMAND ${CMAKE_COMMAND} -S "${CMAKE_BINARY_DIR}/conan-dependencies/" @@ -150,6 +171,7 @@ macro(qtc_auto_setup_conan) -D "CMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake" -G ${CMAKE_GENERATOR} -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -D "CMAKE_CONFIGURATION_TYPES=${CMAKE_CONFIGURATION_TYPES}" RESULT_VARIABLE result ) if (result EQUAL 0) From 7aa57249b80824f355048b922c4657cc35001266 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 5 Jan 2024 15:00:21 +0100 Subject: [PATCH 5/7] Doc: Describe setting CLICOLOR_FORCE to 0 ...to disable the ANSI Escape codes support in CMake. Task-number: QTCREATORBUG-30147 Change-Id: Icbc5fa26652d85bbd89d827914b2c59051c69ab0 Reviewed-by: Cristian Adam --- ...-build-configuration-set-clicolor-force.webp | Bin 0 -> 17588 bytes .../cmake/creator-projects-cmake-building.qdoc | 12 +++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 doc/qtcreator/images/qtcreator-build-configuration-set-clicolor-force.webp diff --git a/doc/qtcreator/images/qtcreator-build-configuration-set-clicolor-force.webp b/doc/qtcreator/images/qtcreator-build-configuration-set-clicolor-force.webp new file mode 100644 index 0000000000000000000000000000000000000000..fcb66513a39143a07bd87bd68324fbfae1f75330 GIT binary patch literal 17588 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 NyW{i^EBr3$003&xbx!~Q literal 0 HcmV?d00001 diff --git a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc index 9c971d24798..0ac1ae4ba96 100644 --- a/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc +++ b/doc/qtcreator/src/cmake/creator-projects-cmake-building.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2023 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only /*! @@ -183,6 +183,16 @@ To hide the output, select the \inlineimage icons/rightsidebaricon.png (\uicontrol {Hide/Show Right Sidebar}) button or press \key {Alt+Shift+0}. + \section1 CLICOLOR_FORCE Environment Variable + + \QC sets the environment variable \c CLICOLOR_FORCE to \e 1 to show + ANSI-colored output for CMake. This might affect the process output. + + If the output looks incorrect or different from earlier \QC versions, try + setting \c CLICOLOR_FORCE to \e 0 in \uicontrol {Use Build Environment}. + + \image qtcreator-build-configuration-set-clicolor-force.webp {Build Environment with CLICOLOR_FORCE set} + \section1 CMake Build Steps \QC builds CMake projects by running \c {cmake . --build}, which then runs From a213ce3875955f3b72f46f841899726ea179807e Mon Sep 17 00:00:00 2001 From: Mathias Hasselmann Date: Sat, 6 Jan 2024 16:23:51 +0100 Subject: [PATCH 6/7] TextEditor: Repair insertExtraToolBarWidget() New extra widgets for the right side were wrongly inserted between the buttons for line-ending text-encoding. Task-number: QTCREATORBUG-30166 Change-Id: I0f55c44344f9586e6aa97da20f5e25c28adf964c Reviewed-by: David Schulz --- src/plugins/texteditor/texteditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index e59bc993fca..eb22736a4b3 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -8554,7 +8554,7 @@ QAction * TextEditorWidget::insertExtraToolBarWidget(TextEditorWidget::Side side findLeftMostAction); return d->m_toolBar->insertWidget(before, widget); } else { - return d->m_toolBar->insertWidget(d->m_fileEncodingLabelAction, widget); + return d->m_toolBar->insertWidget(d->m_fileLineEndingAction, widget); } } From a61f9162f10e54f31dcc5b0221e11b5ca81f186b Mon Sep 17 00:00:00 2001 From: David Faure Date: Wed, 29 Nov 2023 10:46:55 +0100 Subject: [PATCH 7/7] Fix TreeModel emitting nested QAbstractItemModel signals This led to an assert in QSFPM because it got confused by the nested reset signals. Detected by adding new QAbstractItemModelTester(this, QAbstractItemModelTester::FailureReportingMode::Fatal); to the OutlineModel constructor, and just opening QtCreator on a small qmake-based project. Fixes: QTCREATORBUG-30035 Change-Id: I41dbc81b5a2275521ece6b865115e1428e07ecf7 Reviewed-by: Reviewed-by: hjk (cherry picked from commit 9124833a63e9b933587a4df2aff9b5a7066568d2) Reviewed-by: David Faure --- src/libs/utils/treemodel.cpp | 20 ++++++++++++++++---- src/libs/utils/treemodel.h | 4 +++- src/plugins/cppeditor/cppoutlinemodel.cpp | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/libs/utils/treemodel.cpp b/src/libs/utils/treemodel.cpp index fe96b9c83e4..4649bb43c86 100644 --- a/src/libs/utils/treemodel.cpp +++ b/src/libs/utils/treemodel.cpp @@ -604,7 +604,7 @@ TreeItem::~TreeItem() { QTC_CHECK(m_parent == nullptr); QTC_CHECK(m_model == nullptr); - removeChildren(); + removeChildrenSilently(); } TreeItem *TreeItem::childAt(int pos) const @@ -714,6 +714,13 @@ void TreeItem::removeChildren() } } +void TreeItem::removeChildrenSilently() +{ + if (childCount() == 0) + return; + clear(); +} + void TreeItem::sortChildren(const std::function &cmp) { if (m_model) { @@ -1060,6 +1067,13 @@ TreeItem *BaseTreeModel::rootItem() const } void BaseTreeModel::setRootItem(TreeItem *item) +{ + beginResetModel(); + setRootItemInternal(item); + endResetModel(); +} + +void BaseTreeModel::setRootItemInternal(TreeItem *item) { QTC_ASSERT(item, return); QTC_ASSERT(item->m_model == nullptr, return); @@ -1067,19 +1081,17 @@ void BaseTreeModel::setRootItem(TreeItem *item) QTC_ASSERT(item != m_root, return); QTC_CHECK(m_root); - beginResetModel(); if (m_root) { QTC_CHECK(m_root->m_parent == nullptr); QTC_CHECK(m_root->m_model == this); // needs to be done explicitly before setting the model to 0, otherwise it might lead to a // crash inside a view or proxy model, especially if there are selected items - m_root->removeChildren(); + m_root->removeChildrenSilently(); m_root->m_model = nullptr; delete m_root; } m_root = item; item->propagateModel(this); - endResetModel(); } void BaseTreeModel::setHeader(const QStringList &displays) diff --git a/src/libs/utils/treemodel.h b/src/libs/utils/treemodel.h index a8cc073fcff..fa960698b67 100644 --- a/src/libs/utils/treemodel.h +++ b/src/libs/utils/treemodel.h @@ -39,6 +39,7 @@ public: void removeChildAt(int pos); void removeChildren(); + void removeChildrenSilently(); void sortChildren(const std::function &cmp); void update(); void updateAll(); @@ -180,7 +181,8 @@ protected: void clear(); TreeItem *rootItem() const; - void setRootItem(TreeItem *item); + void setRootItem(TreeItem *item); // resets the model + void setRootItemInternal(TreeItem *item); TreeItem *itemForIndex(const QModelIndex &) const; QModelIndex indexForItem(const TreeItem *needle) const; diff --git a/src/plugins/cppeditor/cppoutlinemodel.cpp b/src/plugins/cppeditor/cppoutlinemodel.cpp index 068dc310b1e..c03236f274e 100644 --- a/src/plugins/cppeditor/cppoutlinemodel.cpp +++ b/src/plugins/cppeditor/cppoutlinemodel.cpp @@ -219,7 +219,7 @@ void OutlineModel::rebuild() auto root = new SymbolItem; if (m_cppDocument) buildTree(root, true); - setRootItem(root); + setRootItemInternal(root); endResetModel(); }