diff --git a/doc/qtcreator/images/qtcreator-new-project.webp b/doc/qtcreator/images/qtcreator-new-project.webp index 1c0570b8b61..d0736224192 100644 Binary files a/doc/qtcreator/images/qtcreator-new-project.webp and b/doc/qtcreator/images/qtcreator-new-project.webp differ diff --git a/doc/qtcreator/images/qtcreator-preferences-build-run-general.webp b/doc/qtcreator/images/qtcreator-preferences-build-run-general.webp index c7636894960..4826e22fc62 100644 Binary files a/doc/qtcreator/images/qtcreator-preferences-build-run-general.webp and b/doc/qtcreator/images/qtcreator-preferences-build-run-general.webp differ diff --git a/doc/qtcreator/images/qtquick-example-setting-breakpoint1.png b/doc/qtcreator/images/qtquick-example-setting-breakpoint1.png deleted file mode 100644 index 67da2556c72..00000000000 Binary files a/doc/qtcreator/images/qtquick-example-setting-breakpoint1.png and /dev/null differ diff --git a/doc/qtcreator/images/qtquick-example-setting-breakpoint1.webp b/doc/qtcreator/images/qtquick-example-setting-breakpoint1.webp new file mode 100644 index 00000000000..0962179a6e5 Binary files /dev/null and b/doc/qtcreator/images/qtquick-example-setting-breakpoint1.webp differ diff --git a/doc/qtcreator/images/qtquick-example-setting-breakpoint2.png b/doc/qtcreator/images/qtquick-example-setting-breakpoint2.png deleted file mode 100644 index 788cacaf659..00000000000 Binary files a/doc/qtcreator/images/qtquick-example-setting-breakpoint2.png and /dev/null differ diff --git a/doc/qtcreator/images/qtquick-example-setting-breakpoint2.webp b/doc/qtcreator/images/qtquick-example-setting-breakpoint2.webp new file mode 100644 index 00000000000..ab4b1c3cdf1 Binary files /dev/null and b/doc/qtcreator/images/qtquick-example-setting-breakpoint2.webp differ diff --git a/doc/qtcreator/images/qtquick-example-setting-breakpoint3.png b/doc/qtcreator/images/qtquick-example-setting-breakpoint3.png deleted file mode 100644 index 5d197ff92ca..00000000000 Binary files a/doc/qtcreator/images/qtquick-example-setting-breakpoint3.png and /dev/null differ diff --git a/doc/qtcreator/images/qtquick-example-setting-breakpoint3.webp b/doc/qtcreator/images/qtquick-example-setting-breakpoint3.webp new file mode 100644 index 00000000000..dfee8bc7cc1 Binary files /dev/null and b/doc/qtcreator/images/qtquick-example-setting-breakpoint3.webp differ diff --git a/doc/qtcreator/images/qtquick-example-stack.png b/doc/qtcreator/images/qtquick-example-stack.png deleted file mode 100644 index 943b0af3d70..00000000000 Binary files a/doc/qtcreator/images/qtquick-example-stack.png and /dev/null differ diff --git a/doc/qtcreator/images/qtquick-example-stack.webp b/doc/qtcreator/images/qtquick-example-stack.webp new file mode 100644 index 00000000000..2bf986d0047 Binary files /dev/null and b/doc/qtcreator/images/qtquick-example-stack.webp differ diff --git a/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc b/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc index 9b746d03887..1341ee95a1c 100644 --- a/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc +++ b/doc/qtcreator/src/analyze/cpu-usage-analyzer.qdoc @@ -430,8 +430,8 @@ The Performance Analyzer can read Perf data files generated in either frame pointer or dwarf mode. However, to generate the files correctly, numerous preconditions have to be met. All system images for the - \l{https://doc.qt.io/Boot2Qt/qtdc-supported-platforms.html} - {Boot2Qt:Supported Target Devices and Development Hosts} are correctly set + \l{Support Levels for Target Hardware}{supported embedded platforms} + are correctly set up for profiling in the dwarf mode. For other devices, check whether Perf can read back its own data in a sensible way by checking the output of \c {perf report} or \c {perf script} for the recorded Perf data files. diff --git a/doc/qtcreator/src/android/androiddev.qdoc b/doc/qtcreator/src/android/androiddev.qdoc index c0fe2cedea0..61fbfb5cf75 100644 --- a/doc/qtcreator/src/android/androiddev.qdoc +++ b/doc/qtcreator/src/android/androiddev.qdoc @@ -11,6 +11,9 @@ You can connect Android devices to the development PC using USB cables to build, run, debug, and analyze applications from \QC. + \note \QC only detects a device and connects to it after you + \l{Debugging on Android Devices}{enable USB debugging on it}. + To develop for Android, you must install a tool chain for building applications for Android devices on the development PC. \QC can automatically download and install the tool chain and create a suitable build and run diff --git a/doc/qtcreator/src/debugger/qtquick-debugger-example.qdoc b/doc/qtcreator/src/debugger/qtquick-debugger-example.qdoc index 9f5a4da744b..e7141a99f22 100644 --- a/doc/qtcreator/src/debugger/qtquick-debugger-example.qdoc +++ b/doc/qtcreator/src/debugger/qtquick-debugger-example.qdoc @@ -1,4 +1,4 @@ -// Copyright (C) 2018 The Qt Company Ltd. +// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // ********************************************************************** @@ -47,13 +47,13 @@ border on the line where the \c startNewGame() function is called (1). - \image qtquick-example-setting-breakpoint1.png + \image qtquick-example-setting-breakpoint1.webp {Breakpoint in the code editor} The red circle indicates that a breakpoint is now set on that line number. - \li Select \uicontrol Debug > \uicontrol {Start Debugging} > - \uicontrol {Start Debugging of Startup Project} or press + \li Go to \uicontrol Debug > \uicontrol {Start Debugging} > + \uicontrol {Start Debugging of Startup Project}, or press \key{F5}. \li Once the Same Game application starts, select \uicontrol {Puzzle} @@ -63,26 +63,26 @@ \li When the debugger hits the breakpoint, it interrupts the application. \QC displays the nested function calls leading to the - current position as a call stack trace (1). + current position as a call stack trace. - \image qtquick-example-setting-breakpoint2.png + \image qtquick-example-setting-breakpoint2.webp {Debugger view} - \li Click the \inlineimage icons/debugger_stepinto_small.png - (\uicontrol {Step Into}) button on the toolbar or press \key F11 to step + \li Select \inlineimage icons/debugger_stepinto_small.png + (\uicontrol {Step Into}) on the toolbar or press \key F11 to step into the code in the stack. The samegame.js file opens in the code editor at the function that starts a new game. - \image qtquick-example-stack.png + \image qtquick-example-stack.webp {Stack view} \li Examine the local variables in the \uicontrol Locals view. Step through the code to see how the information changes in the view. \li Add a breakpoint at the end of the \c {startNewGame()} function, and - click \inlineimage icons/qtcreator-debugging-continue.png + select \inlineimage icons/qtcreator-debugging-continue.png (\uicontrol Continue) to hit the breakpoint. - \image qtquick-example-setting-breakpoint3.png + \image qtquick-example-setting-breakpoint3.webp {Second breakpoint in the Breakpoints view} \li To execute JavaScript commands in the current context, open the \uicontrol {QML Debugger Console}. @@ -97,11 +97,11 @@ \image qtquick-example-qml-inspector.png - \li Select \uicontrol Debug > \uicontrol {Show Application on Top} to + \li Go to \uicontrol Debug > \uicontrol {Show Application on Top} to keep the application visible while you interact with the debugger. - \li Select \uicontrol Debug > \uicontrol Select to activate selection - mode and then click the \uicontrol Menu button to move into the + \li Go to \uicontrol Debug > \uicontrol Select to activate selection + mode, and then select \uicontrol Menu to move into the \uicontrol menuButton component in the \uicontrol Locals view and the code editor. diff --git a/doc/qtcreator/src/external-resources/external-resources.qdoc b/doc/qtcreator/src/external-resources/external-resources.qdoc index 3eceb28e568..5c2f4f22850 100644 --- a/doc/qtcreator/src/external-resources/external-resources.qdoc +++ b/doc/qtcreator/src/external-resources/external-resources.qdoc @@ -1,6 +1,14 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only +/*! + \externalpage https://doc.qt.io/Boot2Qt/index.html + \title Boot2Qt: Documentation +*/ +/*! + \externalpage https://doc.qt.io/Boot2Qt/b2qt-requirements-x11.html#setting-up-usb-access-to-embedded-devices + \title Boot2Qt: Setting Up USB Access to Embedded Devices +*/ /*! \externalpage https://doc.qt.io/qt/qtqml-index.html \title Qt Qml diff --git a/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc b/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc index 3f7499b5b5c..b8c2c6f9a47 100644 --- a/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc +++ b/doc/qtcreator/src/linux-mobile/b2qtdev.qdoc @@ -47,8 +47,7 @@ \note On Ubuntu Linux, the development user account must have access to the plugged-in devices. To grant them access to the device via USB, create a new \c udev rule, as described in - \l{https://doc.qt.io/Boot2Qt/b2qt-requirements-x11.html#setting-up-usb-access-to-embedded-devices} - {Boot2Qt: Setting Up USB Access to Embedded Devices}. + \l{Boot2Qt: Setting Up USB Access to Embedded Devices}. You can edit the settings later in \preferences > \uicontrol Devices > \uicontrol Devices. @@ -149,4 +148,6 @@ application files to the device. For more information, see \l{Boot2Qt Run Settings}. \endlist + + \sa {Boot2Qt: Setting Up USB Access to Embedded Devices} */ diff --git a/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc b/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc index 39ff44f1121..1b4051121f7 100644 --- a/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc +++ b/doc/qtcreator/src/linux-mobile/creator-embedded-platforms.qdoc @@ -46,17 +46,11 @@ tools to customize the contents of the stack and to take it into production hardware. - You need either Windows 10 64-bit or later or Ubuntu Linux 64-bit 20.04 LTS - or later to install and use Boot2Qt. - The following topics have more information about developing applications for Boot2Qt devices: \list - \li \l{https://doc.qt.io/Boot2Qt/qtdc-supported-platforms.html} - {Boot2Qt: Supported Target Devices and Development Hosts} - \li \l{https://doc.qt.io/Boot2Qt/b2qt-installation-guides.html} - {Boot2Qt: Installation Guides} + \li \l{Boot2Qt: Documentation} \li \l{Connecting Boot2Qt Devices} \li \l{Boot2Qt Run Settings} \li \l{Deploying to Boot2Qt} diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-build-run-tutorial.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-build-run-tutorial.qdoc index ac06f8cbd1e..4b13cbd630f 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-build-run-tutorial.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-build-run-tutorial.qdoc @@ -28,8 +28,7 @@ To run an example application on a Boot2Qt device, you must set up Boot2Qt on the development host and create connections between the host and devices. For more information, see - \l{https://doc.qt.io/Boot2Qt/b2qt-installation-guides.html} - {Boot2Qt: Installation Guides} + \l{Boot2Qt: Documentation}. If you have \l{Qt Design Studio Manual}{\QDS} installed, you can open \QDS examples from \QC in \QDS. @@ -70,9 +69,8 @@ If build errors occur, check that you have a Qt version, a \l{Add compilers}{compiler}, and the necessary kits installed. If - you are building for an \l{Connecting Android Devices}{Android device} - or \l{Connecting iOS Devices}{iOS device}, check that you set up the - development environment correctly. + you are building for an Android or iOS device, check that you set up + the development environment correctly. The \uicontrol Build progress bar on the toolbar turns green when you build the project successfully. The application opens on the @@ -80,4 +78,7 @@ \endlist + \sa {Add compilers}, {Add kits}, {Add Qt versions}, + {Connecting Android Devices}, {Connecting iOS Devices}, + {Compile Output}, {Boot2Qt: Documentation}, {Qt Design Studio Manual} */ diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc b/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc index 4d0e9038639..4654c4326fd 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-kits.qdoc @@ -27,9 +27,7 @@ \list \li \l{Connecting Android Devices}{Android} \li \l{Connecting Bare Metal Devices}{Bare Metal} - \li \l{https://doc.qt.io/Boot2Qt/b2qt-installation-guides.html} - {Boot2Qt} (commercial only) - \li \l{Emulator}{Boot2Qt Emulator} (commercial only) + \li \l{Boot2Qt: Documentation}{Boot2Q} (commercial only) \li \l{Adding Docker Devices}{Docker} (experimental) \li \l{Connecting iOS Devices}{iOS} \li iOS Simulator @@ -147,6 +145,9 @@ This setting is used to tell the code model which compiler is used. If your project type and build tool support it, \QC also tells the build tool to use this compiler for building the project. + + \note qmake ignores the value of this field and fetches the compiler + information from \uicontrol {Qt mkspec}, which you can change. \row \li \uicontrol Environment \li Select \uicontrol Change to modify environment variable values for diff --git a/doc/qtcreator/src/qtquick/qtquick-live-preview-devices.qdoc b/doc/qtcreator/src/qtquick/qtquick-live-preview-devices.qdoc index ae7a75eefea..8dcc8c26413 100644 --- a/doc/qtcreator/src/qtquick/qtquick-live-preview-devices.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-live-preview-devices.qdoc @@ -8,10 +8,10 @@ \title Previewing on Devices - To preview UIs on Android devices, you need to enable USB debugging on them + To preview UIs on Android devices, enable USB debugging on them and connect them to your system with a USB cable. - To preview UIs on Boot2Qt devices, you need to connect the devices to your + To preview UIs on Boot2Qt devices, connect the devices to your system with a USB cable, or a wired or wireless connection, depending on the device, and configure connections to them. The necessary kits have been predefined and you only need to enable them for your current project. @@ -20,8 +20,8 @@ necessary files to a location in a device where you want to run the executable at. - \note To preview on a wirelessly connected device, select \preferences > \uicontrol Devices - and connect the device. + \note To preview on a wirelessly connected device, go to \preferences > + \uicontrol Devices and connect the device. To preview a UI on a device: @@ -48,13 +48,13 @@ The USB debugging feature on Android devices enables creating connections to the devices from \QDS and running the preview utility on them. - Debugging is enabled in different ways on different Android devices. + Debugging is turned on in different ways on different Android devices. Look for \uicontrol {USB Debugging} under \uicontrol {Developer Options}. - On some devices \uicontrol {Developer Options} is hidden and becomes visible + On some devices, \uicontrol {Developer Options} is hidden and becomes visible when you tap the \uicontrol {Build number} field in \uicontrol Settings > \uicontrol About several times. - After you have enabled debugging, connect the Android device to the system + After you turn on debugging, connect the Android device to the system with a USB cable. The first time you preview a UI on devices, the preview utility @@ -70,17 +70,8 @@ \section2 Previewing on Boot2Qt Devices - You can preview UIs on Boot2Qt devices. For a list of supported devices, see - \l{https://doc.qt.io/Boot2Qt/qtdc-supported-platforms.html} - {Boot2Qt: Supported Target Devices and Development Hosts}. + You can preview UIs on supported Boot2Qt devices that you configure as + instructed in the Boot2Qt documentation. - You must configure the device as instructed in the - \l{https://doc.qt.io/Boot2Qt/b2qt-installation-guides.html} - {Boot2Qt: Installation Guides}. - - \note At the time of this writing, \macos is not supported as a development - host for Boot2Qt. This means that you cannot preview UIs on - devices if you are using \QC on \macos. For more information, see - \l {https://doc.qt.io/Boot2Qt/qtdc-supported-platforms.html#supported-development-hosts} - {Boot2Qt: Supported Development Hosts}. + \sa {Boot2Qt: Documentation}, {Support Levels for Target Hardware} */ diff --git a/share/qtcreator/android/sdk_definitions.json b/share/qtcreator/android/sdk_definitions.json index 22e4a322d84..ed1e42402f3 100644 --- a/share/qtcreator/android/sdk_definitions.json +++ b/share/qtcreator/android/sdk_definitions.json @@ -1,12 +1,12 @@ { "common": { "sdk_tools_url": { - "linux": "https://dl.google.com/android/repository/commandlinetools-linux-9123335_latest.zip", - "linux_sha256": "0bebf59339eaa534f4217f8aa0972d14dc49e7207be225511073c661ae01da0a", - "windows": "https://dl.google.com/android/repository/commandlinetools-win-9123335_latest.zip", - "windows_sha256": "8a90e6a3deb2fa13229b2e335efd07687dcc8a55a3c544da9f40b41404993e7d", - "mac": "https://dl.google.com/android/repository/commandlinetools-mac-9123335_latest.zip", - "mac_sha256": "d0192807f7e1cd4a001d13bb1e5904fc287b691211648877258aa44d1fa88275" + "linux": "https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip", + "linux_sha256": "2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258", + "windows": "https://dl.google.com/android/repository/commandlinetools-win-11076708_latest.zip", + "windows_sha256": "4d6931209eebb1bfb7c7e8b240a6a3cb3ab24479ea294f3539429574b1eec862", + "mac": "https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip", + "mac_sha256": "7bc5c72ba0275c80a8f19684fb92793b83a6b5c94d4d179fc5988930282d7e64" }, "sdk_essential_packages": { "default": ["platform-tools", "platforms;android-31", "cmdline-tools;latest"], diff --git a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp index de8b82de20e..13167f691d8 100644 --- a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp +++ b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp @@ -353,7 +353,9 @@ void DiagramSceneModel::selectAllElements() void DiagramSceneModel::selectElement(DElement *element) { QGraphicsItem *selectItem = m_elementToItemMap.value(element); - for (QGraphicsItem *item : std::as_const(m_selectedItems)) { + // We have to create a copy since "setSelected" may modify m_selectedItems + const QSet copy = m_selectedItems; + for (QGraphicsItem *item : copy) { if (item != selectItem) item->setSelected(false); } diff --git a/src/libs/utils/fsengine/fsengine_impl.h b/src/libs/utils/fsengine/fsengine_impl.h index 00a33f227ce..7a68119c83a 100644 --- a/src/libs/utils/fsengine/fsengine_impl.h +++ b/src/libs/utils/fsengine/fsengine_impl.h @@ -53,7 +53,8 @@ public: uint ownerId(FileOwner) const override; QString owner(FileOwner) const override; -#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + // The FileTime change in QAbstractFileEngine, in qtbase, is in since Qt 6.7.1 +#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 1) using FileTime = QFile::FileTime; #endif bool setFileTime(const QDateTime &newDate, FileTime time) override; diff --git a/src/libs/utils/namevaluesdialog.cpp b/src/libs/utils/namevaluesdialog.cpp index 35587f87919..0b009c7568e 100644 --- a/src/libs/utils/namevaluesdialog.cpp +++ b/src/libs/utils/namevaluesdialog.cpp @@ -45,7 +45,11 @@ signals: void lostFocus(); private: - void focusOutEvent(QFocusEvent *) override { emit lostFocus(); } + void focusOutEvent(QFocusEvent *e) override + { + QPlainTextEdit::focusOutEvent(e); + emit lostFocus(); + } }; } // namespace Internal diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index b399d86b36b..3f06e04fc1b 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -769,6 +769,7 @@ private: std::unique_ptr m_processHandler; mutable QMutex m_mutex; QList m_signals; + Guard m_guard; }; class ProcessPrivate : public QObject @@ -961,6 +962,10 @@ GeneralProcessBlockingImpl::GeneralProcessBlockingImpl(ProcessPrivate *parent) bool GeneralProcessBlockingImpl::waitForSignal(ProcessSignalType newSignal, QDeadlineTimer timeout) { + QTC_ASSERT(!m_guard.isLocked(), qWarning("Process::waitForSignal() called recursively. " + "The call is being ignored."); return false); + GuardLocker locker(m_guard); + m_processHandler->setParent(nullptr); QThread thread; diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 3666762be6f..5128f761a00 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -532,7 +532,7 @@ QString androidNameForApiLevel(int x) case 33: return QLatin1String("Android 13.0 (\"Tiramisu\")"); case 34: - return QLatin1String("Android API 34"); + return QLatin1String("Android 14.0 (\"UpsideDownCake\")"); default: return Tr::tr("Unknown Android version. API Level: %1").arg(x); } diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index 7ae9ce05aaa..a4760b3d4a5 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -126,10 +126,8 @@ static void sdkManagerCommand(const AndroidConfig &config, const QStringList &ar bool assertionFound = false; proc.setStdOutCallback([offset, progressQuota, &proc, &assertionFound, &promise](const QString &out) { int progressPercent = parseProgress(out, assertionFound); - if (assertionFound) { + if (assertionFound) proc.stop(); - proc.waitForFinished(); - } if (progressPercent != -1) promise.setProgressValue(offset + qRound((progressPercent / 100.0) * progressQuota)); }); diff --git a/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp b/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp index 99c40c99b61..71419032249 100644 --- a/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp +++ b/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp @@ -132,7 +132,7 @@ void ActivationSequenceContextProcessor::processComment() void ActivationSequenceContextProcessor::processInclude() { - if (m_token.isLiteral() && !isCompletionKindStringLiteralOrSlash()) + if (m_token.isStringLiteral() && !isCompletionKindStringLiteralOrSlash()) m_completionKind = CPlusPlus::T_EOF_SYMBOL; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 0ba54b60a81..25d51488f8b 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -749,14 +749,17 @@ CMakeBuildSystem::projectFileArgumentPosition(const QString &targetName, const Q && func.Arguments().size() > 1 && func.Arguments().front().Value == target_name; }); - for (const auto &func : {function, targetSourcesFunc, addQmlModuleFunc}) { + auto setSourceFilePropFunc = findFunction(*cmakeListFile, [](const auto &func) { + return func.LowerCaseName() == "set_source_files_properties"; + }); + + for (const auto &func : {function, targetSourcesFunc, addQmlModuleFunc, setSourceFilePropFunc}) { if (!func.has_value()) continue; - auto filePathArgument = Utils::findOrDefault(func->Arguments(), - [file_name = fileName.toStdString()]( - const auto &arg) { - return arg.Value == file_name; - }); + auto filePathArgument = Utils::findOrDefault( + func->Arguments(), [file_name = fileName.toStdString()](const auto &arg) { + return arg.Value == file_name; + }); if (!filePathArgument.Value.empty()) { return ProjectFileArgumentPosition{filePathArgument, targetCMakeFile, fileName}; @@ -925,48 +928,59 @@ bool CMakeBuildSystem::renameFile(Node *context, { if (auto n = dynamic_cast(context)) { const FilePath projDir = n->filePath().canonicalPath(); - const QString newRelPathName - = newFilePath.canonicalPath().relativePathFrom(projDir).cleanPath().toString(); + const FilePath newRelPath = newFilePath.canonicalPath().relativePathFrom(projDir).cleanPath(); + const QString newRelPathName = newRelPath.toString(); + + // FilePath needs the file to exist on disk, the old file has already been renamed + const QString oldRelPathName + = newRelPath.parentDir().pathAppended(oldFilePath.fileName()).cleanPath().toString(); const QString targetName = n->buildKey(); const QString key = QStringList{projDir.path(), targetName, oldFilePath.path(), newFilePath.path()}.join( ";"); - auto fileToRename = m_filesToBeRenamed.take(key); - if (!fileToRename.cmakeFile.exists()) { + std::optional fileToRename + = m_filesToBeRenamed.take(key); + if (!fileToRename->cmakeFile.exists()) { qCCritical(cmakeBuildSystemLog).noquote() - << "File" << fileToRename.cmakeFile.path() << "does not exist."; + << "File" << fileToRename->cmakeFile.path() << "does not exist."; return false; } - BaseTextEditor *editor = qobject_cast( - Core::EditorManager::openEditorAt({fileToRename.cmakeFile, - static_cast(fileToRename.argumentPosition.Line), - static_cast(fileToRename.argumentPosition.Column - - 1)}, - Constants::CMAKE_EDITOR_ID, - Core::EditorManager::DoNotMakeVisible)); - if (!editor) { - qCCritical(cmakeBuildSystemLog).noquote() - << "BaseTextEditor cannot be obtained for" << fileToRename.cmakeFile.path() - << fileToRename.argumentPosition.Line << int(fileToRename.argumentPosition.Column); - return false; - } + do { + BaseTextEditor *editor = qobject_cast( + Core::EditorManager::openEditorAt( + {fileToRename->cmakeFile, + static_cast(fileToRename->argumentPosition.Line), + static_cast(fileToRename->argumentPosition.Column - 1)}, + Constants::CMAKE_EDITOR_ID, + Core::EditorManager::DoNotMakeVisible)); + if (!editor) { + qCCritical(cmakeBuildSystemLog).noquote() + << "BaseTextEditor cannot be obtained for" << fileToRename->cmakeFile.path() + << fileToRename->argumentPosition.Line + << int(fileToRename->argumentPosition.Column); + return false; + } - // If quotes were used for the source file, skip the starting quote - if (fileToRename.argumentPosition.Delim == cmListFileArgument::Quoted) - editor->setCursorPosition(editor->position() + 1); + // If quotes were used for the source file, skip the starting quote + if (fileToRename->argumentPosition.Delim == cmListFileArgument::Quoted) + editor->setCursorPosition(editor->position() + 1); - if (!fileToRename.fromGlobbing) - editor->replace(fileToRename.relativeFileName.length(), newRelPathName); + if (!fileToRename->fromGlobbing) + editor->replace(fileToRename->relativeFileName.length(), newRelPathName); - editor->editorWidget()->autoIndent(); - if (!Core::DocumentManager::saveDocument(editor->document())) { - qCCritical(cmakeBuildSystemLog).noquote() - << "Changes to" << fileToRename.cmakeFile.path() << "could not be saved."; - return false; - } + editor->editorWidget()->autoIndent(); + if (!Core::DocumentManager::saveDocument(editor->document())) { + qCCritical(cmakeBuildSystemLog).noquote() + << "Changes to" << fileToRename->cmakeFile.path() << "could not be saved."; + return false; + } + + // Try the next occurrence. This can happen if set_source_file_properties is used + fileToRename = projectFileArgumentPosition(targetName, oldRelPathName); + } while (fileToRename); return true; } diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index a3795369f76..dd7b6b5c70d 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -633,7 +633,7 @@ static FolderNode *createSourceGroupNode(const QString &sourceGroupName, FolderNode *existingNode = currentNode->findChildFolderNode( [&p](const FolderNode *fn) { return fn->displayName() == p; }); if (!existingNode) { - auto node = createCMakeVFolder(sourceDirectory, Node::DefaultFolderPriority + 5, p, true); + auto node = createCMakeVFolder(sourceDirectory, Node::DefaultFolderPriority + 5, p); node->setListInProject(false); node->setIcon([] { return Icon::fromTheme("edit-copy"); }); @@ -654,7 +654,6 @@ static void addCompileGroups(ProjectNode *targetRoot, const FilePath &buildDirectory, const TargetDetails &td) { - const bool showSourceFolders = settings().showSourceSubFolders(); const bool inSourceBuild = (sourceDirectory == buildDirectory); QSet alreadyListed; @@ -685,6 +684,9 @@ static void addCompileGroups(ProjectNode *targetRoot, if (isPchFile(buildDirectory, sourcePath) || isUnityFile(buildDirectory, sourcePath)) node->setIsGenerated(true); + const bool showSourceFolders = settings().showSourceSubFolders() + && defaultCMakeSourceGroupFolder(td.sourceGroups[si.sourceGroup]); + // Where does the file node need to go? if (showSourceFolders && sourcePath.isChildOf(buildDirectory) && !inSourceBuild) { buildFileNodes.emplace_back(std::move(node)); @@ -696,6 +698,9 @@ static void addCompileGroups(ProjectNode *targetRoot, } for (size_t i = 0; i < sourceGroupFileNodes.size(); ++i) { + const bool showSourceFolders = settings().showSourceSubFolders() + && defaultCMakeSourceGroupFolder(td.sourceGroups[i]); + std::vector> ¤t = sourceGroupFileNodes[i]; FolderNode *insertNode = td.sourceGroups[i] == "TREE" ? targetRoot diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp index e17505095a6..c25cc69378f 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.cpp +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.cpp @@ -18,15 +18,22 @@ using namespace ProjectExplorer; namespace CMakeProjectManager::Internal { +bool defaultCMakeSourceGroupFolder(const QString &displayName) +{ + return displayName == "Source Files" || displayName == "Header Files" + || displayName == "Resources" || displayName == "" + || displayName == "Precompile Header File" || displayName == "CMake Rules" + || displayName == "Object Files"; +} + std::unique_ptr createCMakeVFolder(const Utils::FilePath &basePath, int priority, - const QString &displayName, - bool sourcesOrHeaders) + const QString &displayName) { auto newFolder = std::make_unique(basePath); newFolder->setPriority(priority); newFolder->setDisplayName(displayName); - newFolder->setIsSourcesOrHeaders(sourcesOrHeaders); + newFolder->setIsSourcesOrHeaders(defaultCMakeSourceGroupFolder(displayName)); return newFolder; } @@ -35,14 +42,13 @@ void addCMakeVFolder(FolderNode *base, int priority, const QString &displayName, std::vector> &&files, - bool sourcesOrHeaders, bool listInProject) { if (files.size() == 0) return; FolderNode *folder = base; if (!displayName.isEmpty()) { - auto newFolder = createCMakeVFolder(basePath, priority, displayName, sourcesOrHeaders); + auto newFolder = createCMakeVFolder(basePath, priority, displayName); folder = newFolder.get(); base->addNode(std::move(newFolder)); } @@ -90,7 +96,6 @@ void addCMakeInputs(FolderNode *root, 10, Tr::tr(""), removeKnownNodes(knownFiles, std::move(rootInputs)), - /*sourcesOrHeaders=*/false, /*listInProject=*/false); root->addNode(std::move(cmakeVFolder)); diff --git a/src/plugins/cmakeprojectmanager/projecttreehelper.h b/src/plugins/cmakeprojectmanager/projecttreehelper.h index bcd5500db97..35f7cf16a43 100644 --- a/src/plugins/cmakeprojectmanager/projecttreehelper.h +++ b/src/plugins/cmakeprojectmanager/projecttreehelper.h @@ -11,17 +11,17 @@ namespace CMakeProjectManager::Internal { +bool defaultCMakeSourceGroupFolder(const QString &displayName); + std::unique_ptr createCMakeVFolder(const Utils::FilePath &basePath, int priority, - const QString &displayName, - bool sourcesOrHeaders); + const QString &displayName); void addCMakeVFolder(ProjectExplorer::FolderNode *base, const Utils::FilePath &basePath, int priority, const QString &displayName, std::vector> &&files, - bool sourcesOrHeaders = false, bool listInProject = true); std::vector> &&removeKnownNodes( diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp index bef91c59921..cdbedf19e16 100644 --- a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp +++ b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp @@ -100,10 +100,10 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target) }; setSummaryText(); - connect(&m_cppAspect, &BaseAspect::changed, this, setSummaryText); - connect(&m_qmlAspect, &BaseAspect::changed, this, setSummaryText); - connect(&m_pythonAspect, &BaseAspect::changed, this, setSummaryText); - connect(&m_overrideStartupAspect, &BaseAspect::changed, this, setSummaryText); + connect(&m_cppAspect, &BaseAspect::changed, details, setSummaryText); + connect(&m_qmlAspect, &BaseAspect::changed, details, setSummaryText); + connect(&m_pythonAspect, &BaseAspect::changed, details, setSummaryText); + connect(&m_overrideStartupAspect, &BaseAspect::changed, details, setSummaryText); return details; }); diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 7a7554da9ea..a84598aec00 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -999,6 +999,7 @@ bool FakeVimUserCommandsModel::setData(const QModelIndex &index, return true; } +#ifdef WITH_TESTS static void setupTest(QString *title, FakeVimHandler **handler, QWidget **edit) { *title = QString::fromLatin1("test.cpp"); @@ -1040,7 +1041,6 @@ static void setupTest(QString *title, FakeVimHandler **handler, QWidget **edit) (*handler)->handleCommand("set iskeyword=@,48-57,_,192-255,a-z,A-Z"); } -#ifdef WITH_TESTS QObject *createFakeVimTester( void (*setupTest)(QString *, FakeVimHandler **, QWidget **) ); // in fakevim_test.cpp #endif diff --git a/src/plugins/ios/iosrunner.cpp b/src/plugins/ios/iosrunner.cpp index 9e2174c80bc..1999f7a8994 100644 --- a/src/plugins/ios/iosrunner.cpp +++ b/src/plugins/ios/iosrunner.cpp @@ -60,18 +60,29 @@ using namespace Tasking; namespace Ios::Internal { +static QString identifierForRunControl(RunControl *runControl) +{ + const IosDeviceTypeAspect::Data *data = runControl->aspect(); + return data ? data->deviceType.identifier : QString(); +} + static void stopRunningRunControl(RunControl *runControl) { static QMap> activeRunControls; + // clean up deleted + Utils::erase(activeRunControls, [](const QPointer &rc) { return !rc; }); + Target *target = runControl->target(); - Id devId = DeviceKitAspect::deviceId(target->kit()); + const Id devId = DeviceKitAspect::deviceId(target->kit()); + const QString identifier = identifierForRunControl(runControl); // The device can only run an application at a time, if an app is running stop it. - if (activeRunControls.contains(devId)) { - if (QPointer activeRunControl = activeRunControls[devId]) + if (QPointer activeRunControl = activeRunControls[devId]) { + if (identifierForRunControl(activeRunControl) == identifier) { activeRunControl->initiateStop(); - activeRunControls.remove(devId); + activeRunControls.remove(devId); + } } if (devId.isValid()) diff --git a/src/plugins/projectexplorer/appoutputpane.cpp b/src/plugins/projectexplorer/appoutputpane.cpp index 898acaba2a9..806628668f2 100644 --- a/src/plugins/projectexplorer/appoutputpane.cpp +++ b/src/plugins/projectexplorer/appoutputpane.cpp @@ -391,14 +391,14 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc) const CommandLine thisCommand = rc->commandLine(); const FilePath thisWorkingDirectory = rc->workingDirectory(); const Environment thisEnvironment = rc->environment(); - const auto tab = std::find_if(m_runControlTabs.begin(), m_runControlTabs.end(), - [&](const RunControlTab &tab) { - if (!tab.runControl || tab.runControl->isRunning() || tab.runControl->isStarting()) - return false; - return thisCommand == tab.runControl->commandLine() - && thisWorkingDirectory == tab.runControl->workingDirectory() - && thisEnvironment == tab.runControl->environment(); - }); + const auto tab = std::find_if( + m_runControlTabs.begin(), m_runControlTabs.end(), [&](const RunControlTab &tab) { + if (!tab.runControl || !tab.runControl->isStopped()) + return false; + return thisCommand == tab.runControl->commandLine() + && thisWorkingDirectory == tab.runControl->workingDirectory() + && thisEnvironment == tab.runControl->environment(); + }); if (tab != m_runControlTabs.end()) { // Reuse this tab if (tab->runControl) diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index f189cf0a9b9..2c475f2ad7b 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -617,7 +617,15 @@ FilePath BuildConfiguration::buildDirectoryFromTemplate(const FilePath &projectD [buildType] { return buildTypeName(buildType); }); exp.registerSubProvider([kit] { return kit->macroExpander(); }); - FilePath buildDir = FilePath::fromUserInput(buildPropertiesSettings().buildDirectoryTemplate()); + auto project = ProjectManager::projectWithProjectFilePath(mainFilePath); + auto environment = Environment::systemEnvironment(); + // This adds the environment variables from the .shared file + if (project) + environment.modify(project->additionalEnvironment()); + + FilePath buildDir = FilePath::fromUserInput(environment.value_or( + Constants::QTC_DEFAULT_BUILD_DIRECTORY_TEMPLATE, + buildPropertiesSettings().buildDirectoryTemplate())); qCDebug(bcLog) << "build dir template:" << buildDir.toUserOutput(); buildDir = exp.expand(buildDir); qCDebug(bcLog) << "expanded build:" << buildDir.toUserOutput(); diff --git a/src/plugins/projectexplorer/buildpropertiessettings.cpp b/src/plugins/projectexplorer/buildpropertiessettings.cpp index c9cde2624d8..5b60e6c9c13 100644 --- a/src/plugins/projectexplorer/buildpropertiessettings.cpp +++ b/src/plugins/projectexplorer/buildpropertiessettings.cpp @@ -8,6 +8,7 @@ #include +#include #include using namespace Utils; @@ -16,7 +17,9 @@ namespace ProjectExplorer { static QString defaultBuildDirectoryTemplate() { - return "./build/%{Asciify:%{Kit:FileSystemName}-%{BuildConfig:Name}}"; + return qtcEnvironmentVariable( + Constants::QTC_DEFAULT_BUILD_DIRECTORY_TEMPLATE, + "./build/%{Asciify:%{Kit:FileSystemName}-%{BuildConfig:Name}}"); } BuildPropertiesSettings &buildPropertiesSettings() diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index cf82aa6e739..21741dc1cfb 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -281,7 +281,7 @@ const char CLEAR_ISSUES_ON_REBUILD_SETTINGS_KEY[] = "ProjectExplorer/Settings/Cl const char ABORT_BUILD_ALL_ON_ERROR_SETTINGS_KEY[] = "ProjectExplorer/Settings/AbortBuildAllOnError"; const char LOW_BUILD_PRIORITY_SETTINGS_KEY[] = "ProjectExplorer/Settings/LowBuildPriority"; -const char WARN_AGAINST_NON_ASCII_BUILD_DIR_SETTINGS_KEY[] = "ProjectExplorer/Settings/LowBuildPriority"; +const char WARN_AGAINST_NON_ASCII_BUILD_DIR_SETTINGS_KEY[] = "ProjectExplorer/Settings/WarnAgainstNonAsciiBuildDir"; const char APP_ENV_CHANGES_SETTINGS_KEY[] = "ProjectExplorer/Settings/AppEnvChanges"; const char CUSTOM_PARSER_COUNT_KEY[] = "ProjectExplorer/Settings/CustomParserCount"; diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 80ffefcc51f..ca0fe5c9e09 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -145,6 +145,8 @@ const char CUSTOM_TOOLCHAIN_TYPEID[] = "ProjectExplorer.ToolChain.Custom"; const char DEFAULT_WORKING_DIR[] = "%{buildDir}"; const char DEFAULT_WORKING_DIR_ALTERNATE[] = "%{sourceDir}"; +const char QTC_DEFAULT_BUILD_DIRECTORY_TEMPLATE[] = "QTC_DEFAULT_BUILD_DIRECTORY_TEMPLATE"; + // Desktop Device related ids: const char DESKTOP_DEVICE_ID[] = "Desktop Device"; const char DESKTOP_DEVICE_TYPE[] = "Desktop"; diff --git a/src/plugins/saferenderer/wizards/qsrapp2_1/main.qml.tpl b/src/plugins/saferenderer/wizards/qsrapp2_1/main.qml.tpl index 94fccebcb2a..9f3130bbf0a 100644 --- a/src/plugins/saferenderer/wizards/qsrapp2_1/main.qml.tpl +++ b/src/plugins/saferenderer/wizards/qsrapp2_1/main.qml.tpl @@ -1,5 +1,5 @@ -import Qt.SafeRenderer 2.0 -import QtQuick.Window 2.15 +import Qt.SafeRenderer +import QtQuick.Window Window { id: window @@ -14,13 +14,12 @@ Window { x: 206 y: 208 width: 340 - height: 34 + height: 40 color: "#8ae234" fillColor: "black" text: "Hello Qt Safe Renderer!" font.family: "Lato" horizontalAlignment: Text.AlignLeft font.pixelSize: 32 - runtimeEditable: true } } diff --git a/src/plugins/texteditor/TextEditor.json.in b/src/plugins/texteditor/TextEditor.json.in index 447d9c91c67..f2b6fbbcf58 100644 --- a/src/plugins/texteditor/TextEditor.json.in +++ b/src/plugins/texteditor/TextEditor.json.in @@ -24,6 +24,21 @@ " ", " ", " ", + " ", + " Yacc/Bison source files", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " Lex/Flex source files", + " ", + " ", + " ", + " ", + " ", "" ] } diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 3256ee91b79..1d90c7481f2 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -4381,7 +4381,7 @@ static QColor calcBlendColor(const QColor &baseColor, int level, int count) if (level == count - 1) return color90; - const int blendFactor = level * (256 / (count - 2)); + const int blendFactor = level * (256 / (count - 1)); return blendColors(color80, color90, blendFactor); } @@ -6876,8 +6876,7 @@ void TextEditorWidgetPrivate::handleBackspaceKey() } } } else if (typingSettings.m_smartBackspaceBehavior == TypingSettings::BackspaceUnindents) { - const QChar previousChar = q->document()->characterAt(pos - 1); - if (!(previousChar == QLatin1Char(' ') || previousChar == QLatin1Char('\t'))) { + if (c.positionInBlock() > TabSettings::firstNonSpace(c.block().text())) { if (cursorWithinSnippet) c.beginEditBlock(); c.deletePreviousChar(); diff --git a/src/shared/qbs b/src/shared/qbs index 5c88b6b11b7..ca74c524363 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 5c88b6b11b762cf5861c9d1570df4f1f050c826e +Subproject commit ca74c524363d17c689bb0ec4ca39c744df8d036e diff --git a/tests/system/objects.map b/tests/system/objects.map index 66681c6b056..6ad38f58318 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -12,7 +12,7 @@ :*Qt Creator.findEdit_Utils::FilterLineEdit {name='findEdit' type='Utils::FancyLineEdit' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :*Qt Creator_Core::Internal::FancyToolButton {name='KitSelector.Button' type='Core::Internal::FancyToolButton' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :*Qt Creator_Utils::FilterLineEdit {type='Utils::FancyLineEdit' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:*Qt Creator_Utils::IconButton {occurrence='5' type='Utils::FancyIconButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:*Qt Creator_Utils::IconButton {toolTip='Clear text' type='Utils::FancyIconButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :About Qt Creator_Core::Internal::VersionDialog {type='Core::Internal::VersionDialog' unnamed='1' visible='1' windowTitle='About Qt Creator'} :Activate completion:_QComboBox {buddy=':Behavior.Activate completion:_QLabel' type='QComboBox' unnamed='1' visible='1'} :Add Bookmark.ExpandBookmarksList_QToolButton {text='+' type='QToolButton' unnamed='1' visible='1' window=':Add Bookmark_BookmarkDialog'} @@ -92,7 +92,6 @@ :JsonWizard_ProjectExplorer::JsonFieldPage {type='ProjectExplorer::JsonFieldPage' unnamed='1' visible='1' window=':New_ProjectExplorer::JsonWizard'} :Kits_QtVersion_QComboBox {container=':qt_tabwidget_stackedwidget_QWidget' leftWidget=':QtVersionLabel_KitPage' type='QComboBox' unnamed='1' visible='1'} :Locals and Expressions_Debugger::Internal::WatchTreeView {container=':Debugger.Docks.LocalsAndWatchersDockWidget.Inspector_QFrame' name='WatchWindow' type='Debugger::Internal::WatchTreeView' visible='1'} -:New Text File.Add to project:_QLabel {name='projectLabel' text='Add to project:' type='QLabel' visible='1' window=':New_ProjectExplorer::JsonWizard'} :New Text File.nameLineEdit_Utils::FileNameValidatingLineEdit {name='nameLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1' window=':New_ProjectExplorer::JsonWizard'} :New.comboBox_QComboBox {type='QComboBox' unnamed='1' visible='1' window=':New_Core::Internal::NewDialog'} :New.templateCategoryView_QTreeView {name='templateCategoryView' type='QTreeView' visible='1' window=':New_Core::Internal::NewDialog'} @@ -141,11 +140,11 @@ :Qt Creator.WelcomeScreenStackedWidget {name='WelcomeScreenStackedWidget' type='QStackedWidget' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.replaceEdit_Utils::FilterLineEdit {name='replaceEdit' type='Utils::FancyLineEdit' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.splitter_QSplitter {name='splitter' type='QSplitter' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton {occurrence='3' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton {toolTip?='*Application Output*' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_BinEditor::BinEditorWidget {type='BinEditor::Internal::BinEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Bookmarks_TreeView {type='TreeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_CloseButton {type='CloseButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_CompileOutput_Core::Internal::OutputPaneToggleButton {occurrence='4' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_CompileOutput_Core::Internal::OutputPaneToggleButton {toolTip?='*Compile Output*' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Core::Internal::CommandComboBox {type='Core::Internal::CommandComboBox' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Core::Internal::MainWindow {type='Utils::AppMainWindow' visible='1' windowTitle?='*Qt Creator'} :Qt Creator_Core::Internal::NavComboBox {type='Core::Internal::NavComboBox' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} @@ -153,17 +152,17 @@ :Qt Creator_Core::OutputWindow {type='Core::OutputWindow' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_CppEditor::Internal::CPPEditorWidget {type='CppEditor::CppEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_DiffEditor::Internal::DescriptionEditorWidget {type='DiffEditor::Internal::DescriptionEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_DiffEditor::SideDiffEditorWidget {type='DiffEditor::Internal::SideDiffEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_DiffEditor::SideDiffEditorWidget2 {occurrence='2' type='DiffEditor::Internal::SideDiffEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_DiffEditor::SideDiffEditorWidgetChanged {type='DiffEditor::Internal::SideDiffEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' x~='[1-9][0-9]*'} +:Qt Creator_DiffEditor::SideDiffEditorWidgetOriginal {type='DiffEditor::Internal::SideDiffEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' x='0'} :Qt Creator_FilenameQComboBox {leftWidget=':Qt Creator.DragDoc_QToolButton' type='QComboBox' unnamed='1' visible='1'} :Qt Creator_Find::Internal::SearchResultTreeView {type='Core::Internal::SearchResultTreeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Git::Internal::GitEditor {type='Git::Internal::GitEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_HelpSelector_QComboBox {occurrence='3' type='QComboBox' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_Issues_Core::Internal::OutputPaneToggleButton {occurrence='1' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_Issues_Core::Internal::OutputPaneToggleButton {toolTip?='*Issues*' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_QHelpContentWidget {name='helpContentWidget' type='QTreeView' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_QmlJSEditor::Internal::QmlJSOutlineTreeView {type='QmlJSEditor::Internal::QmlJSOutlineTreeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_QmlJSEditor::QmlJSTextEditorWidget {type='QmlJSEditor::QmlJSEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} -:Qt Creator_SearchResult_Core::Internal::OutputPaneToggleButton {occurrence='2' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} +:Qt Creator_SearchResult_Core::Internal::OutputPaneToggleButton {toolTip?='*Search Results*' type='Core::Internal::OutputPaneToggleButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_TextEditor::TextEditorWidget {type='TextEditor::TextEditorWidget' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Utils::BuildDirectoryLineEdit {name='LineEdit' type='Utils::FancyLineEdit' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator_Utils::NavigationTreeView {name='projectTreeView' type='QTreeView' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} @@ -205,8 +204,7 @@ :headerFileLineEdit_Utils::FileNameValidatingLineEdit {name='HdrFileName' type='Utils::FancyLineEdit' visible='1' window=':New_ProjectExplorer::JsonWizard'} :popupFrame_Proposal_QListView {container=':popupFrame_TextEditor::GenericProposalWidget' type='QListView' unnamed='1' visible='1'} :popupFrame_TextEditor::GenericProposalWidget {name='m_popupFrame' type='TextEditor::GenericProposalWidget' visible='1'} -:projectComboBox_QComboBox {buddy=':New Text File.Add to project:_QLabel' name='projectComboBox' type='QComboBox' visible='1'} -:projectComboBox_Utils::TreeViewComboBox {buddy=':New Text File.Add to project:_QLabel' name='projectComboBox' type='QComboBox' visible='1'} +:projectComboBox_QComboBox {name='projectComboBox' type='QComboBox' visible='1'} :qdesigner_internal::WidgetBoxCategoryListView {container=':Widget Box_qdesigner_internal::WidgetBoxTreeWidget' occurrence='3' type='qdesigner_internal::WidgetBoxCategoryListView' unnamed='1' visible='1'} :qt_tabwidget_stackedwidget.QtSupport__Internal__QtVersionManager_QtSupport::Internal::QtOptionsPageWidget {container=':Options.qt_tabwidget_stackedwidget_QStackedWidget' type='QScrollArea' unnamed='1' visible='1'} :qt_tabwidget_stackedwidget_QScrollArea {container=':Options.qt_tabwidget_stackedwidget_QStackedWidget' type='QScrollArea' unnamed='1' visible='1'} diff --git a/tests/system/settings/windows/QtProject/qtcreator/debuggers.xml b/tests/system/settings/windows/QtProject/qtcreator/debuggers.xml index b8d5b705e11..64016440ae7 100644 --- a/tests/system/settings/windows/QtProject/qtcreator/debuggers.xml +++ b/tests/system/settings/windows/QtProject/qtcreator/debuggers.xml @@ -4,23 +4,6 @@ DebuggerItem.0 - - - x86-windows-msvc2015-pe-SQUISH_DEBUGGER_BITNESSbit - - true - - C:/Program Files (x86)/Windows Kits/10/Debuggers/SQUISH_DEBUGGER_ARCHITECTURE/cdb.exe - Auto-detected CDB at C:\Program Files (x86)\Windows Kits\10\Debuggers\SQUISH_DEBUGGER_ARCHITECTURE\cdb.exe - 4 - {1b25f20a-d584-4fb7-85b3-74dd15b82f6f} - - - - - - - DebuggerItem.1 x86-windows-msys-pe-unknown @@ -36,7 +19,7 @@ DebuggerItem.Count - 2 + 1 Version diff --git a/tests/system/settings/windows/QtProject/qtcreator/profiles.xml b/tests/system/settings/windows/QtProject/qtcreator/profiles.xml index 1a46caa099c..ecb22a0459b 100644 --- a/tests/system/settings/windows/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/windows/QtProject/qtcreator/profiles.xml @@ -37,7 +37,6 @@ - {1b25f20a-d584-4fb7-85b3-74dd15b82f6f} Desktop Device Desktop @@ -65,7 +64,6 @@ - {1b25f20a-d584-4fb7-85b3-74dd15b82f6f} Desktop Device Desktop @@ -94,7 +92,6 @@ false - {1b25f20a-d584-4fb7-85b3-74dd15b82f6f} Desktop Device Desktop diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index a45d78cfc4b..cdf5290d895 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -524,7 +524,7 @@ def __getSupportedPlatforms__(text, templateName, getAsStrings=False, ignoreVali version = res.group("version") else: version = None - if templateName == "Qt Quick Application": + if templateName in ("Qt Quick 2 Extension Plugin", "Qt Quick Application"): result = set([Targets.DESKTOP_6_2_4]) elif 'Supported Platforms' in text: supports = text[text.find('Supported Platforms'):].split(":")[1].strip().split("\n") @@ -662,7 +662,7 @@ def addCPlusPlusFile(name, template, projectName, forceOverwrite=False, addToVCS test.compare(str(waitForObject("{name='HdrFileName' type='QLineEdit' visible='1'}").text), expectedHeaderName) clickButton(waitForObject(":Next_QPushButton")) - projectComboBox = waitForObjectExists(":projectComboBox_Utils::TreeViewComboBox") + projectComboBox = waitForObjectExists(":projectComboBox_QComboBox") test.compare(projectComboBox.enabled, projectName != None, "Project combo box must be enabled when a project is open") projectNameToDisplay = "" diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index f1d4078fb52..12d6fc364b8 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -201,31 +201,6 @@ def substituteDefaultCompiler(settingsDir): __substitute__(qtversion, "SQUISH_DEFAULT_COMPILER", compiler) test.log("Injected default compiler '%s' to qtversion.xml..." % compiler) -def substituteCdb(settingsDir): - def canUse64bitCdb(): - try: - serverIni = readFile(os.path.join(os.getenv("APPDATA"), "froglogic", - "Squish", "ver1", "server.ini")) - autLine = next(iter(filter(lambda line: "AUT/qtcreator" in line, - serverIni.splitlines()))) - autPath = autLine.split("\"")[1] - return os.path.exists(os.path.join(autPath, "..", "lib", "qtcreatorcdbext64")) - except: - test.fatal("Something went wrong when determining debugger bitness", - "Did Squish's file structure change? Guessing 32-bit cdb can be used...") - return True - - if canUse64bitCdb(): - architecture = "x64" - bitness = "64" - else: - architecture = "x86" - bitness = "32" - debuggers = os.path.join(settingsDir, "QtProject", 'qtcreator', 'debuggers.xml') - __substitute__(debuggers, "SQUISH_DEBUGGER_ARCHITECTURE", architecture) - __substitute__(debuggers, "SQUISH_DEBUGGER_BITNESS", bitness) - test.log("Injected architecture '%s' and bitness '%s' in cdb path..." % (architecture, bitness)) - def substituteMsvcPaths(settingsDir, version, targetBitness=64): if not version in ['2017', '2019']: @@ -298,7 +273,6 @@ def copySettingsToTmpDir(destination=None, omitFiles=[]): substituteTildeWithinQtVersion(tmpSettingsDir) substituteDefaultCompiler(tmpSettingsDir) elif platform.system() in ('Windows', 'Microsoft'): - substituteCdb(tmpSettingsDir) substituteMsvcPaths(tmpSettingsDir, '2017', 64) substituteMsvcPaths(tmpSettingsDir, '2017', 32) substituteMsvcPaths(tmpSettingsDir, '2019', 64) diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 7e6b91a961f..623287563a3 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -81,6 +81,14 @@ def selectFromCombo(objectSpec, itemName): mouseClick(waitForObjectItem(comboObject, itemName.replace(".", "\\."))) test.verify(waitFor("str(comboObject.currentText)==itemName", 5000), "Switched combo item to '%s'" % itemName) + def __collapsed__(): + try: + waitForObject("{container='%s' type='QModelIndex'}" % objectSpec, 100) + return False + except: + return True + + waitFor(__collapsed__, 1000) return True def selectFromLocator(filter, itemName = None): diff --git a/tests/system/suite_HELP/tst_HELP02/test.py b/tests/system/suite_HELP/tst_HELP02/test.py index 31a3e7c2de4..b6246e4f05e 100644 --- a/tests/system/suite_HELP/tst_HELP02/test.py +++ b/tests/system/suite_HELP/tst_HELP02/test.py @@ -53,10 +53,6 @@ def checkQtCreatorHelpVersion(expectedVersion): test.fail("Missing Qt Creator Manual.") -def _shortcutMatches_(shortcutEdit, expectedText): - return str(findObject(shortcutEdit).text) == expectedText - - def setKeyboardShortcutForAboutQtC(): invokeMenuItem("Edit", "Preferences...") mouseClick(waitForObjectItem(":Options_QListView", "Environment")) @@ -78,16 +74,16 @@ def setKeyboardShortcutForAboutQtC(): "placeholderText='Enter key sequence as text'}" % shortcutGB) clickButton(record) nativeType(keysToType) - waitFor("_shortcutMatches_(shortcut, expectedKeys)", 5000) + waitFor(lambda: str(findObject(shortcut).text) == expectedKeys, 5000) clickButton(record) - gotExpectedShortcut = _shortcutMatches_(shortcut, expectedKeys) - if not gotExpectedShortcut and platform.system() == 'Darwin': + foundShortcut = str(findObject(shortcut).text) + if foundShortcut != expectedKeys and platform.system() == 'Darwin': test.warning("Squish Issue: shortcut was set to %s - entering it manually now" % waitForObject(shortcut).text) replaceEditorContent(shortcut, expectedKeys) else: - test.verify(gotExpectedShortcut, "Expected key sequence is displayed.") + test.compare(foundShortcut, expectedKeys, "Expected key sequence is displayed?") clickButton(waitForObject(":Options.OK_QPushButton")) def main(): diff --git a/tests/system/suite_debugger/tst_debug_empty_main/test.py b/tests/system/suite_debugger/tst_debug_empty_main/test.py index 019b55e5f00..d62f76cdebf 100644 --- a/tests/system/suite_debugger/tst_debug_empty_main/test.py +++ b/tests/system/suite_debugger/tst_debug_empty_main/test.py @@ -14,8 +14,7 @@ def addFileToProject(projectPath, category, fileTemplate, fileName): projectPath, "Verifying whether path is correct."): replaceEditorContent(pathLineEdit, projectPath) clickButton(waitForObject(":Next_QPushButton")) - projCombo = findObject("{buddy={name='projectLabel' text='Add to project:' type='QLabel' " - "visible='1'} name='projectComboBox' type='QComboBox' visible='1'}") + projCombo = waitForObjectExists(":projectComboBox_QComboBox", 1000) proFileName = os.path.basename(projectPath) + ".pro" test.verify(not selectFromCombo(projCombo, proFileName), "Verifying project is selected.") __createProjectHandleLastPage__() diff --git a/tests/system/suite_general/tst_create_proj_wizard/test.py b/tests/system/suite_general/tst_create_proj_wizard/test.py index 4da9d39d732..78178d82bb8 100644 --- a/tests/system/suite_general/tst_create_proj_wizard/test.py +++ b/tests/system/suite_general/tst_create_proj_wizard/test.py @@ -41,9 +41,6 @@ def main(): # needed because categoriesView and templatesView using same model for template in dumpItems(templatesView.model(), templatesView.rootIndex()): template = template.replace(".", "\\.") - # FIXME this needs Qt6.2+ - if template == "Qt Quick 2 Extension Plugin": - continue # skip non-configurable if template not in ["Qt Quick UI Prototype", "Qt Creator Plugin"]: availableProjectTypes.append({category:template}) @@ -119,6 +116,9 @@ def handleBuildSystemVerifyKits(category, template, kits, displayedPlatforms, if template == 'Qt Quick Application': fixedBuildSystems.remove('qmake') test.log("Skipped qmake (not supported).") + elif template == 'Qt Quick 2 Extension Plugin': + fixedBuildSystems.remove('Qbs') + test.log("Skipped Qbs (not supported).") for counter, buildSystem in enumerate(fixedBuildSystems): test.log("Using build system '%s'" % buildSystem) diff --git a/tests/system/suite_general/tst_openqt_creator/test.py b/tests/system/suite_general/tst_openqt_creator/test.py index c0cbc815a22..3c55342fc21 100644 --- a/tests/system/suite_general/tst_openqt_creator/test.py +++ b/tests/system/suite_general/tst_openqt_creator/test.py @@ -21,13 +21,13 @@ def main(): openQmakeProject(os.path.join(pathSpeedcrunch, "src", "speedcrunch.pro"), [Targets.DESKTOP_5_14_1_DEFAULT]) # Wait for parsing to complete - waitFor("runButton.enabled", 30000) + waitFor(lambda: runButton.enabled, 30000) # Starting before opening, because this is where Creator froze (QTCREATORBUG-10733) startopening = datetime.utcnow() openQmakeProject(pathCreator, [Targets.DESKTOP_5_14_1_DEFAULT]) # Wait for parsing to complete startreading = datetime.utcnow() - waitFor("runButton.enabled", 300000) + waitFor(lambda: runButton.enabled, 300000) secondsOpening = (datetime.utcnow() - startopening).seconds secondsReading = (datetime.utcnow() - startreading).seconds timeoutOpen = 45 diff --git a/tests/system/suite_tools/tst_git_first_commit/test.py b/tests/system/suite_tools/tst_git_first_commit/test.py index 1ef7090602b..0ee8f2505bf 100644 --- a/tests/system/suite_tools/tst_git_first_commit/test.py +++ b/tests/system/suite_tools/tst_git_first_commit/test.py @@ -35,7 +35,7 @@ def main(): test.verify(" files changed, 229938 insertions(+)" in commitDetails, "Summary in details view?") clickButton(waitForObject(":Select a Git Commit.Show_QPushButton")) - changedEdit = waitForObject(":Qt Creator_DiffEditor::SideDiffEditorWidget") + changedEdit = waitForObject(":Qt Creator_DiffEditor::SideDiffEditorWidgetChanged") waitFor("len(str(changedEdit.plainText)) > 0 and " "str(changedEdit.plainText) != 'Waiting for data...'", 40000) diffPlainText = str(changedEdit.plainText) diff --git a/tests/system/suite_tools/tst_git_local/test.py b/tests/system/suite_tools/tst_git_local/test.py index aefdc07d9a1..1c9cd01712a 100644 --- a/tests/system/suite_tools/tst_git_local/test.py +++ b/tests/system/suite_tools/tst_git_local/test.py @@ -82,7 +82,8 @@ def __clickCommit__(count): test.verify(waitFor('str(fileName.currentText) == expected', 5000), "Verifying editor switches to Git Show.") description = waitForObject(":Qt Creator_DiffEditor::Internal::DescriptionEditorWidget") - waitFor('len(str(description.plainText)) != 0', 5000) + waitFor('len(str(description.plainText)) != 0 ' + 'and str(description.plainText) != "Waiting for data..."', 5000) show = str(description.plainText) id = "Nobody " time = "\w{3} \w{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}.* seconds ago\)" @@ -104,8 +105,8 @@ def verifyClickCommit(): for i in range(1, 3): if not __clickCommit__(i): continue - changed = waitForObject(":Qt Creator_DiffEditor::SideDiffEditorWidget") - original = waitForObject(":Qt Creator_DiffEditor::SideDiffEditorWidget2") + changed = waitForObject(":Qt Creator_DiffEditor::SideDiffEditorWidgetChanged") + original = waitForObject(":Qt Creator_DiffEditor::SideDiffEditorWidgetOriginal") waitFor('str(changed.plainText) != "Waiting for data..." ' 'and str(original.plainText) != "Waiting for data..."', 5000) # content of diff editors is merge of modified files @@ -201,7 +202,7 @@ def main(): type(gitEditor, "") rect = gitEditor.cursorRect(gitEditor.textCursor()) mouseClick(gitEditor, rect.x+rect.width/2, rect.y+rect.height/2, 0, Qt.LeftButton) - changed = waitForObject(":Qt Creator_DiffEditor::SideDiffEditorWidget") + changed = waitForObject(":Qt Creator_DiffEditor::SideDiffEditorWidgetChanged") waitFor('str(changed.plainText) != "Waiting for data..."', 5000) test.compare(str(changed.plainText), "Retrieving data failed.", "Showing an invalid commit can't succeed but Creator survived.")