Merge remote-tracking branch 'origin/13.0' into HEAD
Change-Id: I1f87297930db420606aab8d7016c290483f262c0
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 33 KiB |
BIN
doc/qtcreator/images/qtquick-example-setting-breakpoint1.webp
Normal file
After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 7.4 KiB |
BIN
doc/qtcreator/images/qtquick-example-setting-breakpoint2.webp
Normal file
After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 31 KiB |
BIN
doc/qtcreator/images/qtquick-example-setting-breakpoint3.webp
Normal file
After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 56 KiB |
BIN
doc/qtcreator/images/qtquick-example-stack.webp
Normal file
After Width: | Height: | Size: 25 KiB |
@@ -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.
|
||||
|
@@ -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
|
||||
|
@@ -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.
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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}
|
||||
*/
|
||||
|
@@ -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}
|
||||
|
@@ -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}
|
||||
*/
|
||||
|
@@ -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
|
||||
|
@@ -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}
|
||||
*/
|
||||
|
@@ -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"],
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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));
|
||||
});
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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>> ¤t = sourceGroupFileNodes[i];
|
||||
FolderNode *insertNode = td.sourceGroups[i] == "TREE"
|
||||
? targetRoot
|
||||
|
@@ -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));
|
||||
|
@@ -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(
|
||||
|
@@ -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;
|
||||
});
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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()
|
||||
|
@@ -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();
|
||||
|
@@ -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()
|
||||
|
@@ -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";
|
||||
|
@@ -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";
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
|
@@ -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>"
|
||||
]
|
||||
}
|
||||
|
@@ -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();
|
||||
|
@@ -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'}
|
||||
|
@@ -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>
|
||||
|
@@ -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">
|
||||
|
@@ -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>"
|
||||
|
@@ -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)
|
||||
|
@@ -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):
|
||||
|
@@ -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():
|
||||
|
@@ -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__()
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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.")
|
||||
|