Merge remote-tracking branch 'origin/14.0'

Conflicts:
	cmake/QtCreatorIDEBranding.cmake
	qbs/modules/qtc/qtc.qbs

Change-Id: If39fe80197537c489361810e91ee221c6c52ea01
This commit is contained in:
Eike Ziller
2024-07-01 12:01:27 +02:00
112 changed files with 378 additions and 524 deletions

View File

@@ -744,7 +744,7 @@ jobs:
name: ${{ steps.ccache.outputs.archive_name }}
- name: Upload Release Changelog
if: contains(github.ref, 'tags/v')
if: runner.os == 'macOS' && contains(github.ref, 'tags/v')
uses: actions/upload-artifact@v4
with:
path: ./release/changelog.md

View File

@@ -246,10 +246,12 @@ Version Control Systems
Test Integration
----------------
* Made the test timeout optional
* Made the test timeout optional in `Preferences` > `Testing` > `General`
([QTCREATORBUG-30668](https://bugreports.qt.io/browse/QTCREATORBUG-30668))
* Added a project specific option `Limit Files to Path Patterns` for restricting
the search for tests
([Documentation](https://doc-snapshots.qt.io/qtcreator-14.0/creator-preferences-testing.html))
* Added the project specific `Limit Files to Path Patterns` option in `Projects` >
`Project Settings` > `Testing` for restricting the search for tests
([Documentation](https://doc-snapshots.qt.io/qtcreator-14.0/creator-how-to-limit-files-to-path-patterns.html))
### Qt Test

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -141,13 +141,16 @@
\li Always communicates with the default instance.
\endtable
\section1 Profile Qt Quick applications
\section1 Analyze the applications
You can use the \l{Profiling QML Applications}{QML Profiler} to find causes
for typical performance problems in your Qt Quick applications, such as
Use the \l{Profiling QML Applications}{QML Profiler} to find causes
for typical performance problems in Qt Quick applications, such as
slowness and unresponsive, stuttering user interfaces. You cannot profile an
in-process runtime as an individual process.
Use the \l{Performance Analyzer} to analyze the CPU and memory usage of an
application.
\sa {Activate kits for a project}, {Enable and disable plugins},
{\B2Q}{How To: Develop for \B2Q},
{Remote Linux}{How To: Develop for remote Linux},

View File

@@ -515,7 +515,7 @@
By default, \QC groups tests that are in the same directory.
\endtable
To select the testing framework for the current project, go to
To override some preferences for the current project, go to
\uicontrol Projects > \uicontrol {Project Settings} > \uicontrol {Testing}.
\section1 Qt Tests
@@ -715,7 +715,7 @@
\li Disable statistical analysis and bootstrapping.
\endtable
\section2 Specifying Settings for Running CTest-Based Tests
\section1 CTest-Based Tests
To specify settings for running CTest-based tests, go to \preferences >
\uicontrol {Testing} > \uicontrol {CTest}.

View File

@@ -96,7 +96,7 @@
\li \l{Link projects with GitLab}{GitLab}
\li \l{Configure language server workspace}{Language Server}
\li \l{Specify settings for quick fixes}{Quick Fixes}
\li \l{Testing}
\li \l{Apply filters before scanning for tests}{Testing}
\li \l{Exclude files from to-do lists}{To-Do} (experimental)
\endlist

View File

@@ -0,0 +1,32 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page creator-how-to-limit-files-to-path-patterns.html
\previouspage creator-how-tos.html
\ingroup creator-how-to-test
\ingroup creator-how-to-projects-configure
\title Apply filters before scanning for tests
To override testing preferences for the current project:
\list 1
\li Go to \uicontrol Projects > \uicontrol {Project Settings} >
\uicontrol {Testing}.
\image qtcreator-projects-settings-testing.webp {Testing settings in Projects mode}
\li Clear \uicontrol {Use global settings} to select the tests to handle
for the project.
\li To automatically run all or selected tests after successfully
building the current project, select \uicontrol All or
\uicontrol Selected in \uicontrol {Automatically run tests after build}.
\li To apply path filters before scanning for tests, select
\uicontrol {Limit Files to Path Patterns}.
\li Select \uicontrol Add to add the filters as wildcard expressions.
\endlist
To remove the selected filter, select \uicontrol Remove.
\sa {Test}{How To: Test}, {Test Results}, {Testing}
*/

View File

@@ -8,7 +8,7 @@
"Vendor" : "MyCompany",
"Copyright" : "(C) MyCompany",
"License" : "Put short license information here",
"Description" : "Put a short description of your plugin here",
"Description" : "Put a short description of your plugin here.",
"Url" : "https://www.mycompany.com",
//! [2]
//! [3]

View File

@@ -479,7 +479,7 @@ class Dumper(DumperBase):
else:
val = self.Value(self)
val.laddress = value.pointer()
val.typeid = self.typeid_for_string(value.type.targetName)
val.typeid = self.type_target(value.typeid)
val.nativeValue = value.nativeValue
return val
@@ -501,293 +501,8 @@ class Dumper(DumperBase):
res = self.nativeParseAndEvaluate(symbolName)
return None if res is None else res.address()
def putItem(self, value: DumperBase.Value):
typeobj = value.type # unqualified()
typeName = typeobj.name
if not value.lIsInScope:
self.putSpecialValue('optimizedout')
#self.putType(typeobj)
#self.putSpecialValue('outofscope')
self.putNumChild(0)
return
if not isinstance(value, self.Value):
raise RuntimeError('WRONG TYPE IN putItem: %s' % type(self.Value))
# Try on possibly typedefed type first.
if self.tryPutPrettyItem(typeName, value):
if typeobj.code == TypeCode.Pointer:
self.putOriginalAddress(value.address())
else:
self.putAddress(value.address())
return
if typeobj.code == TypeCode.Pointer:
self.putFormattedPointer(value)
return
self.putAddress(value.address())
if typeobj.code == TypeCode.Function:
#DumperBase.warn('FUNCTION VALUE: %s' % value)
self.putType(typeobj)
self.putSymbolValue(value.pointer())
self.putNumChild(0)
return
if typeobj.code == TypeCode.Enum:
#DumperBase.warn('ENUM VALUE: %s' % value.stringify())
self.putType(typeobj.name)
self.putValue(value.display())
self.putNumChild(0)
return
if typeobj.code == TypeCode.Array:
#DumperBase.warn('ARRAY VALUE: %s' % value)
self.putCStyleArray(value)
return
if typeobj.code == TypeCode.Integral:
#DumperBase.warn('INTEGER: %s %s' % (value.name, value))
val = value.value()
self.putNumChild(0)
self.putValue(val)
self.putType(typeName)
return
if typeobj.code == TypeCode.Float:
#DumperBase.warn('FLOAT VALUE: %s' % value)
self.putValue(value.value())
self.putNumChild(0)
self.putType(typeobj.name)
return
if typeobj.code in (TypeCode.Reference, TypeCode.RValueReference):
#DumperBase.warn('REFERENCE VALUE: %s' % value)
val = value.dereference()
if val.laddress != 0:
self.putItem(val)
else:
self.putSpecialValue('nullreference')
self.putBetterType(typeName)
return
if typeobj.code == TypeCode.Complex:
self.putType(typeobj)
self.putValue(value.display())
self.putNumChild(0)
return
self.putType(typeName)
if value.summary is not None and self.useFancy:
self.putValue(self.hexencode(value.summary), 'utf8:1:0')
self.putNumChild(0)
return
self.putExpandable()
self.putEmptyValue()
#DumperBase.warn('STRUCT GUTS: %s ADDRESS: 0x%x ' % (value.name, value.address()))
if self.showQObjectNames:
#with self.timer(self.currentIName):
self.putQObjectNameValue(value)
if self.isExpanded():
self.putField('sortable', 1)
with Children(self):
baseIndex = 0
for item in self.listValueChildren(value):
if item.name.startswith('__vfptr'):
with SubItem(self, '[vptr]'):
# int (**)(void)
self.putType(' ')
self.putSortGroup(20)
self.putValue(item.name)
n = 100
if self.isExpanded():
with Children(self):
n = self.putVTableChildren(item, n)
self.putNumChild(n)
continue
if item.isBaseClass:
baseIndex += 1
# We cannot use nativeField.name as part of the iname as
# it might contain spaces and other strange characters.
with UnnamedSubItem(self, "@%d" % baseIndex):
self.putField('iname', self.currentIName)
self.putField('name', '[%s]' % item.name)
self.putSortGroup(1000 - baseIndex)
self.putAddress(item.address())
self.putItem(item)
continue
with SubItem(self, item.name):
self.putItem(item)
if self.showQObjectNames:
self.tryPutQObjectGuts(value)
def putCStyleArray(self, value: DumperBase.Value):
arrayType = value.type
innerType = arrayType.target()
address = value.address()
if address:
self.putValue('@0x%x' % address, priority=-1)
else:
self.putEmptyValue()
self.putType(arrayType)
displayFormat = self.currentItemFormat()
arrayByteSize = arrayType.size()
n = self.arrayItemCountFromTypeName(value.type.name, 100)
p = value.address()
if displayFormat != DisplayFormat.Raw and p:
if innerType.name.strip() in (
'char',
'int8_t',
'qint8',
'wchar_t',
'unsigned char',
'uint8_t',
'quint8',
'signed char',
'CHAR',
'WCHAR',
'char8_t',
'char16_t',
'char32_t'
):
self.putCharArrayHelper(p, n, innerType, self.currentItemFormat(),
makeExpandable=False)
else:
self.tryPutSimpleFormattedPointer(p, arrayType, innerType,
displayFormat, arrayByteSize)
self.putNumChild(n)
if self.isExpanded():
if n > 100:
addrStep = innerType.size()
with Children(self, n, innerType, addrBase=address, addrStep=addrStep):
for i in self.childRange():
self.putSubItem(i, self.createValue(address + i * addrStep, innerType))
else:
with Children(self):
n = 0
for item in self.listValueChildren(value):
with SubItem(self, n):
n += 1
self.putItem(item)
def putArrayData(self, base, n, innerType, childNumChild=None):
self.checkIntType(base)
self.checkIntType(n)
addrBase = base
innerType = self.createType(innerType)
innerSize = innerType.size()
self.putNumChild(n)
#DumperBase.warn('ADDRESS: 0x%x INNERSIZE: %s INNERTYPE: %s' % (addrBase, innerSize, innerType))
enc = self.type_encoding_cache.get(innerType.typeid, None)
maxNumChild = self.maxArrayCount()
if enc:
self.put('childtype="%s",' % innerType.name)
self.put('addrbase="0x%x",' % addrBase)
self.put('addrstep="0x%x",' % innerSize)
self.put('arrayencoding="%s",' % enc)
self.put('endian="%s",' % self.packCode)
if n > maxNumChild:
self.put('childrenelided="%s",' % n)
n = maxNumChild
self.put('arraydata="')
self.put(self.readMemory(addrBase, n * innerSize))
self.put('",')
else:
with Children(self, n, innerType, childNumChild, maxNumChild,
addrBase=addrBase, addrStep=innerSize):
for i in self.childRange():
self.putSubItem(i, self.createValue(addrBase + i * innerSize, innerType))
def tryPutSimpleFormattedPointer(self, ptr, typeName, innerType, displayFormat, limit):
if isinstance(innerType, self.Type):
innerType = innerType.name
if displayFormat == DisplayFormat.Automatic:
if innerType in ('char', 'signed char', 'unsigned char', 'uint8_t', 'CHAR'):
# Use UTF-8 as default for char *.
self.putType(typeName)
(length, shown, data) = self.readToFirstZero(ptr, 1, limit)
self.putValue(data, 'utf8', length=length)
if self.isExpanded():
self.putArrayData(ptr, shown, innerType)
return True
if innerType in ('wchar_t', 'WCHAR'):
self.putType(typeName)
(length, data) = self.encodeCArray(ptr, 2, limit)
self.putValue(data, 'utf16', length=length)
return True
if displayFormat == DisplayFormat.Latin1String:
self.putType(typeName)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'latin1', length=length)
return True
if displayFormat == DisplayFormat.SeparateLatin1String:
self.putType(typeName)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'latin1', length=length)
self.putDisplay('latin1:separate', data)
return True
if displayFormat == DisplayFormat.Utf8String:
self.putType(typeName)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'utf8', length=length)
return True
if displayFormat == DisplayFormat.SeparateUtf8String:
self.putType(typeName)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'utf8', length=length)
self.putDisplay('utf8:separate', data)
return True
if displayFormat == DisplayFormat.Local8BitString:
self.putType(typeName)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'local8bit', length=length)
return True
if displayFormat == DisplayFormat.Utf16String:
self.putType(typeName)
(length, data) = self.encodeCArray(ptr, 2, limit)
self.putValue(data, 'utf16', length=length)
return True
if displayFormat == DisplayFormat.Ucs4String:
self.putType(typeName)
(length, data) = self.encodeCArray(ptr, 4, limit)
self.putValue(data, 'ucs4', length=length)
return True
return False
def putDerefedPointer(self, value):
derefValue = value.dereference()
savedCurrentChildType = self.currentChildType
self.currentChildType = value.type.targetName
self.putType(value.type.targetName)
derefValue.name = '*'
derefValue.autoDerefCount = value.autoDerefCount + 1
if derefValue.type.code == TypeCode.Pointer:
self.putField('autoderefcount', '{}'.format(derefValue.autoDerefCount))
self.putItem(derefValue)
self.currentChildType = savedCurrentChildType
def wantQObjectNames(self):
return self.showQObjectNames and self.qtCoreModuleName() is not None
def fetchInternalFunctions(self):
coreModuleName = self.qtCoreModuleName()

View File

@@ -1305,14 +1305,17 @@ class DumperBase():
displayFormat = self.currentItemFormat()
arrayByteSize = arrayType.size()
n = self.arrayItemCountFromTypeName(value.type.name, 100)
if arrayByteSize == 0:
# This should not happen. But it does, see QTCREATORBUG-14755.
# GDB/GCC produce sizeof == 0 for QProcess arr[3]
# And in the Nim string dumper.
itemCount = self.arrayItemCountFromTypeName(value.type.name, 100)
arrayByteSize = int(itemCount) * innerType.size()
arrayByteSize = n * innerType.size()
elif not self.isCdb:
# Do not check the inner type size for cdb since this requires a potentially expensive
# type lookup
n = arrayByteSize // innerType.size()
p = value.address()
if displayFormat != DisplayFormat.Raw and p:
if innerType.name in (
@@ -1428,8 +1431,9 @@ class DumperBase():
# This is shared by pointer and array formatting.
def tryPutSimpleFormattedPointer(self, ptr, typename, innerType, displayFormat, limit):
if displayFormat == DisplayFormat.Automatic:
if self.isCdb or innerType.code is not TypeCode.Typedef:
targetType = innerType
if innerType.code == TypeCode.Typedef:
else:
targetType = innerType.target()
if targetType.name in ('char', 'signed char', 'unsigned char', 'uint8_t', 'CHAR'):
@@ -3407,13 +3411,6 @@ typename))
def target(self):
return self.dumper.Type(self.dumper, self.dumper.type_target(self.typeid))
@property
def targetName(self):
target = self.target()
if target is None:
return ''
return target if isinstance(target, str) else target.name
@property
def moduleName(self):
return self.dumper.type_modulename_cache.get(self.typeid, None)

View File

@@ -1132,10 +1132,6 @@ qint64 ConPtyProcess::write(const QByteArray &byteArray)
bool ConPtyProcess::isAvailable()
{
#ifdef TOO_OLD_WINSDK
return false; //very importnant! ConPty can be built, but it doesn't work if built with old sdk and Win10 < 1903
#endif
qint32 buildNumber = QSysInfo::kernelVersion().split(".").last().toInt();
if (buildNumber < CONPTY_MINIMAL_WINDOWS_VERSION)
return false;

View File

@@ -20,7 +20,6 @@
typedef VOID* HPCON;
#define TOO_OLD_WINSDK
#endif
class QWinEventNotifier;

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Device Support",
"Description" : "Develop applications for Android devices",
"Description" : "Develop applications for Android devices.",
"LongDescription" : [
"Connect devices with USB to run, debug, and analyze applications built for them.",
"You also need:",

View File

@@ -14,7 +14,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Visualize CPU and Memory consumption for running applications",
"Description" : "Visualize CPU and Memory consumption for running applications.",
"LongDescription" : [
"Select an application to monitor its performance in real-time."
],

View File

@@ -12,7 +12,7 @@
"",
"Alternatively, this file may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this file. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Create code based tests and build system based tests",
"Description" : "Create code based tests and build system based tests.",
"LongDescription" : [
"Code based testing offers special handling for particular testing frameworks that strongly ties to the underlying code models or specialized parsers.",
"Build system based testing is independent from any testing frameworks. It retrieves information directly from the underlying build system and uses it or even the build system as such to execute the respective tests."

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Build Systems",
"Description" : "Open Autotools-based projects in Qt Creator",
"Description" : "Open Autotools-based projects in Qt Creator.",
"LongDescription" : [
"You also need:",
"- Autotools",

View File

@@ -15,7 +15,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Code Analyzer",
"Description" : "Access an Axivion dashboard server",
"Description" : "Access an Axivion dashboard server.",
"LongDescription" : [
"Protect software from erosion with static code analysis, architecture analysis, and code-smells-detection."
],

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Device Support",
"Description" : "Develop applications for bare metal devices",
"Description" : "Develop applications for bare metal devices.",
"LongDescription" : [
"Adds a target for bare metal development.",
"Connect devices with debug server providers to run, debug, and analyze applications built for them.",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Version Control",
"Description" : "Access the Bazaar version control system",
"Description" : "Access the Bazaar version control system.",
"LongDescription" : [
"You also need:",
"- Bazaar"

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "C++",
"Description" : "Apply indentation and style to source code files",
"Description" : "Apply indentation and style to source code files.",
"LongDescription" : [
"You also need one of the following tools:",
"- Artistic Style",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Creator",
"Description" : "Edit binary files",
"Description" : "Edit binary files.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}

View File

@@ -15,7 +15,7 @@
],
"Category" : "Device Support",
"Description" : "Develop applications for Boot to Qt devices",
"Description" : "Develop applications for Boot to Qt devices.",
"LongDescription" : [
"Connect devices with a USB cable, or a wired or wireless connection, depending on the device to run, debug, and analyze applications built for them.",
"You also need:",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "C++",
"Description" : "Use Clang code model instead of the built-in code model",
"Description" : "Use Clang code model instead of the built-in code model.",
"LongDescription" : [
"The code model is the part of an IDE that understands the programming language you are using to write your application. With it, Qt Creator can help you code faster and avoid errors."
],

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "C++",
"Description" : "Indent and format C++ code",
"Description" : "Indent and format C++ code.",
"LongDescription" : [
"ClangFormat is an alternative for the built-in indenter."
],

View File

@@ -13,7 +13,7 @@
"Alternatively, this file may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this file. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Code Analyzer",
"Description" : "Find problems in C, C++, and Objective-C source code",
"Description" : "Find problems in C, C++, and Objective-C source code.",
"LongDescription" : [
"Use Clang Tools for static code analysis:",
"- Clang-Tidy has diagnostics and fixes for typical programming errors, such as style violations or interface misuse.",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "C++",
"Description" : "View the class hierarchy of currently open projects",
"Description" : "View the class hierarchy of currently open projects.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}

View File

@@ -15,7 +15,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Version Control",
"Description" : "Access an IBM Rational ClearCase server",
"Description" : "Access an IBM Rational ClearCase server.",
"LongDescription" : [
"You also need:",
"- ClearCase"

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Build Systems",
"Description" : "Automate the configuration of build systems with CMake",
"Description" : "Automate the configuration of build systems with CMake.",
"LongDescription" : [
"CMake controls the software compilation process by using simple configuration files, called CMakeLists.txt files.",
"You also need:",

View File

@@ -158,6 +158,7 @@ private:
QPushButton *m_batchEditButton = nullptr;
QPushButton *m_kitConfiguration = nullptr;
CMakeConfig m_configurationChanges;
};
static QModelIndex mapToSource(const QAbstractItemView *view, const QModelIndex &idx)
@@ -416,6 +417,11 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
updateButtonState();
m_showProgressTimer.stop();
m_progressIndicator->hide();
if (!m_configurationChanges.isEmpty()) {
m_configModel->setBatchEditConfiguration(m_configurationChanges);
m_configurationChanges.clear();
}
updateConfigurationStateSelection();
});
@@ -502,8 +508,9 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
connect(bs, &CMakeBuildSystem::warningOccurred,
this, &CMakeBuildSettingsWidget::setWarning);
connect(bs, &CMakeBuildSystem::configurationChanged,
m_configModel, &ConfigModel::setBatchEditConfiguration);
connect(bs, &CMakeBuildSystem::configurationChanged, this, [this](const CMakeConfig &config) {
m_configurationChanges = config;
});
updateFromKit();
connect(m_buildConfig->target(), &Target::kitChanged,

View File

@@ -1488,6 +1488,11 @@ void CMakeBuildSystem::updateFallbackProjectData()
Tr::tr("Scan \"%1\" project tree")
.arg(project()->displayName()),
"CMake.Scan.Tree");
// A failed configuration could be the result of an compiler update
// which then would cause CMake to fail. Make sure to offer an upgrade path
// to the new Kit compiler values.
updateInitialCMakeExpandableVars();
}
void CMakeBuildSystem::updateCMakeConfiguration(QString &errorMessage)
@@ -2323,6 +2328,18 @@ void CMakeBuildSystem::updateInitialCMakeExpandableVars()
}
}
// Handle MSVC C/C++ compiler update, by udating also the linker, otherwise projects
// will fail to compile by using a linker that doesn't exist
const FilePath cxxCompiler = config.filePathValueOf("CMAKE_CXX_COMPILER");
if (!cxxCompiler.isEmpty() && cxxCompiler.fileName() == "cl.exe") {
const FilePath linker = cm.filePathValueOf("CMAKE_LINKER");
if (!linker.exists())
config << CMakeConfigItem(
"CMAKE_LINKER",
CMakeConfigItem::FILEPATH,
cxxCompiler.parentDir().pathAppended(linker.fileName()).path().toUtf8());
}
if (!config.isEmpty())
emit configurationChanged(config);
}

View File

@@ -97,6 +97,7 @@ public:
private:
QVariant defaultValue(const Kit *k) const;
bool isNinjaPresent(const Kit *k, const CMakeTool *tool) const;
};
class CMakeConfigurationKitAspectFactory : public KitAspectFactory
@@ -556,6 +557,17 @@ CMakeGeneratorKitAspectFactory::CMakeGeneratorKitAspectFactory()
setDescription(Tr::tr("CMake generator defines how a project is built when using CMake.<br>"
"This setting is ignored when using other build systems."));
setPriority(19000);
auto updateKits = [this] {
if (KitManager::isLoaded()) {
for (Kit *k : KitManager::kits())
fix(k);
}
};
//make sure the default value is set if a new default CMake is set
connect(CMakeToolManager::instance(), &CMakeToolManager::defaultCMakeChanged,
this, updateKits);
}
QString CMakeGeneratorKitAspect::generator(const Kit *k)
@@ -664,18 +676,7 @@ QVariant CMakeGeneratorKitAspectFactory::defaultValue(const Kit *k) const
return g.matches("Ninja");
});
if (it != known.constEnd()) {
const bool hasNinja = [k, tool] {
if (Internal::settings(nullptr).ninjaPath().isEmpty()) {
auto findNinja = [](const Environment &env) -> bool {
return !env.searchInPath("ninja").isEmpty();
};
if (!findNinja(tool->filePath().deviceEnvironment()))
return findNinja(k->buildEnvironment());
}
return true;
}();
if (hasNinja)
if (isNinjaPresent(k, tool))
return GeneratorInfo("Ninja").toVariant();
}
@@ -725,6 +726,18 @@ QVariant CMakeGeneratorKitAspectFactory::defaultValue(const Kit *k) const
return GeneratorInfo(it->name).toVariant();
}
bool CMakeGeneratorKitAspectFactory::isNinjaPresent(const Kit *k, const CMakeTool *tool) const
{
if (Internal::settings(nullptr).ninjaPath().isEmpty()) {
auto findNinja = [](const Environment &env) -> bool {
return !env.searchInPath("ninja").isEmpty();
};
if (!findNinja(tool->filePath().deviceEnvironment()))
return findNinja(k->buildEnvironment());
}
return true;
}
Tasks CMakeGeneratorKitAspectFactory::validate(const Kit *k) const
{
CMakeTool *tool = CMakeKitAspect::cmakeTool(k);
@@ -783,7 +796,7 @@ void CMakeGeneratorKitAspectFactory::fix(Kit *k)
[info](const CMakeTool::Generator &g) {
return g.matches(info.generator);
});
if (it == known.constEnd()) {
if (it == known.constEnd() || (info.generator == "Ninja" && !isNinjaPresent(k, tool))) {
GeneratorInfo dv;
dv.fromVariant(defaultValue(k));
setGeneratorInfo(k, dv);

View File

@@ -13,7 +13,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Access the Coco CoverageBrowser",
"Description" : "Access the Coco CoverageBrowser.",
"LongDescription" : [
"View the results from the Coco CoverageBrowser to make tests more efficient and complete."
],

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Build Systems",
"Description" : "Open compilation databases as projects",
"Description" : "Open compilation databases as projects.",
"LongDescription" : [
"The JSON compilation database format replays single builds independently of the build system.",
"A compilation database is a list of files and the compiler flags that are used to compile the files. It feeds the code model with the necessary information for correctly parsing the code when you open a file for editing.",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Experimental" : true,
"Description" : "Integrate C or C++ libraries into projects",
"Description" : "Integrate C or C++ libraries into projects.",
"LongDescription" : [
"You also need:",
"- Conan"

View File

@@ -13,7 +13,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "View suggestions from GitHub Copilot in code editor",
"Description" : "View suggestions from GitHub Copilot in code editor.",
"LongDescription" : [
"You also need:",
"- An active GitHub Copilot subscription",

View File

@@ -12,7 +12,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Access code-pasting services",
"Description" : "Access code-pasting services.",
"LongDescription" : [
"Paste snippets of text, such as code or diffs, to a server or fetch them from the server."
],

View File

@@ -14,7 +14,7 @@
"Alternatively, this file may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this file. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Code Analyzer",
"Description" : "Find errors in C++ code with static analysis",
"Description" : "Find errors in C++ code with static analysis.",
"LongDescription" : [
"You also need:",
"- cppcheck"

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "C++",
"Description" : "Edit C++ source and header files",
"Description" : "Edit C++ source and header files.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES},

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Code Analyzer",
"Description" : "View Chrome Trace Format (CTF) files",
"Description" : "View Chrome Trace Format (CTF) files.",
"LongDescription" : [
"You also need:",
"- CTF files (in Trace Event Format)"

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Version Control",
"Description" : "Access the CVS open source version control system",
"Description" : "Access the CVS open source version control system.",
"LongDescription" : [],
"DisabledByDefault" : true,
"Url" : "https://www.qt.io",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Creator",
"Description" : "Debug applications with native debuggers",
"Description" : "Debug applications with native debuggers.",
"LongDescription" : [
"Debug an application to see what happens inside it while it runs or when it crashes.",
"The debugger extension acts as an interface between the Qt Creator core and native debuggers.",

View File

@@ -125,6 +125,9 @@ public:
// Used by Valgrind
QStringList expectedSignals;
// For QNX debugging
bool useCtrlCStub = false;
// Used by Android to avoid false positives on warnOnRelease
bool skipExecutableValidation = false;
bool useTargetAsync = false;

View File

@@ -276,6 +276,11 @@ void DebuggerRunTool::setSkipExecutableValidation(bool on)
m_runParameters.skipExecutableValidation = on;
}
void DebuggerRunTool::setUseCtrlCStub(bool on)
{
m_runParameters.useCtrlCStub = on;
}
void DebuggerRunTool::setBreakOnMain(bool on)
{
m_runParameters.breakOnMain = on;

View File

@@ -100,6 +100,7 @@ protected:
void setRemoteChannel(const QUrl &url);
void setUseTargetAsync(bool on);
void setSkipExecutableValidation(bool on);
void setUseCtrlCStub(bool on);
void setIosPlatform(const QString &platform);
void setDeviceSymbolsRoot(const QString &deviceSymbolsRoot);

View File

@@ -126,7 +126,6 @@ const char notCompatibleMessage[] = "is not compatible with target architecture"
GdbEngine::GdbEngine()
{
m_gdbProc.setProcessMode(ProcessMode::Writer);
m_gdbProc.setUseCtrlCStub(true);
setObjectName("GdbEngine");
setDebuggerName("GDB");
@@ -471,7 +470,7 @@ void GdbEngine::handleAsyncOutput(const QStringView asyncClass, const GdbMi &res
Module module;
module.startAddress = 0;
module.endAddress = 0;
module.hostPath = Utils::FilePath::fromString(result["host-name"].data());
module.hostPath = Utils::FilePath::fromUserInput(result["host-name"].data());
const QString target = result["target-name"].data();
module.modulePath = runParameters().inferior.command.executable().withNewPath(target);
module.moduleName = module.hostPath.baseName();
@@ -676,9 +675,30 @@ void GdbEngine::interruptInferior()
} else {
showStatusMessage(Tr::tr("Stop requested..."), 5000);
showMessage("TRYING TO INTERRUPT INFERIOR");
// Ctrl+C events are only handled properly for console applications on Windows
// when gdb debugs a GUI application the CTRL+C events are not handled
if (HostOsInfo::isWindowsHost() && !m_isQnxGdb) {
IDevice::ConstPtr dev = device();
QTC_ASSERT(dev, notifyInferiorStopFailed(); return);
DeviceProcessSignalOperation::Ptr signalOperation = dev->signalOperation();
QTC_ASSERT(signalOperation, notifyInferiorStopFailed(); return);
connect(signalOperation.get(), &DeviceProcessSignalOperation::finished,
this, [this, signalOperation](const QString &error) {
if (error.isEmpty()) {
showMessage("Interrupted " + QString::number(inferiorPid()));
notifyInferiorStopOk();
} else {
showMessage(error, LogError);
notifyInferiorStopFailed();
}
});
signalOperation->setDebuggerCommand(runParameters().debugger.command.executable());
signalOperation->interruptProcess(inferiorPid());
} else {
interruptInferior2();
}
}
}
void GdbEngine::runCommand(const DebuggerCommand &command)
{
@@ -1249,11 +1269,9 @@ void GdbEngine::handleStopResponse(const GdbMi &data)
handleStop1(data);
}
static QStringList stopSignals(const Abi &abi)
static QString stopSignal(const Abi &abi)
{
static QStringList winSignals = { "SIGTRAP", "SIGINT" };
static QStringList unixSignals = { "SIGINT" };
return abi.os() == Abi::WindowsOS ? winSignals : unixSignals;
return QLatin1String(abi.os() == Abi::WindowsOS ? "SIGTRAP" : "SIGINT");
}
void GdbEngine::handleStop1(const GdbMi &data)
@@ -1402,7 +1420,7 @@ void GdbEngine::handleStop2(const GdbMi &data)
QString meaning = data["signal-meaning"].data();
// Ignore these as they are showing up regularly when
// stopping debugging.
if (stopSignals(rp.toolChainAbi).contains(name) || rp.expectedSignals.contains(name)) {
if (name == stopSignal(rp.toolChainAbi) || rp.expectedSignals.contains(name)) {
showMessage(name + " CONSIDERED HARMLESS. CONTINUING.");
} else if (m_isQnxGdb && name == "0" && meaning == "Signal 0") {
showMessage("SIGNAL 0 CONSIDERED BOGUS.");
@@ -3807,6 +3825,9 @@ void GdbEngine::setupEngine()
CHECK_STATE(EngineSetupRequested);
showMessage("TRYING TO START ADAPTER");
if (isRemoteEngine())
m_gdbProc.setUseCtrlCStub(runParameters().useCtrlCStub); // This is only set for QNX
const DebuggerRunParameters &rp = runParameters();
CommandLine gdbCommand = rp.debugger.command;
@@ -4301,6 +4322,7 @@ void GdbEngine::interruptLocalInferior(qint64 pid)
showMessage("TRYING TO INTERRUPT INFERIOR BEFORE PID WAS OBTAINED", LogError);
return;
}
QString errorMessage;
if (runParameters().runAsRoot) {
Environment env = Environment::systemEnvironment();
RunControl::provideAskPassEntry(env);
@@ -4309,8 +4331,11 @@ void GdbEngine::interruptLocalInferior(qint64 pid)
proc.setEnvironment(env);
proc.start();
proc.waitForFinished();
} else if (interruptProcess(pid, &errorMessage)) {
showMessage("Interrupted " + QString::number(pid));
} else {
m_gdbProc.interrupt();
showMessage(errorMessage, LogError);
notifyInferiorStopFailed();
}
}

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Creator",
"Description" : "Design Qt-widgets based UIs",
"Description" : "Design Qt-widgets based UIs.",
"LongDescription" : [
"Create widgets and forms that are integrated with Qt C++ code."
],

View File

@@ -12,7 +12,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Compare two files or two versions of a file",
"Description" : "Compare two files or two versions of a file.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Experimental" : true,
"Description" : "Create Docker devices from Docker images",
"Description" : "Create Docker devices from Docker images.",
"LongDescription" : [
"You also need:",
"- Docker CLI"

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Core",
"Description" : "Extension Manager",
"Description" : "Manage ${IDE_DISPLAY_NAME} extensions.",
"Experimental": true,
"DisabledByDefault": false,
"Url" : "https://www.qt.io",

View File

@@ -4,6 +4,7 @@ QtcPlugin {
name: "ExtensionManager"
Depends { name: "Core" }
Depends { name: "Spinner" }
Depends { name: "Tasking" }
Depends { name: "Qt.network" }

View File

@@ -53,6 +53,8 @@ using namespace WelcomePageHelpers;
namespace ExtensionManager::Internal {
Q_LOGGING_CATEGORY(widgetLog, "qtc.extensionmanager.widget", QtWarningMsg)
constexpr TextFormat h5TF
{Theme::Token_Text_Default, UiElement::UiElementH5};
constexpr TextFormat h6TF
@@ -111,7 +113,6 @@ private:
class HeadingWidget : public QWidget
{
static constexpr QSize iconBgS{68, 68};
static constexpr int dividerH = 16;
Q_OBJECT
@@ -121,7 +122,7 @@ public:
: QWidget(parent)
{
m_icon = new QLabel;
m_icon->setFixedSize(iconBgS);
m_icon->setFixedSize(iconBgSizeBig);
static const TextFormat titleTF
{Theme::Token_Text_Default, UiElementH4};
@@ -198,7 +199,7 @@ public:
if (!current.isValid())
return;
m_icon->setPixmap(icon(current));
m_icon->setPixmap(itemIcon(current, SizeBig));
const QString name = current.data(RoleName).toString();
m_title->setText(name);
@@ -234,32 +235,6 @@ signals:
void vendorClicked(const QString &vendor);
private:
static QPixmap icon(const QModelIndex &index)
{
const qreal dpr = qApp->devicePixelRatio();
QPixmap pixmap(iconBgS * dpr);
pixmap.fill(Qt::transparent);
pixmap.setDevicePixelRatio(dpr);
const QRect bgR(QPoint(), pixmap.deviceIndependentSize().toSize());
QPainter p(&pixmap);
QLinearGradient gradient(bgR.topRight(), bgR.bottomLeft());
gradient.setStops(iconGradientStops(index));
constexpr int iconRectRounding = 4;
WelcomePageHelpers::drawCardBackground(&p, bgR, gradient, Qt::NoPen, iconRectRounding);
// Icon
constexpr Theme::Color color = Theme::Token_Basic_White;
static const QIcon pack = Icon({{":/extensionmanager/images/packbig.png", color}},
Icon::Tint).icon();
static const QIcon extension = Icon({{":/extensionmanager/images/extensionbig.png",
color}}, Icon::Tint).icon();
const ItemType itemType = index.data(RoleItemType).value<ItemType>();
(itemType == ItemTypePack ? pack : extension).paint(&p, bgR);
return pixmap;
}
QLabel *m_icon;
QLabel *m_title;
Button *m_vendor;
@@ -735,8 +710,10 @@ void ExtensionManagerWidget::fetchAndDisplayImage(const QUrl &url)
storage->url = url;
query.setRequest(QNetworkRequest(url));
query.setNetworkAccessManager(NetworkAccessManager::instance());
qCDebug(widgetLog).noquote() << "Sending image request:" << url.toDisplayString();
};
const auto onFetchDone = [storage](const NetworkQuery &query, DoneWith result) {
qCDebug(widgetLog) << "Got image QNetworkReply:" << query.reply()->error();
if (result == DoneWith::Success)
storage->imageData = query.reply()->readAll();
};
@@ -745,6 +722,9 @@ void ExtensionManagerWidget::fetchAndDisplayImage(const QUrl &url)
if (storage->imageData.isEmpty())
return;
m_imageDataBuffer.setData(storage->imageData);
qCDebug(widgetLog).noquote() << "Image reponse size:"
<< QLocale::system().formattedDataSize(
m_imageDataBuffer.size());
if (!m_imageDataBuffer.open(QIODevice::ReadOnly))
return;
QImageReader reader(&m_imageDataBuffer);
@@ -756,6 +736,8 @@ void ExtensionManagerWidget::fetchAndDisplayImage(const QUrl &url)
const QPixmap pixmap = QPixmap::fromImage(reader.read());
m_image->setPixmap(pixmap);
}
qCDebug(widgetLog) << "Image dimensions:" << reader.size();
qCDebug(widgetLog) << "Image is animated:" << animated;
};
Group group{

View File

@@ -34,6 +34,7 @@
#include <utils/networkaccessmanager.h>
#include <utils/stylehelper.h>
#include <QApplication>
#include <QItemDelegate>
#include <QLabel>
#include <QListView>
@@ -61,7 +62,6 @@ class ExtensionItemDelegate : public QItemDelegate
{
public:
constexpr static QSize dividerS{1, 16};
constexpr static QSize iconBgS{50, 50};
constexpr static TextFormat itemNameTF
{Theme::Token_Text_Default, UiElement::UiElementH6};
constexpr static TextFormat countTF
@@ -102,15 +102,15 @@ public:
const QRect bgRGlobal = option.rect.adjusted(0, 0, -gapSize, -gapSize);
const QRect bgR = bgRGlobal.translated(-option.rect.topLeft());
const int middleColumnW = bgR.width() - ExPaddingGapL - iconBgS.width() - ExPaddingGapL
- ExPaddingGapL;
const int middleColumnW = bgR.width() - ExPaddingGapL - iconBgSizeSmall.width()
- ExPaddingGapL - ExPaddingGapL;
int x = bgR.x();
int y = bgR.y();
x += ExPaddingGapL;
const QRect iconBgR(x, y + (bgR.height() - iconBgS.height()) / 2,
iconBgS.width(), iconBgS.height());
x += iconBgS.width() + ExPaddingGapL;
const QRect iconBgR(x, y + (bgR.height() - iconBgSizeSmall.height()) / 2,
iconBgSizeSmall.width(), iconBgSizeSmall.height());
x += iconBgSizeSmall.width() + ExPaddingGapL;
y += ExPaddingGapL;
const QRect itemNameR(x, y, middleColumnW, itemNameTF.lineHeight());
const QString itemName = index.data().toString();
@@ -142,18 +142,8 @@ public:
WelcomePageHelpers::drawCardBackground(painter, bgR, fillColor, strokeColor);
}
{
QLinearGradient gradient(iconBgR.topRight(), iconBgR.bottomLeft());
gradient.setStops(iconGradientStops(index));
constexpr int iconRectRounding = 4;
drawCardBackground(painter, iconBgR, gradient, Qt::NoPen, iconRectRounding);
// Icon
constexpr Theme::Color color = Theme::Token_Basic_White;
static const QIcon pack = Icon({{":/extensionmanager/images/packsmall.png", color}},
Icon::Tint).icon();
static const QIcon extension = Icon({{":/extensionmanager/images/extensionsmall.png",
color}}, Icon::Tint).icon();
(isPack ? pack : extension).paint(painter, iconBgR);
const QPixmap icon = itemIcon(index, SizeSmall);
painter->drawPixmap(iconBgR.topLeft(), icon);
}
if (isPack) {
constexpr int circleSize = 18;
@@ -241,7 +231,7 @@ public:
+ tagsTF.lineHeight();
const int height =
ExPaddingGapL
+ qMax(iconBgS.height(), middleColumnH)
+ qMax(iconBgSizeSmall.height(), middleColumnH)
+ ExPaddingGapL;
return {cellWidth, height + gapSize};
}
@@ -341,6 +331,7 @@ ExtensionsBrowser::ExtensionsBrowser(QWidget *parent)
Theme::Token_Background_Default);
d->m_spinner = new SpinnerSolution::Spinner(SpinnerSolution::SpinnerSize::Large, this);
d->m_spinner->hide();
auto updateModel = [this] {
d->filterProxyModel->sort(0);
@@ -417,18 +408,20 @@ void ExtensionsBrowser::fetchExtensions()
= R"({"version":"%1","host_os":"%2","host_os_version":"%3","host_architecture":"%4","page_size":200})";
const QString request = url.arg(host) + requestTemplate
.arg(QCoreApplication::applicationVersion())
.arg(QSysInfo::productType())
.arg(osTypeToString(HostOsInfo::hostOs()))
.arg(QSysInfo::productVersion())
.arg(QSysInfo::currentCpuArchitecture());
query.setRequest(QNetworkRequest(QUrl::fromUserInput(request)));
query.setNetworkAccessManager(NetworkAccessManager::instance());
qCDebug(browserLog).noquote() << "Sending request:" << request;
qCDebug(browserLog).noquote() << "Sending JSON request:" << request;
d->m_spinner->show();
};
const auto onQueryDone = [this](const NetworkQuery &query, DoneWith result) {
const QByteArray response = query.reply()->readAll();
qCDebug(browserLog).noquote() << "Got result" << result;
qCDebug(browserLog).noquote() << "Got JSON QNetworkReply:" << query.reply()->error();
if (result == DoneWith::Success) {
qCDebug(browserLog).noquote() << "JSON response size:"
<< QLocale::system().formattedDataSize(response.size());
d->model->setExtensionsJson(response);
} else {
qCDebug(browserLog).noquote() << response;
@@ -459,20 +452,48 @@ QLabel *tfLabel(const TextFormat &tf, bool singleLine)
return label;
}
QGradientStops iconGradientStops(const QModelIndex &index)
QPixmap itemIcon(const QModelIndex &index, Size size)
{
const PluginSpec *ps = pluginSpecForName(index.data(RoleName).toString());
const bool greenGradient = ps != nullptr && ps->isEffectivelyEnabled();
const QSize iconBgS = size == SizeSmall ? iconBgSizeSmall : iconBgSizeBig;
const qreal dpr = qApp->devicePixelRatio();
QPixmap pixmap(iconBgS * dpr);
pixmap.fill(Qt::transparent);
pixmap.setDevicePixelRatio(dpr);
const QRect iconBgR(QPoint(), pixmap.deviceIndependentSize().toSize());
const QColor startColor = creatorColor(greenGradient ? Theme::Token_Gradient01_Start
: Theme::Token_Gradient02_Start);
const QColor endColor = creatorColor(greenGradient ? Theme::Token_Gradient01_End
: Theme::Token_Gradient02_End);
const QGradientStops gradient = {
{0, startColor},
{1, endColor},
const PluginSpec *ps = pluginSpecForName(index.data(RoleName).toString());
const bool isEnabled = ps == nullptr || ps->isEffectivelyEnabled();
const QGradientStops gradientStops = {
{0, creatorColor(isEnabled ? Theme::Token_Gradient01_Start
: Theme::Token_Gradient02_Start)},
{1, creatorColor(isEnabled ? Theme::Token_Gradient01_End
: Theme::Token_Gradient02_End)},
};
return gradient;
const Theme::Color color = Theme::Token_Basic_White;
static const QIcon packS = Icon({{":/extensionmanager/images/packsmall.png", color}},
Icon::Tint).icon();
static const QIcon packB = Icon({{":/extensionmanager/images/packbig.png", color}},
Icon::Tint).icon();
static const QIcon extensionS = Icon({{":/extensionmanager/images/extensionsmall.png",
color}}, Icon::Tint).icon();
static const QIcon extensionB = Icon({{":/extensionmanager/images/extensionbig.png",
color}}, Icon::Tint).icon();
const ItemType itemType = index.data(RoleItemType).value<ItemType>();
const QIcon &icon = (itemType == ItemTypePack) ? (size == SizeSmall ? packS : packB)
: (size == SizeSmall ? extensionS : extensionB);
const int iconRectRounding = 4;
const qreal iconOpacityDisabled = 0.6;
QPainter p(&pixmap);
QLinearGradient gradient(iconBgR.topRight(), iconBgR.bottomLeft());
gradient.setStops(gradientStops);
WelcomePageHelpers::drawCardBackground(&p, iconBgR, gradient, Qt::NoPen, iconRectRounding);
if (!isEnabled)
p.setOpacity(iconOpacityDisabled);
icon.paint(&p, iconBgR);
return pixmap;
}
} // ExtensionManager::Internal

View File

@@ -40,6 +40,13 @@ private:
};
QLabel *tfLabel(const Core::WelcomePageHelpers::TextFormat &tf, bool singleLine = true);
QGradientStops iconGradientStops(const QModelIndex &index);
constexpr static QSize iconBgSizeSmall{50, 50};
constexpr static QSize iconBgSizeBig{68, 68};
enum Size {
SizeSmall,
SizeBig,
};
QPixmap itemIcon(const QModelIndex &index, Size size);
} // ExtensionManager::Internal

View File

@@ -261,7 +261,7 @@ public:
void ExtensionsModelPrivate::setExtensions(const Extensions &extensions)
{
this->extensions = extensions;
qCDebug(modelLog) << "Number of extensions from json:" << this->extensions.count();
qCDebug(modelLog) << "Number of extensions from JSON:" << this->extensions.count();
addUnlistedLocalExtensions();
qCDebug(modelLog) << "Number of extensions with added local ones:" << this->extensions.count();
}

View File

@@ -12,7 +12,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Run the main editor in a manner similar to the Vim editor",
"Description" : "Run the main editor in a manner similar to the Vim editor.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Version Control",
"Description" : "Access the Fossil version control system",
"Description" : "Access the Fossil version control system.",
"LongDescription" : [
"You also need:",
"- Fossil"

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Version Control",
"Description" : "Access the Git version control system",
"Description" : "Access the Git version control system.",
"LongDescription" : [
"You also need:",
"- Git"

View File

@@ -101,7 +101,7 @@ void GerritPushDialog::initRemoteBranches()
int refBranchIndex = ref.indexOf('/');
qint64 timeT = entries.at(1).left(entries.at(1).indexOf(' ')).toLongLong();
BranchDate bd(ref.mid(refBranchIndex + 1), QDateTime::fromSecsSinceEpoch(timeT).date());
m_remoteBranches.insertMulti(ref.left(refBranchIndex), bd);
m_remoteBranches.insert(ref.left(refBranchIndex), bd);
}
m_remoteComboBox->updateRemotes(false);
}
@@ -339,7 +339,7 @@ void GerritPushDialog::setRemoteBranches(bool includeOld)
const QStringList remoteBranches =
gitClient().synchronousRepositoryBranches(remoteName, m_workingDir);
for (const QString &branch : remoteBranches)
m_remoteBranches.insertMulti(remoteName, {branch, {}});
m_remoteBranches.insert(remoteName, {branch, {}});
if (remoteBranches.isEmpty()) {
m_targetBranchComboBox->setEditable(true);
m_targetBranchComboBox->setToolTip(

View File

@@ -13,7 +13,7 @@
"",
"Alternatively, this file may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this file. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Create connections to GitLab servers",
"Description" : "Create connections to GitLab servers.",
"LongDescription" : [
"You also need:",
"- GitLab account"

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Other Languages",
"Description" : "Create OpenGL fragment and vertex shaders",
"Description" : "Create OpenGL fragment and vertex shaders.",
"LongDescription" : [
"Use the shaders to display hardware-accelerated 3D graphics alongside a more conventional UI."
],

View File

@@ -6,7 +6,7 @@
"Vendor" : "Eike Ziller",
"Copyright" : "(C) Eike Ziller",
"License" : "MIT",
"Description" : "Write source code in the Haskell language",
"Description" : "Write source code in the Haskell language.",
"LongDescription" : [],
"Url" : "https://haskell.org",
${IDE_PLUGIN_DEPENDENCIES},

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Core",
"Description" : "Get help for Qt API and read Qt and other documentation",
"Description" : "Get help for Qt API and read Qt and other documentation.",
"LongDescription" : [
"You also need:",
"- Qt documentation as help files (.qch)"

View File

@@ -12,7 +12,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "View images, and create pixmaps from SVG images",
"Description" : "View images, and create pixmaps from SVG images.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES},

View File

@@ -15,7 +15,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Spend less time on building C++ code",
"Description" : "Spend less time on building C++ code.",
"LongDescription" : [
"You also need:",
"- IncrediBuild Agent"

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Quick",
"Description" : "Collect information about how an application is used",
"Description" : "Collect information about how an application is used.",
"LongDescription" : [
"Use Qt Insight with Qt Design Studio.",
"You also need:",

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Device Support",
"Description" : "Develop applications for iOS devices",
"Description" : "Develop applications for iOS devices.",
"LongDescription" : [
"Connect devices with USB or use the iOS simulator to run, debug, and analyze applications built for iOS.",
"You also need:",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Other Languages",
"Description" : "Get code editing services",
"Description" : "Get code editing services.",
"LongDescription" : [
"Offers code completion, highlighting of the symbol under cursor, and jumping to the symbol definition, as well as diagnostics from the language server."
],

View File

@@ -15,7 +15,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Scripting",
"Description" : "Lua Language Client scripting support",
"Description" : "Lua Language Client scripting support.",
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}
}

View File

@@ -12,7 +12,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Record and play macros in text editors",
"Description" : "Record and play macros in text editors.",
"LongDescription" : [
"When you have a file open in the code editor, you can record a keyboard sequence as a macro. You can then play the macro to repeat the sequence. You can save the latest macro and assign a keyboard shortcut for running it or run it from the locator."
],

View File

@@ -12,7 +12,7 @@
"",
"Alternatively, this file may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this file. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Install applications from Qt Marketplace",
"Description" : "Install applications from Qt Marketplace.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Device Support",
"Description" : "Develop for microcontrollers",
"Description" : "Develop for microcontrollers.",
"LongDescription" : [
"Use subsets of QML and Qt Quick Controls to create user interfaces for devices that are powered by microcontrollers (MCU).",
"You also need:",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Version Control",
"Description" : "Access the Mercurial source control management tool",
"Description" : "Access the Mercurial source control management tool.",
"LongDescription" : [
"You also need:",
"- Mercurial"

View File

@@ -15,7 +15,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Build Systems",
"Description" : "Generate build systems with Meson",
"Description" : "Generate build systems with Meson.",
"LongDescription" : [
"Generate build systems with Meson using Ninja as the main backend.",
"You also need:",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Modeling",
"Description" : "Create Universal Modeling Language (UML) style models",
"Description" : "Create Universal Modeling Language (UML) style models.",
"LongDescription" : [
"Create structured and behavioral diagrams that offer different views to your system. However, the editor uses a variant of UML and has only a subset of properties for specifying the appearance of model elements."
],

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Other Languages",
"Description" : "Develop applications using the Nim programming language",
"Description" : "Develop applications using the Nim programming language.",
"LongDescription" : [
"You also need:",
"- Nimble packaging manager"

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Version Control",
"Description" : "Access the Perforce software configuration management system",
"Description" : "Access the Perforce software configuration management system.",
"LongDescription" : [
"You also need:",
"- Perforce"

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Code Analyzer",
"Description" : "Analyze the CPU and memory usage of an application",
"Description" : "Analyze the CPU and memory usage of an application.",
"LongDescription" : [
"Works on embedded devices and, to a limited extent, on Linux desktop platforms.",
"You also need:",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 B

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 B

After

Width:  |  Height:  |  Size: 347 B

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Other Languages",
"Description" : "Develop applications using the Qt bindings for the Python programming language",
"Description" : "Develop applications using the Qt bindings for the Python programming language.",
"LongDescription" : [
"You also need:",
"- Qt for Python",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Build Systems",
"Description" : "Build applications with Qbs",
"Description" : "Build applications with Qbs.",
"LongDescription" : [
"Generate a build graph from a high-level project description (like with qmake or CMake) and execute the commands in the low-level build graph (like with make)."
],

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Build Systems",
"Description" : "Build applications with qmake",
"Description" : "Build applications with qmake.",
"LongDescription" : [
"Use .pro project configuration files and tools that automate the generation of Makefiles."
],

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Quick",
"Description" : "Qml Designer Lite",
"Description" : "Qml Designer Lite.",
"LongDescription": "Qml Designer Lite is a lightweight version of Qt Design Studio, providing a subset of the features of the full Qt Design Studio.",
"Url" : "https://www.qt.io",
"Experimental": true,

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Quick",
"Description" : "Edit QML and JavaScript files",
"Description" : "Edit QML and JavaScript files.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Quick",
"Description" : "Preview QML files and Qt Quick applications",
"Description" : "Preview QML files and Qt Quick applications.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Quick",
"Description" : "Profile Qt Quick applications",
"Description" : "Profile Qt Quick applications.",
"LongDescription" : [
"Find causes for typical performance problems, such as slowness and unresponsive, stuttering user interfaces."
],

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Quick",
"Description" : "Qt Quick support",
"Description" : "Qt Quick support.",
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES},

View File

@@ -49,6 +49,10 @@ QmlMainFileAspect::QmlMainFileAspect(AspectContainer *container)
this, &QmlMainFileAspect::changeCurrentFile);
connect(EditorManager::instance(), &EditorManager::currentDocumentStateChanged,
this, [this] { changeCurrentFile(); });
connect(ProjectExplorerPlugin::instance(),
&ProjectExplorerPlugin::fileListChanged,
this,
&QmlMainFileAspect::updateFileComboBox);
}
QmlMainFileAspect::~QmlMainFileAspect()
@@ -63,9 +67,6 @@ void QmlMainFileAspect::addToLayout(Layouting::Layout &parent)
m_fileListCombo->setModel(&m_fileListModel);
updateFileComboBox();
connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::fileListChanged,
this, &QmlMainFileAspect::updateFileComboBox);
connect(m_fileListCombo, &QComboBox::activated, this, &QmlMainFileAspect::setMainScript);
parent.addItems({Tr::tr("Main QML file:"), m_fileListCombo.data()});
@@ -93,7 +94,7 @@ void QmlMainFileAspect::updateFileComboBox()
const FilePath projectDir = m_target->project()->projectDirectory();
if (mainScriptSource() == FileInProjectFile) {
const FilePath mainScriptInFilePath = projectDir.relativeChildPath(mainScript());
const FilePath mainScriptInFilePath = mainScript().relativePathFrom(projectDir);
m_fileListModel.clear();
m_fileListModel.appendRow(new QStandardItem(mainScriptInFilePath.toString()));
if (m_fileListCombo)

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Device Support",
"Description" : "Develop for QNX Neutrino devices",
"Description" : "Develop for QNX Neutrino devices.",
"LongDescription" : [
"Connect devices with USB or over a network to run, debug, and analyze applications built for them.",
"You also need:",

View File

@@ -126,6 +126,7 @@ public:
setStartMode(AttachToRemoteServer);
setCloseMode(KillAtClose);
setUseCtrlCStub(true);
setSolibSearchPath(FileUtils::toFilePathList(searchPaths(k)));
if (auto qtVersion = dynamic_cast<QnxQtVersion *>(QtSupport::QtKitAspect::qtVersion(k))) {
setSysRoot(qtVersion->qnxTarget());
@@ -195,6 +196,7 @@ public:
{
setId("QnxAttachDebugSupport");
setUsePortsGatherer(isCppDebugging(), isQmlDebugging());
setUseCtrlCStub(true);
if (isCppDebugging()) {
auto pdebugRunner = new PDebugRunner(runControl, portsGatherer());

View File

@@ -15,7 +15,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Device Support",
"Description" : "Run applications in Qt Application Manager",
"Description" : "Run applications in Qt Application Manager.",
"LongDescription" : [
"You also need:",
"- Qt Application Manager"

View File

@@ -28,12 +28,14 @@
#include <utils/stylehelper.h>
#include <QLoggingCategory>
#include <algorithm>
#include <memory>
using namespace Core;
using namespace Utils;
const int kQtVersionIdRole = Qt::UserRole;
const int kExtraSetIndexRole = Qt::UserRole + 1;
const int kVersionRole = Qt::UserRole + 2;
namespace QtSupport {
namespace Internal {
@@ -112,43 +114,66 @@ ExampleSetModel::ExampleSetModel()
&ExampleSetModel::helpManagerInitialized);
}
void ExampleSetModel::recreateModel(const QtVersions &qtVersions)
void ExampleSetModel::recreateModel(const QtVersions &qtVersionsIn)
{
beginResetModel();
clear();
QHash<FilePath, int> extraManifestDirs;
for (int i = 0; i < m_extraExampleSets.size(); ++i)
extraManifestDirs.insert(FilePath::fromUserInput(m_extraExampleSets.at(i).manifestPath), i);
// Sanitize away qt versions that have already been added through extra sets.
// This way we do not have entries for Qt/Android, Qt/Desktop, Qt/MinGW etc pp,
// but only the one "QtX X.Y.Z" entry that is registered as an example set by the installer.
const QtVersions qtVersions
= Utils::filtered(qtVersionsIn, [this, &extraManifestDirs](QtVersion *v) {
if (extraManifestDirs.contains(v->docsPath())) {
m_extraExampleSets[extraManifestDirs.value(v->docsPath())].qtVersion
= v->qtVersion();
qCDebug(log) << "Not showing Qt version because manifest path is already added "
"through InstalledExamples settings:"
<< v->displayName();
return false;
}
return true;
});
QList<QStandardItem *> items;
for (int i = 0; i < m_extraExampleSets.size(); ++i) {
const ExtraExampleSet &set = m_extraExampleSets.at(i);
auto newItem = new QStandardItem();
newItem->setData(set.displayName, Qt::DisplayRole);
newItem->setData(set.displayName, Qt::UserRole + 1);
newItem->setData(QVariant(), Qt::UserRole + 2);
newItem->setData(i, Qt::UserRole + 3);
appendRow(newItem);
extraManifestDirs.insert(FilePath::fromUserInput(set.manifestPath), i);
}
for (QtVersion *version : qtVersions) {
// Sanitize away qt versions that have already been added through extra sets.
// This way we do not have entries for Qt/Android, Qt/Desktop, Qt/MinGW etc pp,
// but only the one "QtX X.Y.Z" entry that is registered as an example set by the installer.
if (extraManifestDirs.contains(version->docsPath())) {
m_extraExampleSets[extraManifestDirs.value(version->docsPath())].qtVersion
= version->qtVersion();
qCDebug(log) << "Not showing Qt version because manifest path is already added "
"through InstalledExamples settings:"
<< version->displayName();
continue;
newItem->setData(QVariant(), kQtVersionIdRole);
newItem->setData(i, kExtraSetIndexRole);
newItem->setData(QVariant::fromValue(set.qtVersion), kVersionRole);
items.append(newItem);
}
items += Utils::transform(qtVersions, [](QtVersion *v) {
auto newItem = new QStandardItem();
newItem->setData(version->displayName(), Qt::DisplayRole);
newItem->setData(version->displayName(), Qt::UserRole + 1);
newItem->setData(version->uniqueId(), Qt::UserRole + 2);
newItem->setData(QVariant(), Qt::UserRole + 3);
appendRow(newItem);
}
newItem->setData(v->displayName(), Qt::DisplayRole);
newItem->setData(v->uniqueId(), kQtVersionIdRole);
newItem->setData(QVariant(), kExtraSetIndexRole);
newItem->setData(QVariant::fromValue(v->qtVersion()), kVersionRole);
return newItem;
});
// Sort by Qt version, example sets not associated to Qt last
Utils::sort(items, [](QStandardItem *a, QStandardItem *b) {
const QVersionNumber versionB = b->data(kVersionRole).value<QVersionNumber>();
if (versionB.isNull())
return true;
const QVersionNumber versionA = a->data(kVersionRole).value<QVersionNumber>();
if (versionA.isNull())
return false;
if (versionA == versionB)
return a->data(Qt::DisplayRole).toString() < b->data(Qt::DisplayRole).toString();
return versionA < versionB;
});
for (QStandardItem *item : std::as_const(items))
appendRow(item);
endResetModel();
}
@@ -179,7 +204,7 @@ QVariant ExampleSetModel::getDisplayName(int i) const
{
if (i < 0 || i >= rowCount())
return QVariant();
return data(index(i, 0), Qt::UserRole + 1);
return data(index(i, 0), Qt::DisplayRole);
}
// id is either the Qt version uniqueId, or the display name of the extra example set
@@ -188,7 +213,7 @@ QVariant ExampleSetModel::getId(int i) const
if (i < 0 || i >= rowCount())
return QVariant();
QModelIndex modelIndex = index(i, 0);
QVariant variant = data(modelIndex, Qt::UserRole + 2);
QVariant variant = data(modelIndex, kQtVersionIdRole);
if (variant.isValid()) // set from qt version
return variant;
return getDisplayName(i);
@@ -199,7 +224,7 @@ ExampleSetModel::ExampleSetType ExampleSetModel::getType(int i) const
if (i < 0 || i >= rowCount())
return InvalidExampleSet;
QModelIndex modelIndex = index(i, 0);
QVariant variant = data(modelIndex, Qt::UserRole + 2); /*Qt version uniqueId*/
QVariant variant = data(modelIndex, kQtVersionIdRole); /*Qt version uniqueId*/
if (variant.isValid())
return QtExampleSet;
return ExtraExampleSetType;
@@ -209,7 +234,7 @@ int ExampleSetModel::getQtId(int i) const
{
QTC_ASSERT(i >= 0, return -1);
QModelIndex modelIndex = index(i, 0);
QVariant variant = data(modelIndex, Qt::UserRole + 2);
QVariant variant = data(modelIndex, kQtVersionIdRole);
QTC_ASSERT(variant.isValid(), return -1);
QTC_ASSERT(variant.canConvert<int>(), return -1);
return variant.toInt();
@@ -224,7 +249,7 @@ int ExampleSetModel::getExtraExampleSetIndex(int i) const
{
QTC_ASSERT(i >= 0, return -1);
QModelIndex modelIndex = index(i, 0);
QVariant variant = data(modelIndex, Qt::UserRole + 3);
QVariant variant = data(modelIndex, kExtraSetIndexRole);
QTC_ASSERT(variant.isValid(), return -1);
QTC_ASSERT(variant.canConvert<int>(), return -1);
return variant.toInt();

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Device Support",
"Description" : "Develop applications for embedded Linux devices",
"Description" : "Develop applications for embedded Linux devices.",
"LongDescription" : [
"Connect devices with USB or over a network to run, debug, and analyze applications built for them.",
"You also need:",

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Qt Creator",
"Description" : "Edit Qt Resource System (.qrc) files",
"Description" : "Edit Qt Resource System (.qrc) files.",
"LongDescription" : [
"Store files in the application's executable with the platform-independent Qt Resource System."
],

View File

@@ -14,7 +14,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Device Support",
"Description" : "Render safety-critical items in functional safety systems",
"Description" : "Render safety-critical items in functional safety systems.",
"LongDescription" : [
"Qt Safe Renderer separates the safety-critical rendering from the other parts of the system, so it can render safety-critical UI elements even if there are failures in the main UI. Therefore, you can use Qt in a system requiring certification without changing the Qt libraries.",
"You also need:",

View File

@@ -14,7 +14,7 @@
],
"DisabledByDefault" : true,
"SoftLoadable" : true,
"Description" : "Record screens",
"Description" : "Record screens.",
"LongDescription" : [],
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}

View File

@@ -13,7 +13,7 @@
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Category" : "Modeling",
"Description" : "Create SCXML (State Chart XML) files",
"Description" : "Create SCXML (State Chart XML) files.",
"LongDescription" : [
"Visualize how a system reacts to events. State charts define the states that the system can be in, and how the system can move from one state to another."
],

View File

@@ -14,7 +14,7 @@
"",
"Alternatively, this plugin may be used under the terms of the GNU General Public License version 3 as published by the Free Software Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT included in the packaging of this plugin. Please review the following information to ensure the GNU General Public License requirements will be met: https://www.gnu.org/licenses/gpl-3.0.html."
],
"Description" : "Serial Port Terminal",
"Description" : "Serial Port Terminal.",
"Url" : "https://www.qt.io",
${IDE_PLUGIN_DEPENDENCIES}
}

Some files were not shown because too many files have changed in this diff Show More