Merge remote-tracking branch 'origin/13.0' into HEAD

Change-Id: I1f87297930db420606aab8d7016c290483f262c0
This commit is contained in:
Tim Jenssen
2024-04-23 14:03:46 +02:00
55 changed files with 245 additions and 219 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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}
*/

View File

@@ -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}

View File

@@ -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}
*/

View File

@@ -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

View File

@@ -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}
*/

View File

@@ -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"],

View File

@@ -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<QGraphicsItem *> copy = m_selectedItems;
for (QGraphicsItem *item : copy) {
if (item != selectItem)
item->setSelected(false);
}

View File

@@ -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;

View File

@@ -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

View File

@@ -769,6 +769,7 @@ private:
std::unique_ptr<ProcessInterfaceHandler> m_processHandler;
mutable QMutex m_mutex;
QList<ProcessInterfaceSignal *> 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;

View File

@@ -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);
}

View File

@@ -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));
});

View File

@@ -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;
}

View File

@@ -749,12 +749,15 @@ 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) {
auto filePathArgument = Utils::findOrDefault(
func->Arguments(), [file_name = fileName.toStdString()](const auto &arg) {
return arg.Value == file_name;
});
@@ -925,49 +928,60 @@ bool CMakeBuildSystem::renameFile(Node *context,
{
if (auto n = dynamic_cast<CMakeTargetNode *>(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<CMakeBuildSystem::ProjectFileArgumentPosition> 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;
}
do {
BaseTextEditor *editor = qobject_cast<BaseTextEditor *>(
Core::EditorManager::openEditorAt({fileToRename.cmakeFile,
static_cast<int>(fileToRename.argumentPosition.Line),
static_cast<int>(fileToRename.argumentPosition.Column
- 1)},
Core::EditorManager::openEditorAt(
{fileToRename->cmakeFile,
static_cast<int>(fileToRename->argumentPosition.Line),
static_cast<int>(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);
<< "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)
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.";
<< "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;
}

View File

@@ -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<FilePath> 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<std::unique_ptr<FileNode>> &current = sourceGroupFileNodes[i];
FolderNode *insertNode = td.sourceGroups[i] == "TREE"
? targetRoot

View File

@@ -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<FolderNode> createCMakeVFolder(const Utils::FilePath &basePath,
int priority,
const QString &displayName,
bool sourcesOrHeaders)
const QString &displayName)
{
auto newFolder = std::make_unique<VirtualFolderNode>(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<std::unique_ptr<FileNode>> &&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("<Other Locations>"),
removeKnownNodes(knownFiles, std::move(rootInputs)),
/*sourcesOrHeaders=*/false,
/*listInProject=*/false);
root->addNode(std::move(cmakeVFolder));

View File

@@ -11,17 +11,17 @@
namespace CMakeProjectManager::Internal {
bool defaultCMakeSourceGroupFolder(const QString &displayName);
std::unique_ptr<ProjectExplorer::FolderNode> 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<std::unique_ptr<ProjectExplorer::FileNode>> &&files,
bool sourcesOrHeaders = false,
bool listInProject = true);
std::vector<std::unique_ptr<ProjectExplorer::FileNode>> &&removeKnownNodes(

View File

@@ -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;
});

View File

@@ -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

View File

@@ -60,19 +60,30 @@ using namespace Tasking;
namespace Ios::Internal {
static QString identifierForRunControl(RunControl *runControl)
{
const IosDeviceTypeAspect::Data *data = runControl->aspect<IosDeviceTypeAspect>();
return data ? data->deviceType.identifier : QString();
}
static void stopRunningRunControl(RunControl *runControl)
{
static QMap<Id, QPointer<RunControl>> activeRunControls;
// clean up deleted
Utils::erase(activeRunControls, [](const QPointer<RunControl> &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<RunControl> activeRunControl = activeRunControls[devId])
if (QPointer<RunControl> activeRunControl = activeRunControls[devId]) {
if (identifierForRunControl(activeRunControl) == identifier) {
activeRunControl->initiateStop();
activeRunControls.remove(devId);
}
}
if (devId.isValid())
activeRunControls[devId] = runControl;

View File

@@ -391,9 +391,9 @@ 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())
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()

View File

@@ -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 <project>.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();

View File

@@ -8,6 +8,7 @@
#include <coreplugin/dialogs/ioptionspage.h>
#include <utils/environment.h>
#include <utils/layoutbuilder.h>
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()

View File

@@ -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";

View File

@@ -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";

View File

@@ -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
}
}

View File

@@ -24,6 +24,21 @@
" <sub-class-of type='text/plain'/>",
" <glob pattern='*.dts' weight='80'/>",
" </mime-type>",
" <mime-type type='text/x-yacc'>",
" <comment>Yacc/Bison source files</comment>",
" <sub-class-of type='text/plain'/>",
" <glob pattern='*.y'/>",
" <glob pattern='*.yy'/>",
" <glob pattern='*.ypp'/>",
" <glob pattern='*.y++'/>",
" </mime-type>",
" <mime-type type='text/x-lex'>",
" <comment>Lex/Flex source files</comment>",
" <sub-class-of type='text/plain'/>",
" <glob pattern='*.l'/>",
" <glob pattern='*.lex'/>",
" <glob pattern='*.flex'/>",
" </mime-type>",
"</mime-info>"
]
}

View File

@@ -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();

View File

@@ -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'}

View File

@@ -4,23 +4,6 @@
<qtcreator>
<data>
<variable>DebuggerItem.0</variable>
<valuemap type="QVariantMap">
<valuelist type="QVariantList" key="Abis">
<value type="QString">x86-windows-msvc2015-pe-SQUISH_DEBUGGER_BITNESSbit</value>
</valuelist>
<value type="bool" key="AutoDetected">true</value>
<value type="QString" key="AutoDetectionSource"></value>
<value type="QString" key="Binary">C:/Program Files (x86)/Windows Kits/10/Debuggers/SQUISH_DEBUGGER_ARCHITECTURE/cdb.exe</value>
<value type="QString" key="DisplayName">Auto-detected CDB at C:\Program Files (x86)\Windows Kits\10\Debuggers\SQUISH_DEBUGGER_ARCHITECTURE\cdb.exe</value>
<value type="int" key="EngineType">4</value>
<value type="QString" key="Id">{1b25f20a-d584-4fb7-85b3-74dd15b82f6f}</value>
<value type="QDateTime" key="LastModified"></value>
<value type="QString" key="Version"></value>
<value type="QString" key="WorkingDirectory"></value>
</valuemap>
</data>
<data>
<variable>DebuggerItem.1</variable>
<valuemap type="QVariantMap">
<valuelist type="QVariantList" key="Abis">
<value type="QString">x86-windows-msys-pe-unknown</value>
@@ -36,7 +19,7 @@
</data>
<data>
<variable>DebuggerItem.Count</variable>
<value type="int">2</value>
<value type="int">1</value>
</data>
<data>
<variable>Version</variable>

View File

@@ -37,7 +37,6 @@
<value type="QString" key="PE.Profile.AutoDetectionSource"></value>
<valuemap type="QVariantMap" key="PE.Profile.Data">
<value type="QString" key="Android.GdbServer.Information"></value>
<value type="QString" key="Debugger.Information">{1b25f20a-d584-4fb7-85b3-74dd15b82f6f}</value>
<value type="QString" key="PE.Profile.Device">Desktop Device</value>
<value type="QByteArray" key="PE.Profile.DeviceType">Desktop</value>
<valuelist type="QVariantList" key="PE.Profile.Environment"/>
@@ -65,7 +64,6 @@
<valuemap type="QVariantMap" key="PE.Profile.Data">
<value type="QString"></value>
<value type="QString" key="Android.GdbServer.Information"></value>
<value type="QString" key="Debugger.Information">{1b25f20a-d584-4fb7-85b3-74dd15b82f6f}</value>
<value type="QString" key="PE.Profile.Device">Desktop Device</value>
<value type="QByteArray" key="PE.Profile.DeviceType">Desktop</value>
<valuelist type="QVariantList" key="PE.Profile.Environment">
@@ -94,7 +92,6 @@
<value type="bool" key="PE.Profile.AutoDetected">false</value>
<value type="QString" key="PE.Profile.AutoDetectionSource"></value>
<valuemap type="QVariantMap" key="PE.Profile.Data">
<value type="QString" key="Debugger.Information">{1b25f20a-d584-4fb7-85b3-74dd15b82f6f}</value>
<value type="QString" key="PE.Profile.Device">Desktop Device</value>
<value type="QString" key="PE.Profile.DeviceType">Desktop</value>
<valuemap type="QVariantMap" key="PE.Profile.ToolChainsV3">

View File

@@ -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 = "<None>"

View File

@@ -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)

View File

@@ -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):

View File

@@ -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():

View File

@@ -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__()

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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 <nobody@nowhere\.com>"
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, "<Right>")
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.")