From 468e641b959baeca209e17a7c57ccdbe10e5ea4e Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Mon, 26 Apr 2021 11:46:46 +0200 Subject: [PATCH 01/24] Update Qbs submodule to the top of 1.19 branch Change-Id: I4226573dd4d4450ddc6e6f46b502dbd1251226f1 Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 2f6eecdc96f..adf00fb1a0f 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 2f6eecdc96fcd693cecef8011d8f9500c7872fc7 +Subproject commit adf00fb1a0faed60b045dced0773761b5cf89251 From 758af0ee075004e3f3492f1d269d9686517d8e46 Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Tue, 27 Apr 2021 09:59:19 +0200 Subject: [PATCH 02/24] Update Qbs submodule to the top of 1.19 branch Change-Id: If2a9dbf7d20e7294a7e999aae0179544be404e91 Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index adf00fb1a0f..1e092969ae0 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit adf00fb1a0faed60b045dced0773761b5cf89251 +Subproject commit 1e092969ae070e3a967dd86ed06fd8531f94cd6f From 64a15b97b7e89f164c70b4e47990e24e9cf3fd5a Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 26 Apr 2021 15:00:26 +0200 Subject: [PATCH 03/24] ProjectExplorer: refine toolchain abi check Filter out toolchains targeting a different word with or architecture than the Qt version. Change-Id: Iac2fb1b30d493e10dc4bd92b5585bbb9faa76d4a Reviewed-by: Alessandro Portale Reviewed-by: Eike Ziller --- src/plugins/qtsupport/baseqtversion.cpp | 7 +++++-- src/plugins/qtsupport/qtkitinformation.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 454c0d7b01f..e9feec7f2a4 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -526,8 +526,11 @@ Tasks BaseQtVersion::validateKit(const Kit *k) qtAbiString.append(' '); qtAbiString.append(qtAbi.toString()); - if (!fullMatch) - fullMatch = supportedAbis.contains(qtAbi); + if (!fullMatch) { + fullMatch = supportedAbis.contains(qtAbi) + && qtAbi.wordWidth() == targetAbi.wordWidth() + && qtAbi.architecture() == targetAbi.architecture(); + } if (!fuzzyMatch && !fullMatch) { fuzzyMatch = Utils::anyOf(supportedAbis, [&](const Abi &abi) { return qtAbi.isCompatibleWith(abi); diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index d6aca91001a..153f43ac0f1 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -224,8 +224,11 @@ void QtKitAspect::fix(Kit *k) QList possibleTcs = ToolChainManager::toolChains([version](const ToolChain *t) { if (!t->isValid() || t->language() != ProjectExplorer::Constants::CXX_LANGUAGE_ID) return false; - return Utils::anyOf(version->qtAbis(), - [t](const Abi &qtAbi) { return t->supportedAbis().contains(qtAbi); }); + return Utils::anyOf(version->qtAbis(), [t](const Abi &qtAbi) { + return t->supportedAbis().contains(qtAbi) + && t->targetAbi().wordWidth() == qtAbi.wordWidth() + && t->targetAbi().architecture() == qtAbi.architecture(); + }); }); if (!possibleTcs.isEmpty()) { // Prefer exact matches. From fbdec8ce21291b19eb810b6c63a42d1afc50ee67 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 23 Apr 2021 16:37:09 +0200 Subject: [PATCH 04/24] Doc: Add docs for SimpleKeyboard example Fixes: QDS-4140 Change-Id: Icf1da91512848881914ac4c44e47ecc6e5bc3903 Reviewed-by: Thomas Hartmann --- .../config/qtdesignstudio.qdocconf | 1 + .../SimpleKeyboard/SimpleKeyboard.qml | 118 ++++++++++++++++++ .../SimpleKeyboard/SimpleKeyboard.qmlproject | 45 +++++++ .../doc/images/simplekeyboard-component.png | Bin 0 -> 31760 bytes .../images/simplekeyboard-project-details.png | Bin 0 -> 10858 bytes .../examples/doc/images/simplekeyboard.png | Bin 0 -> 16825 bytes .../examples/doc/simplekeyboard.qdoc | 66 ++++++++++ 7 files changed, 230 insertions(+) create mode 100644 doc/qtdesignstudio/examples/SimpleKeyboard/SimpleKeyboard.qml create mode 100644 doc/qtdesignstudio/examples/SimpleKeyboard/SimpleKeyboard.qmlproject create mode 100644 doc/qtdesignstudio/examples/doc/images/simplekeyboard-component.png create mode 100644 doc/qtdesignstudio/examples/doc/images/simplekeyboard-project-details.png create mode 100644 doc/qtdesignstudio/examples/doc/images/simplekeyboard.png create mode 100644 doc/qtdesignstudio/examples/doc/simplekeyboard.qdoc diff --git a/doc/qtdesignstudio/config/qtdesignstudio.qdocconf b/doc/qtdesignstudio/config/qtdesignstudio.qdocconf index 5e710b4e67d..587dd583b40 100644 --- a/doc/qtdesignstudio/config/qtdesignstudio.qdocconf +++ b/doc/qtdesignstudio/config/qtdesignstudio.qdocconf @@ -90,6 +90,7 @@ depends += qtwidgets \ qtsensors \ qttestlib \ qtuitools \ + qtvirtualkeyboard \ qtxml include(../../config/macros.qdocconf) diff --git a/doc/qtdesignstudio/examples/SimpleKeyboard/SimpleKeyboard.qml b/doc/qtdesignstudio/examples/SimpleKeyboard/SimpleKeyboard.qml new file mode 100644 index 00000000000..b38438d35cb --- /dev/null +++ b/doc/qtdesignstudio/examples/SimpleKeyboard/SimpleKeyboard.qml @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Design Studio. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.15 +import SimpleKeyboard 1.0 +import QtQuick.VirtualKeyboard 2.15 +import QtQuick.Window 2.2 + +Window { + id: window + width: Constants.width + height: Constants.height + Item { + id: cornerItem + x: 0 + y: 0 + } + + property int activeFocusItemBottom : activeFocusItem == null ? 0 : Math.min(height, cornerItem.mapFromItem(activeFocusItem, 0, activeFocusItem.height).y + 50) + + Swiper { + id: view + width: window.width + height: window.height + y: !inputPanel.active ? 0 : Math.min(0, window.height - inputPanel.height - activeFocusItemBottom) + Behavior on y { + NumberAnimation { + duration: 250 + easing.type: Easing.InOutQuad + } + } + } + + Rectangle { + id: inputPanelBackground + anchors.left: parent.left + anchors.right: parent.right + anchors.top: inputPanel.top + anchors.bottom: inputPanel.bottom + color: "black" + } + + InputPanel { + id: inputPanel + x: window.width/2 - width/2 + y: window.height + width: Math.min(window.width, window.height) + + states: State { + name: "visible" + when: inputPanel.active + PropertyChanges { + target: inputPanel + y: window.height - inputPanel.height + } + } + transitions: Transition { + from: "" + to: "visible" + reversible: true + ParallelAnimation { + NumberAnimation { + properties: "y" + duration: 250 + easing.type: Easing.InOutQuad + } + } + } + } +} + diff --git a/doc/qtdesignstudio/examples/SimpleKeyboard/SimpleKeyboard.qmlproject b/doc/qtdesignstudio/examples/SimpleKeyboard/SimpleKeyboard.qmlproject new file mode 100644 index 00000000000..eeabdb75f7a --- /dev/null +++ b/doc/qtdesignstudio/examples/SimpleKeyboard/SimpleKeyboard.qmlproject @@ -0,0 +1,45 @@ +import QmlProject 1.1 + +Project { + mainFile: "SimpleKeyboard.qml" + + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "." + } + + JavaScriptFiles { + directory: "." + } + + ImageFiles { + directory: "." + } + + Files { + filter: "*.conf" + files: ["qtquickcontrols2.conf"] + } + + Files { + filter: "qmldir" + directory: "." + } + + Files { + filter: "*.ttf;*.otf" + } + + Environment { + QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" + QT_AUTO_SCREEN_SCALE_FACTOR: "1" + QT_IM_MODULE: "qtvirtualkeyboard" + QT_VIRTUALKEYBOARD_DESKTOP_DISABLE: 1 + } + + /* List of plugin directories passed to QML runtime */ + importPaths: [ "imports", "asset_imports" ] + + /* Required for deployment */ + targetDirectory: "/opt/SimpleKeyboard" +} diff --git a/doc/qtdesignstudio/examples/doc/images/simplekeyboard-component.png b/doc/qtdesignstudio/examples/doc/images/simplekeyboard-component.png new file mode 100644 index 0000000000000000000000000000000000000000..68122584532e5e29e8fc7218804fc68fcab65b3e GIT binary patch literal 31760 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 literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/images/simplekeyboard-project-details.png b/doc/qtdesignstudio/examples/doc/images/simplekeyboard-project-details.png new file mode 100644 index 0000000000000000000000000000000000000000..9a797d1fefbeba195078c5a2a1758da1aa19b6fa GIT binary patch literal 10858 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 K&t;ucLK6U^ZVp!f literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/images/simplekeyboard.png b/doc/qtdesignstudio/examples/doc/images/simplekeyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..1faf1dad9ab1b632528dd7bc7f3e0f5b2486bc46 GIT binary patch literal 16825 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 TA1h~IU|{fc^>bP0l+XkKUoXtp literal 0 HcmV?d00001 diff --git a/doc/qtdesignstudio/examples/doc/simplekeyboard.qdoc b/doc/qtdesignstudio/examples/doc/simplekeyboard.qdoc new file mode 100644 index 00000000000..ab63deab976 --- /dev/null +++ b/doc/qtdesignstudio/examples/doc/simplekeyboard.qdoc @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Design Studio documentation. +** +** 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 Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** +****************************************************************************/ + +/*! + \example SimpleKeyboard + \ingroup studioexamples + \brief Illustrates how to use a virtual keyboard in an application. + + \title Simple Keyboard + + \e {Simple Keyboard} provides a virtual keyboard for entering + text into several text fields. It uses functionality from the + \l{Qt Virtual Keyboard} module. + + \image simplekeyboard.png "Virtual keyboard opening from a text input field" + + The virtual keyboard is automatically displayed when users start entering + text into \l{Text Edit} or \l{Text Input} components. For more information + about using it, see \l{User Guide}{Virtual Keyboard: User Guide}. + + To test the virtual keyboard, you need to select the \inlineimage run_small.png + (\uicontrol Run) button to run the example on the desktop or a device. + The keyboard is not available during preview. + + \section1 Using a Virtual Keyboard + + First, we create an empty project, as described in \l {Creating Projects}. + For the purposes of this example, we call the project \e SimpleKeyboard. + We can use the default settings for other options, but we need to select + the \uicontrol {Use Qt Virtual Keyboard} check box on the + \uicontrol {Define Project Details} page. + + \image simplekeyboard-project-details.png "SimpleKeyboard project details" + + The project wizard template adds the Qt Quick Virtual Keyboard module + to the project and creates a component based on \l InputPanel in + \e SimpleKeyboard.qml. + + \image simplekeyboard-component.png "SimpleKeyboard component" + + We then create a tabbed UI that contains fields for entering text, among + other things. The virtual keyboard is automatically enabled for the text + edit and text input controls. +*/ From f4ccb56976f39d086358f4a6074ec68ea250e390 Mon Sep 17 00:00:00 2001 From: Johanna Vanhatapio Date: Tue, 27 Apr 2021 11:12:16 +0300 Subject: [PATCH 05/24] Doc: Fix some uicontrol commands Task-number: QDS-3407 Change-Id: I7491960f5e441b412d03d92039e4d9a55c51cd18 Reviewed-by: Leena Miettinen --- doc/qtcreator/src/user-interface/creator-ui.qdoc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/qtcreator/src/user-interface/creator-ui.qdoc b/doc/qtcreator/src/user-interface/creator-ui.qdoc index 8a55b16cfa7..4b2a30a93af 100644 --- a/doc/qtcreator/src/user-interface/creator-ui.qdoc +++ b/doc/qtcreator/src/user-interface/creator-ui.qdoc @@ -407,7 +407,8 @@ \endif panes, select \uicontrol View > \uicontrol {Output Panes}. \if defined(qtcreator) - To display the \uicontrol {To-Do Entries} pane, enable the Todo plugin. + To display the \uicontrol {To-Do Entries} pane, enable the \uicontrol Todo + plugin. \endif For more information about the \uicontrol {QML Debugger Console} view, see @@ -555,7 +556,7 @@ To specify settings for displaying application output, select \uicontrol Tools > \uicontrol Options > \uicontrol {Build & Run} > - \uicontrol Application Output, or click the \uicontrol {Open Settings Page} + \uicontrol {Application Output}, or click the \uicontrol {Open Settings Page} button. You can select whether to open the \uicontrol{Application Output} pane on output when running or debugging applications, to clear old output on a new run, to word-wrap output, and to limit output to the specified number of lines. @@ -575,7 +576,7 @@ To specify whether to open the \uicontrol {Compile Output} pane on output when building applications, select \uicontrol Tools > \uicontrol Options > - \uicontrol {Build & Run} > \uicontrol Compile Output, and then select the + \uicontrol {Build & Run} > \uicontrol {Compile Output}, and then select the \uicontrol {Open pane when building} check box. In the \uicontrol {Limit output to} field, you can specify the maximum amount of build output lines to display in the pane. From b3bd8b81c409023c49b89d731277807889514f91 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 27 Apr 2021 14:27:53 +0200 Subject: [PATCH 06/24] CMake: Do not remove "Current executable" target The "Current executable" target is an artificial target added by Qt Creator, so we must not remove it because it is not one of the targets from the project. Amends dbb5a70f93bb19c7907abcdc3b26248b2959c208 Fixes: QTCREATORBUG-24145 Change-Id: I4601bcbc7238c6bf54bc9aa3ef6eb934b65df96e Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/cmakebuildstep.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index e0c81b999e2..ff4463c7000 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -539,7 +539,9 @@ void CMakeBuildStep::recreateBuildTargetsModel() // Remove the targets that do not exist in the build system // This can result when selected targets get renamed if (!targetList.empty()) { - Utils::erase(m_buildTargets, [targetList](const QString &bt) { return !targetList.contains(bt); }); + Utils::erase(m_buildTargets, [targetList](const QString &bt) { + return !bt.isEmpty() /* "current executable" */ && !targetList.contains(bt); + }); if (m_buildTargets.empty()) m_buildTargets.push_back(m_allTarget); } From f0bdead36340010c0b44c04cf6498f50f3e905db Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 28 Apr 2021 07:48:19 +0300 Subject: [PATCH 07/24] Git: Fix crash when opening git grep search result with tree ... if the contents is unchanged. Amends commit eb6a2f2b895. Change-Id: Ief59a2ea2feeafa5834035402d461faf3c3c0e9e Reviewed-by: Eike Ziller --- src/plugins/git/gitgrep.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/git/gitgrep.cpp b/src/plugins/git/gitgrep.cpp index ff3130877f2..79c035cd72a 100644 --- a/src/plugins/git/gitgrep.cpp +++ b/src/plugins/git/gitgrep.cpp @@ -318,7 +318,8 @@ IEditor *GitGrep::openEditor(const SearchResultItem &item, const QString topLevel = parameters.additionalParameters.toString(); IEditor *editor = m_client->openShowEditor( topLevel, params.ref, path, GitClient::ShowEditor::OnlyIfDifferent); - editor->gotoLine(item.mainRange().begin.line, item.mainRange().begin.column); + if (editor) + editor->gotoLine(item.mainRange().begin.line, item.mainRange().begin.column); return editor; } From a547b820752cf81a5244651703a6e977df42c611 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sun, 25 Apr 2021 23:08:39 +0200 Subject: [PATCH 08/24] App: Set OpenGL backend using the Qt 6 API Qt 6 would emit: "Qt::AA_UseOpenGLES is no longer supported in Qt 6" Let's set the backend to OpenGL it via environment variable. Setting it via QQuickWindow::setSceneGraphBackend would add a dependency on "quick". Fixes: QTCREATORBUG-25637 Change-Id: Ice53be9440c586008dea9ab3731050a63073bab0 Reviewed-by: Alessandro Portale --- src/app/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 74f245d2c16..bc5e61c7840 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -537,9 +537,11 @@ int main(int argc, char **argv) } } -#ifdef Q_OS_WIN +#if defined(Q_OS_WIN) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0) if (!qEnvironmentVariableIsSet("QT_OPENGL")) QCoreApplication::setAttribute(Qt::AA_UseOpenGLES); +#else + qputenv("QT_QUICK_BACKEND", "opengl"); #endif if (qEnvironmentVariableIsSet("QTCREATOR_DISABLE_NATIVE_MENUBAR") From ca04d9afcdea1f22580d2999ca4e6657d60979d8 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 28 Apr 2021 11:23:56 +0200 Subject: [PATCH 09/24] CMakePM: Fix compile for gcc 7 Due to a compiler bug the content of the raw string is handled inside the preprocessor and the cmake comments end up as being noticed as unknown preprocessor directives. Change-Id: I3f235cfdd0799a6bb94743e2910663d9b0d3385d Reviewed-by: Cristian Adam --- .../cmakeprojectimporter.cpp | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 4e31bad6b36..d83169402c6 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -166,35 +166,36 @@ static FilePath qmakeFromCMakeCache(const CMakeConfig &config) if (!cmakeListTxt.open(QIODevice::WriteOnly)) { return FilePath(); } - cmakeListTxt.write(QByteArray(R"( - cmake_minimum_required(VERSION 3.15) - - project(qmake-probe LANGUAGES NONE) - - # Bypass Qt6's usage of find_dependency, which would require compiler - # and source code probing, which slows things unnecessarily - file(WRITE "${CMAKE_SOURCE_DIR}/CMakeFindDependencyMacro.cmake" - [=[ - macro(find_dependency dep) - endmacro() - ]=]) - set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}") - - find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) - find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) - - if (CMAKE_CROSSCOMPILING) - find_program(qmake_binary - NAMES qmake qmake.bat - PATHS "${Qt${QT_VERSION_MAJOR}_DIR}/../../../bin" - NO_DEFAULT_PATH) - file(WRITE "${CMAKE_SOURCE_DIR}/qmake-location.txt" "${qmake_binary}") - else() - file(GENERATE - OUTPUT "${CMAKE_SOURCE_DIR}/qmake-location.txt" - CONTENT "$") - endif() - )")); + // FIXME replace by raw string when gcc 8+ is minimum + cmakeListTxt.write(QByteArray( +"cmake_minimum_required(VERSION 3.15)\n" +"\n" +"project(qmake-probe LANGUAGES NONE)\n" +"\n" +"# Bypass Qt6's usage of find_dependency, which would require compiler\n" +"# and source code probing, which slows things unnecessarily" +"file(WRITE \"${CMAKE_SOURCE_DIR}/CMakeFindDependencyMacro.cmake\"\n" +"[=[" +" macro(find_dependency dep)\n" +" endmacro()\n" +"]=])\n" +"set(CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}\")\n" +"\n" +"find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)\n" +"find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)\n" +"\n" +"if (CMAKE_CROSSCOMPILING)\n" +" find_program(qmake_binary\n" +" NAMES qmake qmake.bat\n" +" PATHS \"${Qt${QT_VERSION_MAJOR}_DIR}/../../../bin\"\n" +" NO_DEFAULT_PATH)\n" +" file(WRITE \"${CMAKE_SOURCE_DIR}/qmake-location.txt\" \"${qmake_binary}\")\n" +"else()\n" +" file(GENERATE\n" +" OUTPUT \"${CMAKE_SOURCE_DIR}/qmake-location.txt\"\n" +" CONTENT \"$\")\n" +"endif()\n" +)); cmakeListTxt.close(); SynchronousProcess cmake; From b550844fe4553f18b26886c3a716f03bf1b2b749 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 27 Apr 2021 10:09:57 +0200 Subject: [PATCH 10/24] COIN: build tests Change-Id: Ib91399609f70401b141b6a2622eb41dda1e03292 Reviewed-by: Qt CI Bot Reviewed-by: Christian Kandeler Reviewed-by: Cristian Adam --- coin/instructions/make_instructions.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/coin/instructions/make_instructions.yaml b/coin/instructions/make_instructions.yaml index 2c9337ae191..1c517ce7323 100644 --- a/coin/instructions/make_instructions.yaml +++ b/coin/instructions/make_instructions.yaml @@ -13,7 +13,7 @@ instructions: maxTimeBetweenOutput: 360 userMessageOnFailure: "Failed to extract elfutils package, check logs." - type: ExecuteCommand - command: "curl --fail -L --retry 5 --retry-delay 5 -o {{.AgentWorkingDir}}/build/qt_temp/libclang.7z {{.Env.LLVM_BASE_URL}}-linux-Rhel7.6-gcc5.3-x86_64.7z" + command: "curl --fail -L --retry 5 --retry-delay 5 -o {{.AgentWorkingDir}}/build/qt_temp/libclang.7z {{.Env.LLVM_BASE_URL}}-linux-Ubuntu18.04-gcc9.3-x86_64.7z" maxTimeInSeconds: 3600 maxTimeBetweenOutput: 360 userMessageOnFailure: "Failed to download LLVM package, check logs." @@ -23,7 +23,7 @@ instructions: maxTimeBetweenOutput: 360 userMessageOnFailure: "Failed to extract LLVM package, check logs." - type: ExecuteCommand - command: "python {{.AgentWorkingDir}}/qt-creator/qt-creator/scripts/build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}/qt-creator/qt-creator --build {{.AgentWorkingDir}}/qt-creator/qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --elfutils-path {{.AgentWorkingDir}}/build/qt_temp/elfutils --llvm-path {{.AgentWorkingDir}}/build/qt_temp/libclang --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache" + command: "python {{.AgentWorkingDir}}/qt-creator/qt-creator/scripts/build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}/qt-creator/qt-creator --build {{.AgentWorkingDir}}/qt-creator/qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --elfutils-path {{.AgentWorkingDir}}/build/qt_temp/elfutils --llvm-path {{.AgentWorkingDir}}/build/qt_temp/libclang --with-tests --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache" maxTimeInSeconds: 36000 maxTimeBetweenOutput: 3600 userMessageOnFailure: "Failed to run build.py, check logs." @@ -50,7 +50,7 @@ instructions: maxTimeBetweenOutput: 360 userMessageOnFailure: "Failed to extract LLVM package, check logs." - type: ExecuteCommand - command: "python {{.AgentWorkingDir}}/qt-creator/qt-creator/scripts/build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}/qt-creator/qt-creator --build {{.AgentWorkingDir}}/qt-creator/qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --llvm-path {{.AgentWorkingDir}}/build/qt_temp/libclang --keychain-unlock-script /Users/qt/unlock-keychain.sh --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache" + command: "python {{.AgentWorkingDir}}/qt-creator/qt-creator/scripts/build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}/qt-creator/qt-creator --build {{.AgentWorkingDir}}/qt-creator/qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --llvm-path {{.AgentWorkingDir}}/build/qt_temp/libclang --keychain-unlock-script /Users/qt/unlock-keychain.sh --with-tests --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache" maxTimeInSeconds: 36000 maxTimeBetweenOutput: 3600 userMessageOnFailure: "Failed to run build.py, check logs." @@ -92,7 +92,7 @@ instructions: maxTimeBetweenOutput: 360 userMessageOnFailure: "Failed to extract LLVM package, check logs." - type: ExecuteCommand - command: "python -u {{.AgentWorkingDir}}\\qt-creator\\qt-creator\\scripts\\build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}\\qt-creator\\qt-creator --build {{.AgentWorkingDir}}\\qt-creator\\qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --python-path {{.AgentWorkingDir}}\\build\\qt_temp\\python --elfutils-path {{.AgentWorkingDir}}\\buid\\qt_temp\\elfutils --llvm-path {{.AgentWorkingDir}}\\build\\qt_temp\\libclang --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache --add-config=-DWITH_SCCACHE_SUPPORT=ON" + command: "python -u {{.AgentWorkingDir}}\\qt-creator\\qt-creator\\scripts\\build.py --build-type {{.Env.QTC_BUILD_TYPE}} --src {{.AgentWorkingDir}}\\qt-creator\\qt-creator --build {{.AgentWorkingDir}}\\qt-creator\\qt-creator_build --qt-path {{.AgentWorkingDir}}/build/qt5_install_dir --python-path {{.AgentWorkingDir}}\\build\\qt_temp\\python --elfutils-path {{.AgentWorkingDir}}\\buid\\qt_temp\\elfutils --llvm-path {{.AgentWorkingDir}}\\build\\qt_temp\\libclang --with-tests --add-config=-DCMAKE_C_COMPILER_LAUNCHER=sccache --add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=sccache --add-config=-DWITH_SCCACHE_SUPPORT=ON" maxTimeInSeconds: 36000 maxTimeBetweenOutput: 3600 userMessageOnFailure: "Failed to run build.py, check logs." From 564d2666c39a404b14ea6cae23e295301e8228fd Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 29 Apr 2021 11:35:03 +0200 Subject: [PATCH 11/24] Fix build with GCC 11: include Task-number: QTBUG-90395 Change-Id: Ic6d3fde59bd44d364ca1c1fe48b094bb9768b43c Reviewed-by: Eike Ziller --- src/plugins/qmlprofiler/qmlevent.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmlprofiler/qmlevent.h b/src/plugins/qmlprofiler/qmlevent.h index 344ef1a7cef..59fa8f506c8 100644 --- a/src/plugins/qmlprofiler/qmlevent.h +++ b/src/plugins/qmlprofiler/qmlevent.h @@ -34,6 +34,7 @@ #include #include +#include #include namespace QmlProfiler { From 198b412ff225dfcf2a48023c2877474d2f866d67 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 28 Apr 2021 11:04:42 +0200 Subject: [PATCH 12/24] Fix margin of Open Documents view built with Qt 6 If an item has an empty QIcon as decoration, Qt 6 does not add a margin to the left. Use an empty QVariant for declaring "no decoration" instead, which is semantically better anyhow. Also set rootIsDecorated to false instead of setting the indentation to 0, since that is what we actually mean. Fixes: QTCREATORBUG-25253 Change-Id: I33f4c25394bb61f9f56d375c59453b3434620d0d Reviewed-by: Christian Stenger --- src/plugins/coreplugin/editormanager/documentmodel.cpp | 2 +- src/plugins/coreplugin/opendocumentstreeview.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp index ad3e5aca832..5c7b624d30e 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.cpp +++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp @@ -336,7 +336,7 @@ QVariant DocumentModelPrivate::data(const QModelIndex &index, int role) const return lockedIcon(); if (entry->pinned) return pinnedIcon(); - return QIcon(); + return QVariant(); case Qt::ToolTipRole: return entry->fileName().isEmpty() ? entry->displayName() : entry->fileName().toUserOutput(); default: diff --git a/src/plugins/coreplugin/opendocumentstreeview.cpp b/src/plugins/coreplugin/opendocumentstreeview.cpp index c6994c221b4..2b91f2033f0 100644 --- a/src/plugins/coreplugin/opendocumentstreeview.cpp +++ b/src/plugins/coreplugin/opendocumentstreeview.cpp @@ -102,7 +102,7 @@ OpenDocumentsTreeView::OpenDocumentsTreeView(QWidget *parent) : { m_delegate = new Internal::OpenDocumentsDelegate(this); setItemDelegate(m_delegate); - setIndentation(0); + setRootIsDecorated(false); setUniformRowHeights(true); setTextElideMode(Qt::ElideMiddle); setFrameStyle(QFrame::NoFrame); From 160b934fc218d5587a6af36fc22c58c8c1f9b9f4 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 29 Apr 2021 14:08:02 +0200 Subject: [PATCH 13/24] Doc: Explain "Document not supported" error message Change-Id: If12f80ef13e546adc8836affad7e5e2f90d9d7be Reviewed-by: Thomas Hartmann --- doc/qtdesignstudio/src/qtbridge/qtbridge-ps-using.qdoc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/qtdesignstudio/src/qtbridge/qtbridge-ps-using.qdoc b/doc/qtdesignstudio/src/qtbridge/qtbridge-ps-using.qdoc index 4273f662fec..3fc3629a67e 100644 --- a/doc/qtdesignstudio/src/qtbridge/qtbridge-ps-using.qdoc +++ b/doc/qtdesignstudio/src/qtbridge/qtbridge-ps-using.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Bridge documentation. @@ -37,7 +37,7 @@ with Photoshop: \list - \li Arrange your art into artboards and organize it into groups and + \li Arrange your art into \e artboards and organize it into groups and layers that are imported into \QDS as separate files, depending on the choices you make when exporting designs. \li Use the Type tool to make sure that all of your text labels @@ -50,6 +50,10 @@ them to \QDS. \QDS deploys them to devices when you preview the UI. For more information, see \l{Using Custom Fonts}. + \note You can export only files that are saved in the Photoshop file format, + such as \e {.psd} and \e {.psb}. For all other document formats, \QDS + displays the following error message: \e {Document is not supported.} + \section2 Using Artboards The relationships between the groups and layers on an artboard are preserved From 005b604b9c9401b7491308485497dc183b7c5799 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 29 Apr 2021 22:46:00 +0200 Subject: [PATCH 14/24] QmlDesigner: Allow larger major versions With this patch we show items in the library also if the major import is larger. Change-Id: Id1f40a616971d322a1e99bf512ef802c14e88283 Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/itemlibrary/itemlibrarymodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 017579c1a15..a58805a0886 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -299,7 +299,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) for (const ItemLibraryEntry &entry : itemLibEntries) { NodeMetaInfo metaInfo = model->metaInfo(entry.typeName()); - bool valid = metaInfo.isValid() && metaInfo.majorVersion() == entry.majorVersion(); + bool valid = metaInfo.isValid() && metaInfo.majorVersion() >= entry.majorVersion(); bool isItem = valid && metaInfo.isSubclassOf("QtQuick.Item"); bool forceVisibility = valid && NodeHints::fromItemLibraryEntry(entry).visibleInLibrary(); From f22ae0a726f937ae0972fc9c77fa362f02bd8cd5 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 29 Apr 2021 22:42:55 +0200 Subject: [PATCH 15/24] QmlDesigner: Support QtQuick 6.0 import Change-Id: Ie6e752d58fb5a0c7989ab5c47166c6d08937d8d5 Reviewed-by: Thomas Hartmann --- .../designercore/model/texttomodelmerger.cpp | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index a751bf5b1f0..21b47c312bf 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -78,10 +78,24 @@ bool isSupportedAttachedProperties(const QString &propertyName) QStringList supportedVersionsList() { - static const QStringList list = { - "2.0", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", - "2.10", "2.11", "2.12", "2.13", "2.14", "2.15" - }; + static const QStringList list = {"2.0", + "2.1", + "2.2", + "2.3", + "2.4", + "2.5", + "2.6", + "2.7", + "2.8", + "2.9", + "2.10", + "2.11", + "2.12", + "2.13", + "2.14", + "2.15", + "6.0", + "6.1"}; return list; } From c362df32eee506f392f962ba373fb88967eb0786 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 30 Apr 2021 09:59:18 +0200 Subject: [PATCH 16/24] Unittest: Fix writing CppTools.json in cmake build Do not write additional garbage into the json file as this will end up in a parse error. Change-Id: I02783b5e94b016d35962ee5729d53bc218d42b42 Reviewed-by: Cristian Adam --- tests/unit/unittest/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index 73f70489e8d..272b721bde2 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -238,7 +238,7 @@ string(REPLACE "$$QTCREATOR_VERSION" "${IDE_VERSION}" plugin_json_in ${plugin_js string(REPLACE "$$QTCREATOR_COMPAT_VERSION" "${IDE_VERSION_COMPAT}" plugin_json_in ${plugin_json_in}) string(REPLACE "$$QTCREATOR_COPYRIGHT_YEAR" "${IDE_COPYRIGHT_YEAR}" plugin_json_in ${plugin_json_in}) string(REPLACE "$$dependencyList" "\"Dependencies\" : []" plugin_json_in ${plugin_json_in}) -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CppTools.json" ${plugin_json_in}}) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CppTools.json" ${plugin_json_in}) extend_qtc_test(unittest CONDITION TARGET libclang From 0bcb5953ed1592f779aa2db1235776c7ffa37012 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 30 Apr 2021 13:11:51 +0200 Subject: [PATCH 17/24] CMake: Ensure test defines are present for tools as well Fixes the sdktool auto test. Change-Id: I9e1779dc17a0cb79131e17182290255aed2f7d0e Reviewed-by: Cristian Adam --- cmake/QtCreatorAPI.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index 756b0befa27..4e9e8f4c61d 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -651,6 +651,10 @@ function(add_qtc_executable name) endif() endif() + if (WITH_TESTS) + set(TEST_DEFINES WITH_TESTS SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}") + endif() + add_executable("${name}" ${_arg_SOURCES}) extend_qtc_target("${name}" From ed6b3f2bcdbd970fe288eece0ca4a41d424a1399 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 30 Apr 2021 10:11:16 +0200 Subject: [PATCH 18/24] Revert "ProjectExplorer: Remove toolchain settings compatibility with <= 4.3" This reverts commit 6baf09bf91cac8ba71765ab470376541034d6ce5. sdktool still writes the toolchains with the old settings key. This should be changed in a follow-up commit, but since we missed updating the key used in sdktool, we have to stay compatible with that for a longer while still, or we break lots of existing Qt installations out there (specifically Boot2Qt, which is the main user of the sdktool operation). Fixes: QTCREATORBUG-25647 Change-Id: Ie665c9db5fd5bb808f510c53fd4173b8a318bb7c Reviewed-by: Christian Kandeler Reviewed-by: hjk --- .../projectexplorer/kitinformation.cpp | 61 +++++++++++++++++++ src/plugins/projectexplorer/toolchain.cpp | 47 +++++++++++++- src/plugins/projectexplorer/toolchain.h | 12 ++++ 3 files changed, 119 insertions(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index 1e0f8f73055..d84a7b69abd 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -58,6 +58,8 @@ namespace ProjectExplorer { +const char KITINFORMATION_ID_V1[] = "PE.Profile.ToolChain"; +const char KITINFORMATION_ID_V2[] = "PE.Profile.ToolChains"; const char KITINFORMATION_ID_V3[] = "PE.Profile.ToolChainsV3"; // -------------------------------------------------------------------------- @@ -387,6 +389,65 @@ Tasks ToolChainKitAspect::validate(const Kit *k) const void ToolChainKitAspect::upgrade(Kit *k) { QTC_ASSERT(k, return); + + const Utils::Id oldIdV1 = KITINFORMATION_ID_V1; + const Utils::Id oldIdV2 = KITINFORMATION_ID_V2; + + // upgrade <=4.1 to 4.2 (keep old settings around for now) + { + const QVariant oldValue = k->value(oldIdV1); + const QVariant value = k->value(oldIdV2); + if (value.isNull() && !oldValue.isNull()) { + QVariantMap newValue; + if (oldValue.type() == QVariant::Map) { + // Used between 4.1 and 4.2: + newValue = oldValue.toMap(); + } else { + // Used up to 4.1: + newValue.insert(Deprecated::Toolchain::languageId(Deprecated::Toolchain::Cxx), oldValue.toString()); + + const Utils::Id typeId = DeviceTypeKitAspect::deviceTypeId(k); + if (typeId == Constants::DESKTOP_DEVICE_TYPE) { + // insert default C compiler which did not exist before + newValue.insert(Deprecated::Toolchain::languageId(Deprecated::Toolchain::C), + defaultToolChainIds().value(Utils::Id(Constants::C_LANGUAGE_ID))); + } + } + k->setValue(oldIdV2, newValue); + k->setSticky(oldIdV2, k->isSticky(oldIdV1)); + } + } + + // upgrade 4.2 to 4.3 (keep old settings around for now) + { + const QVariant oldValue = k->value(oldIdV2); + const QVariant value = k->value(ToolChainKitAspect::id()); + if (value.isNull() && !oldValue.isNull()) { + QVariantMap newValue = oldValue.toMap(); + QVariantMap::iterator it = newValue.find(Deprecated::Toolchain::languageId(Deprecated::Toolchain::C)); + if (it != newValue.end()) + newValue.insert(Utils::Id(Constants::C_LANGUAGE_ID).toString(), it.value()); + it = newValue.find(Deprecated::Toolchain::languageId(Deprecated::Toolchain::Cxx)); + if (it != newValue.end()) + newValue.insert(Utils::Id(Constants::CXX_LANGUAGE_ID).toString(), it.value()); + k->setValue(ToolChainKitAspect::id(), newValue); + k->setSticky(ToolChainKitAspect::id(), k->isSticky(oldIdV2)); + } + } + + // upgrade 4.3-temporary-master-state to 4.3: + { + const QVariantMap valueMap = k->value(ToolChainKitAspect::id()).toMap(); + QVariantMap result; + for (const QString &key : valueMap.keys()) { + const int pos = key.lastIndexOf('.'); + if (pos >= 0) + result.insert(key.mid(pos + 1), valueMap.value(key)); + else + result.insert(key, valueMap.value(key)); + } + k->setValue(ToolChainKitAspect::id(), result); + } } void ToolChainKitAspect::fix(Kit *k) diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index 1739fc5e890..69355e44130 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -44,6 +44,7 @@ using namespace Utils; static const char ID_KEY[] = "ProjectExplorer.ToolChain.Id"; static const char DISPLAY_NAME_KEY[] = "ProjectExplorer.ToolChain.DisplayName"; static const char AUTODETECT_KEY[] = "ProjectExplorer.ToolChain.Autodetect"; +static const char LANGUAGE_KEY_V1[] = "ProjectExplorer.ToolChain.Language"; // For QtCreator <= 4.2 static const char LANGUAGE_KEY_V2[] = "ProjectExplorer.ToolChain.LanguageV2"; // For QtCreator > 4.2 namespace ProjectExplorer { @@ -86,8 +87,41 @@ public: ToolChain::HeaderPathsCache m_headerPathsCache; }; -} // Internal +// Deprecated used from QtCreator <= 4.2 + +Utils::Id fromLanguageV1(int language) +{ + switch (language) + { + case Deprecated::Toolchain::C : + return Utils::Id(Constants::C_LANGUAGE_ID); + case Deprecated::Toolchain::Cxx: + return Utils::Id(Constants::CXX_LANGUAGE_ID); + case Deprecated::Toolchain::None: + default: + return Utils::Id(); + } +} + +} // namespace Internal + +namespace Deprecated { +namespace Toolchain { +QString languageId(Language l) +{ + switch (l) { + case Language::None: + return QStringLiteral("None"); + case Language::C: + return QStringLiteral("C"); + case Language::Cxx: + return QStringLiteral("Cxx"); + }; + return QString(); +} +} // namespace Toolchain +} // namespace Deprecated /*! \class ProjectExplorer::ToolChain @@ -219,6 +253,15 @@ QVariantMap ToolChain::toMap() const result.insert(QLatin1String(ID_KEY), idToSave); result.insert(QLatin1String(DISPLAY_NAME_KEY), displayName()); result.insert(QLatin1String(AUTODETECT_KEY), isAutoDetected()); + // + int oldLanguageId = -1; + if (language() == ProjectExplorer::Constants::C_LANGUAGE_ID) + oldLanguageId = 1; + else if (language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID) + oldLanguageId = 2; + if (oldLanguageId >= 0) + result.insert(LANGUAGE_KEY_V1, oldLanguageId); + // result.insert(QLatin1String(LANGUAGE_KEY_V2), language().toSetting()); if (!d->m_targetAbiKey.isEmpty()) result.insert(d->m_targetAbiKey, d->m_targetAbi.toString()); @@ -328,6 +371,8 @@ bool ToolChain::fromMap(const QVariantMap &data) d->m_language = Utils::Id::fromString(langId.mid(pos + 1)); else d->m_language = Utils::Id::fromString(langId); + } else if (data.contains(LANGUAGE_KEY_V1)) { // Import from old settings + d->m_language = Internal::fromLanguageV1(data.value(QLatin1String(LANGUAGE_KEY_V1)).toInt()); } if (!d->m_language.isValid()) diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index a2d5494f87b..6c85293433b 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -51,6 +51,18 @@ namespace ProjectExplorer { namespace Internal { class ToolChainPrivate; } +namespace Deprecated { +// Deprecated in 4.3: +namespace Toolchain { +enum Language { + None = 0, + C, + Cxx +}; +QString languageId(Language l); +} // namespace Toolchain +} // namespace Deprecated + class ToolChainConfigWidget; class ToolChainFactory; class Kit; From 24739515e5d64af7a9d6f009b7e70f4d6f8ad6e1 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 30 Apr 2021 12:04:09 +0200 Subject: [PATCH 19/24] sdktool: Use newest toolchain key when writing kit No need to write these settings with the old key from Qt Creator 4.3 anymore. Change-Id: If6ece7277abea20945a56917f4bb55826f4ea769 Reviewed-by: Christian Kandeler --- src/tools/sdktool/addkitoperation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/sdktool/addkitoperation.cpp b/src/tools/sdktool/addkitoperation.cpp index 8b6a3355c96..8746705ac3c 100644 --- a/src/tools/sdktool/addkitoperation.cpp +++ b/src/tools/sdktool/addkitoperation.cpp @@ -64,7 +64,7 @@ const char DEBUGGER_BINARY[] = "Binary"; const char DEVICE_TYPE[] = "PE.Profile.DeviceType"; const char DEVICE_ID[] = "PE.Profile.Device"; const char SYSROOT[] = "PE.Profile.SysRoot"; -const char TOOLCHAIN[] = "PE.Profile.ToolChains"; +const char TOOLCHAIN[] = "PE.Profile.ToolChainsV3"; const char MKSPEC[] = "QtPM4.mkSpecInformation"; const char QT[] = "QtSupport.QtInformation"; const char CMAKE_ID[] = "CMakeProjectManager.CMakeKitInformation"; From 8eb5a08c1bb22c7234aa54c1cda46eb5e513bfa3 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Fri, 30 Apr 2021 09:25:14 +0200 Subject: [PATCH 20/24] qmlpreview: adapt to new location of debug translation protocol Change-Id: I6bcb6e9f18724f22b10586a6550fada991ca8678 Reviewed-by: Tim Jenssen --- src/plugins/qmlpreview/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmlpreview/CMakeLists.txt b/src/plugins/qmlpreview/CMakeLists.txt index 69d0eddcacb..532dd8999f2 100644 --- a/src/plugins/qmlpreview/CMakeLists.txt +++ b/src/plugins/qmlpreview/CMakeLists.txt @@ -1,5 +1,3 @@ -find_package(Qt5 COMPONENTS QmlDebug REQUIRED) - add_qtc_plugin(QmlPreview PUBLIC_DEPENDS QmlDebug DEPENDS QmlJS @@ -28,7 +26,7 @@ extend_qtc_plugin(QmlPreview # who needs it in older but special built Qt versions aswell string(REGEX MATCH "^[0-9]*" QT_VERSION_MAJOR ${Qt5_VERSION}) get_target_property(qmldebugprivate_include_directories - Qt${QT_VERSION_MAJOR}::QmlDebugPrivate + Qt${QT_VERSION_MAJOR}::QmlPrivate INTERFACE_INCLUDE_DIRECTORIES ) find_file(have_qml_debug_translation_protocol @@ -37,6 +35,6 @@ find_file(have_qml_debug_translation_protocol ) extend_qtc_plugin(QmlPreview CONDITION have_qml_debug_translation_protocol - DEPENDS Qt5::QmlDebugPrivate + PUBLIC_DEPENDS Qt5::QmlPrivate PUBLIC_DEFINES "FOUND_QML_DEBUG_TRANSLATION_PROTOCOL" ) From 978f6caf1e18ad0b0415fde60a8c130448969c6d Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Mon, 3 May 2021 13:38:39 +0200 Subject: [PATCH 21/24] Update Qbs submodule to the top of 1.19 branch Change-Id: I0b62527b7fb56aad3f7696ce4356b2b4090c89a2 Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 1e092969ae0..86eb6974126 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 1e092969ae070e3a967dd86ed06fd8531f94cd6f +Subproject commit 86eb6974126b4fdf4cfa3340b7a80833479f2d37 From 6fbe88b215155770ef8b15fcf74cc3e732cbf533 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 3 May 2021 14:09:15 +0200 Subject: [PATCH 22/24] TextEditor: Queue call to ICore::showOptionsDialog() ... from text marks. Direct calls appear to be unsafe, possibly because text marks are transient. Fixes: QTCREATORBUG-25623 Change-Id: I929ff6310c9d93b677f66acc8869e7aeceb5564b Reviewed-by: David Schulz --- src/plugins/texteditor/textmark.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/texteditor/textmark.cpp b/src/plugins/texteditor/textmark.cpp index abaac7c430f..94137d9ade4 100644 --- a/src/plugins/texteditor/textmark.cpp +++ b/src/plugins/texteditor/textmark.cpp @@ -400,9 +400,9 @@ void TextMark::setSettingsPage(Id settingsPage) m_settingsAction = new QAction; m_settingsAction->setIcon(Utils::Icons::SETTINGS_TOOLBAR.icon()); m_settingsAction->setToolTip(tr("Show Diagnostic Settings")); - QObject::connect(m_settingsAction, &QAction::triggered, [this, settingsPage] { - Core::ICore::showOptionsDialog(settingsPage); - }); + QObject::connect(m_settingsAction, &QAction::triggered, Core::ICore::instance(), + [settingsPage] { Core::ICore::showOptionsDialog(settingsPage); }, + Qt::QueuedConnection); } TextMarkRegistry::TextMarkRegistry(QObject *parent) From 0a84406e0d5ce8ce4e93952347c90022fe3af7f0 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 4 May 2021 12:31:07 +0300 Subject: [PATCH 23/24] QmlPuppet: Re-enable navigator preview image generation The issue blocking this was fixed in QtQuick3D. Change-Id: I31ceb3091f7deb4450c966a8c41a203782569f14 Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../qml2puppet/instances/qt5informationnodeinstanceserver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 064d1fed1b1..1f3a662d3ec 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -706,8 +706,8 @@ void Qt5InformationNodeInstanceServer::renderModelNodeImageView() void Qt5InformationNodeInstanceServer::doRenderModelNodeImageView() { - // Disable preview in Qt6 until QTBUG-QTBUG-88320 is fixed -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + // This crashes on Qt 6.0.x due to QtQuick3D issue, so the preview generation is disabled +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) || QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) ServerNodeInstance instance; if (m_modelNodePreviewImageCommand.renderItemId() >= 0) instance = instanceForId(m_modelNodePreviewImageCommand.renderItemId()); From 97744a071a75b86b365a9c698dd94a62c7bacdff Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 4 May 2021 14:36:47 +0200 Subject: [PATCH 24/24] ProjectExplorer: Fix project mode layout issue Window state save/restore was undermined by code that added and removed the central widget, leading to inconsistent data. Fix this by making sure that we (de-)serialize if and only if a central widget is present. Also remove the hacky workaround that was supposed to fix this, but didn't. Fixes: QTCREATORBUG-25551 Change-Id: I6e7f2aff7455db476f870ead64b09a9716f3558b Reviewed-by: Christian Stenger Reviewed-by: Qt CI Bot --- src/plugins/projectexplorer/projectwindow.cpp | 10 +++++++--- src/plugins/projectexplorer/projectwindow.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 4aad5c4bfd0..0b928b4e664 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -620,6 +620,7 @@ public: void setPanel(QWidget *panel) { + q->savePersistentSettings(); if (QWidget *widget = q->centralWidget()) { q->takeCentralWidget(); widget->hide(); // Don't delete. @@ -630,6 +631,7 @@ public: if (q->hasFocus()) // we get assigned focus from setFocusToCurrentMode, pass that on panel->setFocus(); } + q->loadPersistentSettings(); } ProjectWindow *q; @@ -670,9 +672,7 @@ void ProjectWindow::hideEvent(QHideEvent *event) void ProjectWindow::showEvent(QShowEvent *event) { FancyMainWindow::showEvent(event); - - // Delay appears to be necessary for the target setup page to have the correct layout. - QTimer::singleShot(0, this, &ProjectWindow::loadPersistentSettings); + loadPersistentSettings(); } ProjectWindow::~ProjectWindow() = default; @@ -681,6 +681,8 @@ const char PROJECT_WINDOW_KEY[] = "ProjectExplorer.ProjectWindow"; void ProjectWindow::savePersistentSettings() const { + if (!centralWidget()) + return; QSettings * const settings = ICore::settings(); settings->beginGroup(PROJECT_WINDOW_KEY); saveSettings(settings); @@ -689,6 +691,8 @@ void ProjectWindow::savePersistentSettings() const void ProjectWindow::loadPersistentSettings() { + if (!centralWidget()) + return; QSettings * const settings = ICore::settings(); settings->beginGroup(PROJECT_WINDOW_KEY); restoreSettings(settings); diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index c048a4ac460..73fb486b7af 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -55,6 +55,7 @@ class ProjectWindowPrivate; class ProjectWindow : public Utils::FancyMainWindow { + friend class ProjectWindowPrivate; Q_OBJECT public: