diff --git a/cmake/Findyaml-cpp.cmake b/cmake/Findyaml-cpp.cmake index 2c5b2a60d25..b122ea8a32c 100644 --- a/cmake/Findyaml-cpp.cmake +++ b/cmake/Findyaml-cpp.cmake @@ -17,8 +17,6 @@ if (yaml-cpp_FOUND) endif() set_target_properties(yaml-cpp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${yaml_cpp_include_dir}") else() - set(yaml-cpp_FOUND 1) - set_package_properties(yaml-cpp PROPERTIES DESCRIPTION "using internal src/libs/3rdparty/yaml-cpp") set(YAML_SOURCE_DIR ${PROJECT_SOURCE_DIR}/src/libs/3rdparty/yaml-cpp) add_qtc_library(yaml-cpp DEFINES YAML_CPP_DLL yaml_cpp_EXPORTS @@ -114,8 +112,12 @@ else() ${YAML_SOURCE_DIR}/src/tag.h ${YAML_SOURCE_DIR}/src/token.h ) - if(MSVC) - target_compile_options(yaml-cpp PUBLIC /wd4251 /wd4275) + if(TARGET yaml-cpp) + set(yaml-cpp_FOUND 1) + set_package_properties(yaml-cpp PROPERTIES DESCRIPTION "using internal src/libs/3rdparty/yaml-cpp") + if(MSVC) + target_compile_options(yaml-cpp PUBLIC /wd4251 /wd4275) + endif() endif() unset(YAML_SOURCE_DIR) endif() diff --git a/dist/changes-4.14.0.md b/dist/changes-4.14.0.md index 7dd06282574..a3b4dc9cd31 100644 --- a/dist/changes-4.14.0.md +++ b/dist/changes-4.14.0.md @@ -28,6 +28,7 @@ Editing ### C++ +* Updated to LLVM 11 * Added refactoring action that creates getters and setters for all class members (QTCREATORBUG-14504) * Added refactoring action that generates member from class member initialization @@ -207,17 +208,20 @@ André Pönitz Antonio Di Monaco Asit Dhal Assam Boudjelthia +Björn Schäpers Christiaan Janssen Christian Kandeler Christian Stenger Cristian Adam David Schulz +Dawid Sliwa Denis Shienkov Eike Ziller Fabio Falsini Fawzi Mohamed Federico Guerinoni Henning Gruendl +Ivan Komissarov Jaroslaw Kobus Jeremy Ephron Jochen Seemann @@ -233,16 +237,22 @@ Mahmoud Badri Marco Bubke Martin Kampas Michael Weghorn +Michael Winkelmann Miikka Heikkinen Miklós Márton Morten Johan Sørvig Orgad Shaneh +Oswald Buddenhagen +Raphaël Cotty +Richard Weickelt Robert Löhning Tasuku Suzuki Thiago Macieira Thomas Hartmann Tim Jenssen Tobias Hunger +Venugopal Shivashankar Vikas Pachdha +Ville Voutilainen Volodymyr Zibarov Wojciech Smigaj diff --git a/scripts/deployqt.py b/scripts/deployqt.py index 4dc11b6cf59..e032f45decb 100755 --- a/scripts/deployqt.py +++ b/scripts/deployqt.py @@ -239,7 +239,7 @@ def deploy_libclang(install_dir, llvm_install_dir, chrpath_bin): deployinfo.append((os.path.join(llvm_install_dir, 'bin', 'libclang.dll'), os.path.join(install_dir, 'bin'))) for binary in ['clang', 'clang-cl', 'clangd', 'clang-tidy', 'clazy-standalone']: - binary_filepath = os.path.join(llvm_install_dir, 'bin', 'clang.exe') + binary_filepath = os.path.join(llvm_install_dir, 'bin', binary + '.exe') if os.path.exists(binary_filepath): deployinfo.append((binary_filepath, clangbindirtarget)) resourcetarget = os.path.join(clanglibdirtarget, 'clang') diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri index f0285ca4b0d..940047c6b2c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/qml2puppet.pri @@ -2,7 +2,7 @@ QT += core gui widgets qml quick network QT += core-private qml-private quick-private gui-private CONFIG += c++17 -win32: QMAKE_CXXFLAGS += /std:c++17 +win32:!mingw: QMAKE_CXXFLAGS += /std:c++17 DEFINES -= QT_CREATOR diff --git a/src/libs/advanceddockingsystem/dockmanager.cpp b/src/libs/advanceddockingsystem/dockmanager.cpp index 4615df6bfeb..dd67af205a2 100644 --- a/src/libs/advanceddockingsystem/dockmanager.cpp +++ b/src/libs/advanceddockingsystem/dockmanager.cpp @@ -92,7 +92,7 @@ namespace ADS { public: DockManager *q; - QList m_floatingWidgets; + QList> m_floatingWidgets; QList m_containers; DockOverlay *m_containerOverlay = nullptr; DockOverlay *m_dockAreaOverlay = nullptr; @@ -357,9 +357,11 @@ namespace ADS save(); saveStartupWorkspace(); - for (auto floatingWidget : d->m_floatingWidgets) - delete floatingWidget; - + for (auto floatingWidget : d->m_floatingWidgets) { + if (floatingWidget) + delete floatingWidget.data(); + } + d->m_floatingWidgets.clear(); delete d; } @@ -485,7 +487,7 @@ namespace ADS return d->m_containers; } - const QList DockManager::floatingWidgets() const + const QList> DockManager::floatingWidgets() const { return d->m_floatingWidgets; } diff --git a/src/libs/advanceddockingsystem/dockmanager.h b/src/libs/advanceddockingsystem/dockmanager.h index 43ba751e48b..174239e22a7 100644 --- a/src/libs/advanceddockingsystem/dockmanager.h +++ b/src/libs/advanceddockingsystem/dockmanager.h @@ -389,7 +389,7 @@ public: /** * Returns the list of all floating widgets. */ - const QList floatingWidgets() const; + const QList > floatingWidgets() const; /** * This function always return 0 because the main window is always behind diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 5fb6929ab78..794d3dab7df 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -1428,6 +1428,7 @@ AspectContainer::~AspectContainer() = default; void AspectContainer::addAspectHelper(BaseAspect *aspect) { d->m_items.append(aspect); + connect(aspect, &BaseAspect::changed, this, &BaseAspect::changed); } /*! diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index da9ac09c1fa..b8fd741928e 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -372,6 +372,11 @@ static QString preferredAbi(const QStringList &appAbis, const Target *target) QString AndroidManager::apkDevicePreferredAbi(const Target *target) { auto libsPath = dirPath(target).pathAppended("libs"); + if (!libsPath.exists()) { + if (const ProjectNode *node = currentProjectNode(target)) + return preferredAbi(node->data(Android::Constants::ANDROID_ABIS).toStringList(), + target); + } QStringList apkAbis; for (const auto &abi : QDir{libsPath.toString()}.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) if (!QDir{libsPath.pathAppended(abi).toString()}.entryList(QStringList("*.so"), QDir::Files | QDir::NoDotAndDotDot).isEmpty()) diff --git a/src/plugins/help/qlitehtml/CMakeLists.txt b/src/plugins/help/qlitehtml/CMakeLists.txt index 19a003db04b..5c7957a88c5 100644 --- a/src/plugins/help/qlitehtml/CMakeLists.txt +++ b/src/plugins/help/qlitehtml/CMakeLists.txt @@ -1,14 +1,26 @@ -cmake_minimum_required(VERSION 3.10) - -project(QLiteHtml) - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/litehtml/CMakeLists.txt) set(ORIG_FPIC ${CMAKE_POSITION_INDEPENDENT_CODE}) if (WIN32) set(LITEHTML_UTF8 ON CACHE BOOL "") endif() set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # suppress warning about VERSION being overwritten or not + # and add subdirectory + set(ORIG_VERSION ${PROJECT_VERSION}) + set(ORIG_MAJOR ${PROJECT_VERSION_MAJOR}) + set(ORIG_MINOR ${PROJECT_VERSION_MINOR}) + set(ORIG_PATCH ${PROJECT_VERSION_PATCH}) + set(PROJECT_VERSION "") + set(PROJECT_VERSION_MAJOR "") + set(PROJECT_VERSION_MINOR "") + set(PROJECT_VERSION_PATCH "") add_subdirectory(litehtml EXCLUDE_FROM_ALL) + set(PROJECT_VERSION ${ORIG_VERSION}) + set(PROJECT_VERSION_MAJOR ${ORIG_MAJOR}) + set(PROJECT_VERSION_MINOR ${ORIG_MINOR}) + set(PROJECT_VERSION_PATCH ${ORIG_PATCH}) + set(CMAKE_POSITION_INDEPENDENT_CODE "${ORIG_FPIC}") # force optimized litehtml even in debug if (CMAKE_BUILD_TYPE STREQUAL "Debug") @@ -22,13 +34,6 @@ else() find_package(litehtml REQUIRED) endif() -find_package(Qt5 COMPONENTS Widgets REQUIRED) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) -set(CMAKE_CXX_STANDARD 17) - add_qtc_library(qlitehtml PUBLIC_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS Qt5::Widgets litehtml diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 61b7b005dec..68731e30a12 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -151,6 +151,33 @@ QString QbsProductNode::getBuildKey(const QJsonObject &product) + product.value("multiplex-configuration-id").toString(); } +bool QbsProductNode::isAggregated() const +{ + return m_productData.value("is-multiplexed").toBool() + && m_productData.value("multiplex-configuration-id").toString().isEmpty(); +} + +const QList QbsProductNode::aggregatedProducts() const +{ + if (!isAggregated()) + return {}; + const ProjectNode *parentNode = managingProject(); + QTC_ASSERT(parentNode != nullptr && parentNode != this, return {}); + + QSet dependencies; + for (const auto &a : m_productData.value("dependencies").toArray()) + dependencies << a.toString(); + + QList qbsProducts; + parentNode->forEachProjectNode([&qbsProducts, dependencies](const ProjectNode *node) { + if (const auto qbsChildNode = dynamic_cast(node)) { + if (dependencies.contains(qbsChildNode->fullDisplayName())) + qbsProducts << qbsChildNode; + } + }); + return qbsProducts; +} + QVariant QbsProductNode::data(Id role) const { if (role == Android::Constants::AndroidDeploySettingsFile) { @@ -164,10 +191,16 @@ QVariant QbsProductNode::data(Id role) const if (role == Android::Constants::AndroidSoLibPath) { QStringList ret{m_productData.value("build-directory").toString()}; - forAllArtifacts(m_productData, ArtifactType::Generated, [&ret](const QJsonObject &artifact) { - if (artifact.value("file-tags").toArray().contains("dynamiclibrary")) - ret << QFileInfo(artifact.value("file-path").toString()).path(); - }); + if (!isAggregated()) { + forAllArtifacts(m_productData, ArtifactType::Generated, + [&ret](const QJsonObject &artifact) { + if (artifact.value("file-tags").toArray().contains("dynamiclibrary")) + ret << QFileInfo(artifact.value("file-path").toString()).path(); + }); + } else { + for (const auto &a : aggregatedProducts()) + ret += a->data(Android::Constants::AndroidSoLibPath).toStringList(); + } ret.removeDuplicates(); return ret; } @@ -188,6 +221,28 @@ QVariant QbsProductNode::data(Id role) const return m_productData.value("module-properties").toObject() .value("Qt.core.enableKeywords").toBool(); + if (role == Android::Constants::ANDROID_ABIS) { + // Try using qbs.architectures + QStringList qbsAbis; + QMap archToAbi { + {"armv7a", ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A}, + {"arm64", ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A}, + {"x86", ProjectExplorer::Constants::ANDROID_ABI_X86}, + {"x86_64", ProjectExplorer::Constants::ANDROID_ABI_X86_64}}; + for (const auto &a : m_productData.value("module-properties").toObject() + .value(Constants::QBS_ARCHITECTURES).toArray()) { + if (archToAbi.contains(a.toString())) + qbsAbis << archToAbi[a.toString()]; + } + if (!qbsAbis.empty()) + return qbsAbis; + // Try using qbs.architecture + QString architecture = m_productData.value("module-properties").toObject() + .value(Constants::QBS_ARCHITECTURE).toString(); + if (archToAbi.contains(architecture)) + qbsAbis << archToAbi[architecture]; + return qbsAbis; + } return {}; } diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h index f5131e0f73c..0f188ea6dc0 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.h +++ b/src/plugins/qbsprojectmanager/qbsnodes.h @@ -65,6 +65,9 @@ public: static QString getBuildKey(const QJsonObject &product); + bool isAggregated() const; + const QList aggregatedProducts() const; + const QJsonObject productData() const { return m_productData; } QJsonObject mainGroup() const; QVariant data(Utils::Id role) const override; diff --git a/src/plugins/qbsprojectmanager/qbssession.cpp b/src/plugins/qbsprojectmanager/qbssession.cpp index 87257178c85..c374f75d9d5 100644 --- a/src/plugins/qbsprojectmanager/qbssession.cpp +++ b/src/plugins/qbsprojectmanager/qbssession.cpp @@ -376,6 +376,8 @@ RunEnvironmentResult QbsSession::getRunEnvironment( void QbsSession::insertRequestedModuleProperties(QJsonObject &request) { request.insert("module-properties", QJsonArray::fromStringList({ + "qbs.architecture", + "qbs.architectures", "cpp.commonCompilerFlags", "cpp.compilerVersionMajor", "cpp.compilerVersionMinor", diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index f71b1a42510..c867b9a67d8 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -174,6 +174,9 @@ public: ModelNode getNodeForCanonicalIndex(int index); +signals: + void modelInterfaceProjectUpdated(); + protected: // functions void importAdded(const Import &import); void importRemoved(const Import &import); @@ -191,6 +194,7 @@ private: //variables ModelNode nodeAtTextCursorPositionHelper(const ModelNode &root, int cursorPosition) const; void setupCanonicalHashes() const; void handleLibraryInfoUpdate(); + void handleProjectUpdate(); TextModifier *m_textModifier = nullptr; int transactionLevel = 0; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 83d55ee097d..04ec87e0775 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -91,6 +91,10 @@ RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *paren QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); connect(modelManager, &QmlJS::ModelManagerInterface::libraryInfoUpdated, this, &RewriterView::handleLibraryInfoUpdate, Qt::QueuedConnection); + connect(modelManager, &QmlJS::ModelManagerInterface::projectInfoUpdated, + this, &RewriterView::handleProjectUpdate, Qt::DirectConnection); + connect(this, &RewriterView::modelInterfaceProjectUpdated, + this, &RewriterView::handleLibraryInfoUpdate, Qt::QueuedConnection); } RewriterView::~RewriterView() = default; @@ -832,6 +836,11 @@ void RewriterView::handleLibraryInfoUpdate() m_amendTimer.start(); } +void RewriterView::handleProjectUpdate() +{ + emit modelInterfaceProjectUpdated(); +} + ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const { return nodeAtTextCursorPositionHelper(rootModelNode(), cursorPosition); diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.cpp b/src/plugins/qmlpreview/qmlpreviewplugin.cpp index f71653b026a..fa409586ba3 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.cpp +++ b/src/plugins/qmlpreview/qmlpreviewplugin.cpp @@ -99,8 +99,22 @@ static QByteArray defaultFileLoader(const QString &filename, bool *success) static bool defaultFileClassifier(const QString &filename) { - // We cannot dynamically load changes in qtquickcontrols2.conf - return !filename.endsWith("qtquickcontrols2.conf"); + const QStringList list = { + ".glsl", + ".glslv", + ".glslf", + ".vsh", + ".fsh", + ".frag", + ".vert", + "qtquickcontrols2.conf" }; + + for (const QString &suffix : list) + if (filename.endsWith(suffix)) + return false; + + // We cannot dynamically load changes in qtquickcontrols2.conf and shaders + return true; } static void defaultFpsHandler(quint16 frames[8]) diff --git a/src/plugins/studiowelcome/qml/welcomepage/ExamplesModel.qml b/src/plugins/studiowelcome/qml/welcomepage/ExamplesModel.qml index e4dc358b591..97bbbb597f4 100644 --- a/src/plugins/studiowelcome/qml/welcomepage/ExamplesModel.qml +++ b/src/plugins/studiowelcome/qml/welcomepage/ExamplesModel.qml @@ -28,7 +28,7 @@ import QtQuick 2.0 ListModel { ListElement { projectName: "ClusterTutorial" - qmlFileName: "Cluster_Art.ui.qml" + qmlFileName: "ClusterTutorial.qml" thumbnail: "images/tutorialclusterdemo_thumbnail.png" displayName: "Cluster Tutorial" } @@ -42,21 +42,21 @@ ListModel { ListElement { projectName: "SideMenu" - qmlFileName: "MainFile.ui.qml" + qmlFileName: "SideMenu.qml" thumbnail: "images/sidemenu_demo.png" displayName: "Side Menu" } ListElement { projectName: "WebinarDemo" - qmlFileName: "MainApp.ui.qml" + qmlFileName: "DesignStudioWebinar.qml" thumbnail: "images/webinardemo_thumbnail.png" displayName: "Webinar Demo" } ListElement { projectName: "EBikeDesign" - qmlFileName: "Screen01.ui.qml" + qmlFileName: "EBikeDesign.qml" thumbnail: "images/ebike_demo_thumbnail.png" displayName: "E-Bike Design" } diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index 38c7f93daf8..b64bd3461ad 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -610,8 +610,8 @@ protected: virtual void slotCursorPositionChanged(); // Used in VcsBase virtual void slotCodeStyleSettingsChanged(const QVariant &); // Used in CppEditor - bool inFindScope(const QTextCursor &cursor); - bool inFindScope(int selectionStart, int selectionEnd); + Q_INVOKABLE bool inFindScope(const QTextCursor &cursor); + Q_INVOKABLE bool inFindScope(int selectionStart, int selectionEnd); private: Internal::TextEditorWidgetPrivate *d;