Merge remote-tracking branch 'origin/master' into 4.12

Change-Id: I2c0857b3845d9947d3e10ede5c67e2780a8815d6
This commit is contained in:
Eike Ziller
2020-02-14 15:45:49 +01:00
68 changed files with 915 additions and 532 deletions

View File

@@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Design Studio documentation.
@@ -49,17 +49,11 @@
You can use the \QBSK export tool in Sketch to convert artwork into
Qt Quick files that you can import to projects in \QDS.
\li \l{Exporting from Maya}
You can export 3D graphics from Maya in the FBX format.
The necessary plugin is usually enabled by default.
\omit
\li \l{Exporting 3D Assets}
You can import files you created using 3D graphics applications and
stored in several widely-used formats, such as .blend, .dae, .fbx,
.glb, .gltf, .obj, .uia, or .uip.
\endomit
\endlist
*/

View File

@@ -27,7 +27,7 @@
\contentspage {Qt Design Studio Manual}
\previouspage qtbridge-sketch-setup.html
\page qtbridge-sketch-using.html
\nextpage exporting-from-maya.html
\nextpage exporting-3d-assets.html
\title Using \QBSK

View File

@@ -0,0 +1,196 @@
/****************************************************************************
**
** Copyright (C) 1993-2009 NVIDIA Corporation.
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Design Studio.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\contentspage {Qt Design Studio}
\page exporting-3d-assets.html
\previouspage qtbridge-sketch-using.html
\nextpage exporting-from-blender.html
\title Exporting 3D Assets
You can import files you created using 3D graphics applications and exported
to several widely-used formats, such as .blend, .dae, .fbx, .glb, .gltf,
.obj, .uia, or .uip. For a list of formats supported by each \l{Qt Quick 3D}
version, see the module documentation.
Depending on the 3D graphics tool, you might need to install export plugins
to be able to export files to a particular format.
To get the best results when exporting 3D assets and importing them to
\QDS, follow the general guidelines in the following sections. For more
information about using the export plugins for a particular tool, see
\l{Exporting from Different Tools}.
\section1 Geometry
\QDS supports geometry exported as triangles, quads, and pentagons. For
basic geometry, you mostly need to pay attention to pivot points and
transformation.
\section2 Pivot Points
In \QDS, there is only one pivot per component. It is used as the origin
for scaling and rotation. Adjust the position of a 3D model's pivot as
needed.
However, extreme edits to pivots in 3D modeling tools can cause problems
when importing to \QDS, especially if animated. This difference is often
manifested as a difference in the position or orientation of a component.
You can prevent these kinds of problems by only making simple edits to
your pivot points. Keep your pivot points to the default (world) alignment,
don't scale them, and make sure that if you have multiple pivots (Maya)
that they are all at the same location in space.
\section2 Transformation
You can import full 3D transform information including position, rotation,
scale, and pivot. \QDS can import left and right-handed coordinate systems,
y-up or z-up, and rotations applied in any order. The principal limitation
in this area are pivot points. As discussed above, only simple edits to
pivot points are supported.
Most 3D graphics tools enable you to apply transformation to components and
vertices. We highly recommend doing so before importing mesh data into \QDS.
This ensures that the mesh coming into \QDS has clean transform data and no
arbitrary transform values which can be confusing or an impediment to your
work.
\note After applying transformations, you may have to reposition the pivot
point in some 3D graphics tools.
\section1 Animations
Animations are supported on any imported property. Position, rotation,
scale, and pivot can all be animated. For example, a hierarchy of items,
rotated simultaneously on arbitrary axes in arbitrary axis order can be
imported. \QDS also supports importing bezier tangent value tweaked into
animations.
\section2 Time-based Animations
In many 3D modeling tools, when you create keyframes you associate them with
frame numbers. This is great in the film industry where frame rates are
constant, but poses problems in applications where the frame rate may or
may not be rock solid. If you were to specify that the logo animation will
play for 180 frames, it might play for 3 seconds at 60 FPS, but if the speed
drops to 30 fps, the animation will also get much slower.
Luckily, accounting for this is relatively simple. Many 3D modeling tools
default to a setting of 24 frames per second, so your keyframes will
be translated at that ratio. If you want a keyframe at one second, put
it on frame 24. For two seconds, use frame 48, and so on.
Usually, configurable frame rates are offered, and the frame rate setting
should be respected upon import.
Some tools, such as Maya, start at frame 1, by default. If you have a
keyframe at frame 1, the time for that keyframe will be 1/24, or 0.041
seconds. Edit your Maya animation settings to start your animations at
frame 0, or 0/24 = 0 seconds.
In \QDS, you can specify the duration of the animation in addition to its
start and end frame.
\section2 Deform Animations
\e {Deform animations}, such as lattice and bend, are not supported by \QDS.
However, you can work around this limitation by converting deform animations
into \e {blend shape} animations that are supported in FBX format. Before
exporting the animations, you need to bake the actions in them into key
frames.
\section2 Baking Actions for Animations
You need to bake actions to export animations that are using custom curves
or object constraints to control the animation.
\e Actions are data-blocks containing animation data. If you are exporting
animations, you need to bake actions.
\section2 Animation Systems
3D modeling tools offer highly complex and specialized animation systems.
We recommend using the \QDS \uicontrol Timeline view whenever practical.
This helps keep mesh information on import clean and reduces conflicts
between imported mesh animation and \QDS's animation.
The animation system in \QDS is a full implementation of bezier
keys, and the full complement of bezier animation that you can create
with 3D modeling tools and export are represented in \QDS. The more
extreme differences between the various animation systems are mitigated
by the limitations imposed by the supported formats.
\section1 Materials and Textures
Create and assign material slots in the 3D graphics tool before you export
3D graphics. If you add several material slots, the first one is assigned
to the object. Only material slots that have a material and that are
assigned to a mesh on the exported object are imported into \QDS.
If no material slots are assigned to an object, a default material is
attached to the component that is created when you import the assets to
\QDS.
UV-unwrapping your model will create a UV layout. Without a UV layout, you
will not be able to render any textures on your model in \QDS.
There are many different ways and techniques to unwrap 3D meshes, depending
on the 3D graphics tool.
\section1 Lights
Lights are imported to \QDS. Position, rotation, scale, brightness,
light color, and the cast shadows property values are preserved.
If the light type is not supported by Qt Quick 3D, it is converted into
one of the supported types.
\section1 Cameras
Perspective and orthographic cameras are imported to \QDS. Position,
rotation, and scale property values, as well as start and end clipping
values are preserved. For perspective cameras, field of view values
are also preserved.
\section1 Node Hierarchy
\QDS supports importing hierarchical information. Hierarchies of arbitrary
depth are supported, including grouped nodes. Hierarchical transforms are
applied as expected.
\section1 Exporting from Different Tools
The following sections provide additional information about exporting
3D assets from a particular tool:
\list
\li \l{Exporting from Blender}{Blender}
\li \l{Exporting from Maya}{Maya}
\endlist
*/

View File

@@ -0,0 +1,47 @@
/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Design Studio.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\contentspage {Qt Design Studio Manual}
\page exporting-from-blender.html
\previouspage exporting-3d-assets.html
\nextpage exporting-from-maya.html
\title Exporting from Blender
You can export meshes, lights, cameras, transformations (scale, rotation,
or location), UV layouts, pivot points, object hierarchy, and material
slots from Blender to \QDS.
When you import 3D graphics to \QDS, the scenegraph is converted into
Qt Quick 3D types.
For best results, export 3D graphics to the GL Transmission Format (qlTF2),
as instructed in the
\l{https://docs.blender.org/manual/en/2.81/addons/import_export/io_scene_gltf2.html}
{qlTF2} section of the Blender documentation.
*/

View File

@@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
@@ -52,36 +52,39 @@ QtObject {
readonly property string anchorLeft: "\u002E"
readonly property string anchorRight: "\u002F"
readonly property string anchorTop: "\u0030"
readonly property string centerHorizontal: "\u0031"
readonly property string centerVertical: "\u0032"
readonly property string closeCross: "\u0033"
readonly property string distributeBottom: "\u0034"
readonly property string distributeCenterHorizontal: "\u0035"
readonly property string distributeCenterVertical: "\u0036"
readonly property string distributeLeft: "\u0037"
readonly property string distributeOriginBottomRight: "\u0038"
readonly property string distributeOriginCenter: "\u0039"
readonly property string distributeOriginNone: "\u003A"
readonly property string distributeOriginTopLeft: "\u003B"
readonly property string distributeRight: "\u003C"
readonly property string distributeSpacingHorizontal: "\u003D"
readonly property string distributeSpacingVertical: "\u003E"
readonly property string distributeTop: "\u003F"
readonly property string fontStyleBold: "\u0040"
readonly property string fontStyleItalic: "\u0041"
readonly property string fontStyleStrikethrough: "\u0042"
readonly property string fontStyleUnderline: "\u0043"
readonly property string testIcon: "\u0044"
readonly property string textAlignBottom: "\u0045"
readonly property string textAlignCenter: "\u0046"
readonly property string textAlignLeft: "\u0047"
readonly property string textAlignMiddle: "\u0048"
readonly property string textAlignRight: "\u0049"
readonly property string textAlignTop: "\u004A"
readonly property string tickIcon: "\u004B"
readonly property string triState: "\u004C"
readonly property string upDownIcon: "\u004D"
readonly property string upDownSquare2: "\u004E"
readonly property string annotationBubble: "\u0031"
readonly property string annotationDecal: "\u0032"
readonly property string centerHorizontal: "\u0033"
readonly property string centerVertical: "\u0034"
readonly property string closeCross: "\u0035"
readonly property string distributeBottom: "\u0036"
readonly property string distributeCenterHorizontal: "\u0037"
readonly property string distributeCenterVertical: "\u0038"
readonly property string distributeLeft: "\u0039"
readonly property string distributeOriginBottomRight: "\u003A"
readonly property string distributeOriginCenter: "\u003B"
readonly property string distributeOriginNone: "\u003C"
readonly property string distributeOriginTopLeft: "\u003D"
readonly property string distributeRight: "\u003E"
readonly property string distributeSpacingHorizontal: "\u003F"
readonly property string distributeSpacingVertical: "\u0040"
readonly property string distributeTop: "\u0041"
readonly property string edit: "\u0042"
readonly property string fontStyleBold: "\u0043"
readonly property string fontStyleItalic: "\u0044"
readonly property string fontStyleStrikethrough: "\u0045"
readonly property string fontStyleUnderline: "\u0046"
readonly property string testIcon: "\u0047"
readonly property string textAlignBottom: "\u0048"
readonly property string textAlignCenter: "\u0049"
readonly property string textAlignLeft: "\u004A"
readonly property string textAlignMiddle: "\u004B"
readonly property string textAlignRight: "\u004C"
readonly property string textAlignTop: "\u004D"
readonly property string tickIcon: "\u004E"
readonly property string triState: "\u004F"
readonly property string upDownIcon: "\u0050"
readonly property string upDownSquare2: "\u0051"
readonly property font iconFont: Qt.font({
"family": controlIcons.name,

View File

@@ -190,8 +190,7 @@ static inline int askMsgSendFailed()
}
// taken from utils/fileutils.cpp. We cannot use utils here since that depends app_version.h.
static bool copyRecursively(const QString &srcFilePath,
const QString &tgtFilePath)
static bool copyRecursively(const QString &srcFilePath, const QString &tgtFilePath)
{
QFileInfo srcFileInfo(srcFilePath);
if (srcFileInfo.isDir()) {
@@ -200,12 +199,11 @@ static bool copyRecursively(const QString &srcFilePath,
if (!targetDir.mkdir(Utils::FilePath::fromString(tgtFilePath).fileName()))
return false;
QDir sourceDir(srcFilePath);
QStringList fileNames = sourceDir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System);
foreach (const QString &fileName, fileNames) {
const QString newSrcFilePath
= srcFilePath + QLatin1Char('/') + fileName;
const QString newTgtFilePath
= tgtFilePath + QLatin1Char('/') + fileName;
const QStringList fileNames = sourceDir.entryList
(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System);
for (const QString &fileName : fileNames) {
const QString newSrcFilePath = srcFilePath + '/' + fileName;
const QString newTgtFilePath = tgtFilePath + '/' + fileName;
if (!copyRecursively(newSrcFilePath, newTgtFilePath))
return false;
}
@@ -300,8 +298,8 @@ static inline QSettings *userSettings()
if (srcDir == destDir) // Nothing to copy and no settings yet
return settings;
QStringList entries = srcDir.entryList();
foreach (const QString &file, entries) {
const QStringList entries = srcDir.entryList();
for (const QString &file : entries) {
const QString lowerFile = file.toLower();
if (lowerFile.startsWith(QLatin1String("profiles.xml"))
|| lowerFile.startsWith(QLatin1String("toolchains.xml"))
@@ -349,7 +347,8 @@ void loadFonts()
{
const QDir dir(resourcePath() + "/fonts/");
foreach (const QFileInfo &fileInfo, dir.entryInfoList(QStringList("*.ttf"), QDir::Files))
const QFileInfoList fonts = dir.entryInfoList(QStringList("*.ttf"), QDir::Files);
for (const QFileInfo &fileInfo : fonts)
QFontDatabase::addApplicationFont(fileInfo.absoluteFilePath());
}
@@ -555,13 +554,12 @@ int main(int argc, char **argv)
QTranslator translator;
QTranslator qtTranslator;
QStringList uiLanguages;
uiLanguages = QLocale::system().uiLanguages();
QStringList uiLanguages = QLocale::system().uiLanguages();
QString overrideLanguage = settings->value(QLatin1String("General/OverrideLanguage")).toString();
if (!overrideLanguage.isEmpty())
uiLanguages.prepend(overrideLanguage);
const QString &creatorTrPath = resourcePath() + "/translations";
foreach (QString locale, uiLanguages) {
for (QString locale : qAsConst(uiLanguages)) {
locale = QLocale(locale).name();
if (translator.load("qtcreator_" + locale, creatorTrPath)) {
const QString &qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
@@ -614,7 +612,7 @@ int main(int argc, char **argv)
const PluginSpecSet plugins = PluginManager::plugins();
PluginSpec *coreplugin = nullptr;
foreach (PluginSpec *spec, plugins) {
for (PluginSpec *spec : plugins) {
if (spec->name() == QLatin1String(corePluginNameC)) {
coreplugin = spec;
break;

View File

@@ -207,7 +207,7 @@ Aggregate::~Aggregate()
QList<QObject *> components;
{
QWriteLocker locker(&lock());
foreach (QObject *component, m_components) {
for (QObject *component : qAsConst(m_components)) {
disconnect(component, &QObject::destroyed, this, &Aggregate::deleteSelf);
aggregateMap().remove(component);
}

View File

@@ -48,7 +48,7 @@ public:
template <typename T> T *component() {
QReadLocker locker(&lock());
foreach (QObject *component, m_components) {
for (QObject *component : qAsConst(m_components)) {
if (T *result = qobject_cast<T *>(component))
return result;
}
@@ -58,7 +58,7 @@ public:
template <typename T> QList<T *> components() {
QReadLocker locker(&lock());
QList<T *> results;
foreach (QObject *component, m_components) {
for (QObject *component : qAsConst(m_components)) {
if (T *result = qobject_cast<T *>(component)) {
results << result;
}

View File

@@ -170,7 +170,7 @@ bool OptionsParser::checkForLoadOption()
return false;
if (nextToken(RequiredToken)) {
if (m_currentArg == QLatin1String("all")) {
foreach (PluginSpec *spec, m_pmPrivate->pluginSpecs)
for (PluginSpec *spec : qAsConst(m_pmPrivate->pluginSpecs))
spec->d->setForceEnabled(true);
m_isDependencyRefreshNeeded = true;
} else {
@@ -197,7 +197,7 @@ bool OptionsParser::checkForNoLoadOption()
return false;
if (nextToken(RequiredToken)) {
if (m_currentArg == QLatin1String("all")) {
foreach (PluginSpec *spec, m_pmPrivate->pluginSpecs)
for (PluginSpec *spec : qAsConst(m_pmPrivate->pluginSpecs))
spec->d->setForceDisabled(true);
m_isDependencyRefreshNeeded = true;
} else {
@@ -210,7 +210,7 @@ bool OptionsParser::checkForNoLoadOption()
} else {
spec->d->setForceDisabled(true);
// recursively disable all plugins that require this plugin
foreach (PluginSpec *dependantSpec, PluginManager::pluginsRequiringPlugin(spec))
for (PluginSpec *dependantSpec : PluginManager::pluginsRequiringPlugin(spec))
dependantSpec->d->setForceDisabled(true);
m_isDependencyRefreshNeeded = true;
}

View File

@@ -46,7 +46,7 @@ PluginErrorOverview::PluginErrorOverview(QWidget *parent) :
m_ui->setupUi(this);
m_ui->buttonBox->addButton(tr("Continue"), QDialogButtonBox::AcceptRole);
foreach (PluginSpec *spec, PluginManager::plugins()) {
for (PluginSpec *spec : PluginManager::plugins()) {
// only show errors on startup if plugin is enabled.
if (spec->hasError() && spec->isEffectivelyEnabled()) {
QListWidgetItem *item = new QListWidgetItem(spec->name());

View File

@@ -359,11 +359,11 @@ const QStringList PluginManager::allErrors()
/*!
Returns all plugins that require \a spec to be loaded. Recurses into dependencies.
*/
QSet<PluginSpec *> PluginManager::pluginsRequiringPlugin(PluginSpec *spec)
const QSet<PluginSpec *> PluginManager::pluginsRequiringPlugin(PluginSpec *spec)
{
QSet<PluginSpec *> dependingPlugins({spec});
// recursively add plugins that depend on plugins that.... that depend on spec
foreach (PluginSpec *spec, d->loadQueue()) {
for (PluginSpec *spec : d->loadQueue()) {
if (spec->requiresAny(dependingPlugins))
dependingPlugins.insert(spec);
}
@@ -374,7 +374,7 @@ QSet<PluginSpec *> PluginManager::pluginsRequiringPlugin(PluginSpec *spec)
/*!
Returns all plugins that \a spec requires to be loaded. Recurses into dependencies.
*/
QSet<PluginSpec *> PluginManager::pluginsRequiredByPlugin(PluginSpec *spec)
const QSet<PluginSpec *> PluginManager::pluginsRequiredByPlugin(PluginSpec *spec)
{
QSet<PluginSpec *> recursiveDependencies;
recursiveDependencies.insert(spec);
@@ -576,7 +576,7 @@ QString PluginManager::serializedArguments()
{
const QChar separator = QLatin1Char('|');
QString rc;
foreach (const PluginSpec *ps, plugins()) {
for (const PluginSpec *ps : plugins()) {
if (!ps->arguments().isEmpty()) {
if (!rc.isEmpty())
rc += separator;
@@ -593,7 +593,7 @@ QString PluginManager::serializedArguments()
if (!rc.isEmpty())
rc += separator;
rc += QLatin1String(argumentKeywordC);
foreach (const QString &argument, d->arguments)
for (const QString &argument : qAsConst(d->arguments))
rc += separator + argument;
}
return rc;
@@ -633,7 +633,7 @@ void PluginManager::remoteArguments(const QString &serializedArgument, QObject *
const QStringList pwdValue = subList(serializedArguments, QLatin1String(pwdKeywordC));
const QString workingDirectory = pwdValue.isEmpty() ? QString() : pwdValue.first();
const QStringList arguments = subList(serializedArguments, QLatin1String(argumentKeywordC));
foreach (const PluginSpec *ps, plugins()) {
for (const PluginSpec *ps : plugins()) {
if (ps->state() == PluginSpec::Running) {
const QStringList pluginOptions = subList(serializedArguments, QLatin1Char(':') + ps->name());
QObject *socketParent = ps->plugin()->remoteCommand(pluginOptions, workingDirectory,
@@ -747,11 +747,11 @@ void PluginManager::formatOptions(QTextStream &str, int optionIndentation, int d
void PluginManager::formatPluginOptions(QTextStream &str, int optionIndentation, int descriptionIndentation)
{
// Check plugins for options
foreach (PluginSpec *ps, d->pluginSpecs) {
for (PluginSpec *ps : qAsConst(d->pluginSpecs)) {
const PluginSpec::PluginArgumentDescriptions pargs = ps->argumentDescriptions();
if (!pargs.empty()) {
str << "\nPlugin: " << ps->name() << '\n';
foreach (PluginArgumentDescription pad, pargs)
for (const PluginArgumentDescription &pad : pargs)
formatOption(str, pad.name, pad.parameter, pad.description, optionIndentation, descriptionIndentation);
}
}
@@ -762,7 +762,7 @@ void PluginManager::formatPluginOptions(QTextStream &str, int optionIndentation,
*/
void PluginManager::formatPluginVersions(QTextStream &str)
{
foreach (PluginSpec *ps, d->pluginSpecs)
for (PluginSpec *ps : qAsConst(d->pluginSpecs))
str << " " << ps->name() << ' ' << ps->version() << ' ' << ps->description() << '\n';
}
@@ -887,7 +887,7 @@ void PluginManagerPrivate::writeSettings()
return;
QStringList tempDisabledPlugins;
QStringList tempForceEnabledPlugins;
foreach (PluginSpec *spec, pluginSpecs) {
for (PluginSpec *spec : qAsConst(pluginSpecs)) {
if (spec->isEnabledByDefault() && !spec->isEnabledBySettings())
tempDisabledPlugins.append(spec->name());
if (!spec->isEnabledByDefault() && spec->isEnabledBySettings())
@@ -923,10 +923,10 @@ void PluginManagerPrivate::stopAll()
delete delayedInitializeTimer;
delayedInitializeTimer = nullptr;
}
QVector<PluginSpec *> queue = loadQueue();
foreach (PluginSpec *spec, queue) {
const QVector<PluginSpec *> queue = loadQueue();
for (PluginSpec *spec : queue)
loadPlugin(spec, PluginSpec::Stopped);
}
}
/*!
@@ -1001,7 +1001,7 @@ static QStringList matchingTestFunctions(const QStringList &testFunctions,
const QRegExp regExp(testFunctionName, Qt::CaseSensitive, QRegExp::Wildcard);
QStringList matchingFunctions;
foreach (const QString &testFunction, testFunctions) {
for (const QString &testFunction : testFunctions) {
if (regExp.exactMatch(testFunction)) {
// If the specified test data is invalid, the QTest framework will
// print a reasonable error message for us.
@@ -1058,7 +1058,7 @@ static TestPlan generateCompleteTestPlan(IPlugin *plugin, const QVector<QObject
TestPlan testPlan;
testPlan.insert(plugin, testFunctions(plugin->metaObject()));
foreach (QObject *testObject, testObjects) {
for (QObject *testObject : testObjects) {
const QStringList allFunctions = testFunctions(testObject->metaObject());
testPlan.insert(testObject, allFunctions);
}
@@ -1096,7 +1096,7 @@ static TestPlan generateCustomTestPlan(IPlugin *plugin,
} else {
// Add all matching test functions of all remaining test objects
foreach (QObject *testObject, remainingTestObjectsOfPlugin) {
for (QObject *testObject : qAsConst(remainingTestObjectsOfPlugin)) {
const QStringList allFunctions = testFunctions(testObject->metaObject());
const QStringList matchingFunctions = matchingTestFunctions(allFunctions,
matchText);
@@ -1119,7 +1119,7 @@ static TestPlan generateCustomTestPlan(IPlugin *plugin,
out << "No test function or class matches \"" << matchText
<< "\" in plugin \"" << plugin->metaObject()->className()
<< "\".\nAvailable functions:\n";
foreach (const QString &f, testFunctionsOfPluginObject)
for (const QString &f : testFunctionsOfPluginObject)
out << " " << f << '\n';
out << endl;
}
@@ -1143,7 +1143,7 @@ void PluginManagerPrivate::startTests()
}
int failedTests = 0;
foreach (const PluginManagerPrivate::TestSpec &testSpec, testSpecs) {
for (const TestSpec &testSpec : qAsConst(testSpecs)) {
IPlugin *plugin = testSpec.pluginSpec->plugin();
if (!plugin)
continue; // plugin not loaded
@@ -1227,15 +1227,15 @@ void PluginManagerPrivate::removeObject(QObject *obj)
*/
void PluginManagerPrivate::loadPlugins()
{
QVector<PluginSpec *> queue = loadQueue();
const QVector<PluginSpec *> queue = loadQueue();
Utils::setMimeStartupPhase(MimeStartupPhase::PluginsLoading);
foreach (PluginSpec *spec, queue) {
for (PluginSpec *spec : queue)
loadPlugin(spec, PluginSpec::Loaded);
}
Utils::setMimeStartupPhase(MimeStartupPhase::PluginsInitializing);
foreach (PluginSpec *spec, queue) {
for (PluginSpec *spec : queue)
loadPlugin(spec, PluginSpec::Initialized);
}
Utils::setMimeStartupPhase(MimeStartupPhase::PluginsDelayedInitializing);
Utils::reverseForeach(queue, [this](PluginSpec *spec) {
loadPlugin(spec, PluginSpec::Running);
@@ -1291,10 +1291,10 @@ void PluginManagerPrivate::asyncShutdownFinished()
/*!
\internal
*/
QVector<PluginSpec *> PluginManagerPrivate::loadQueue()
const QVector<PluginSpec *> PluginManagerPrivate::loadQueue()
{
QVector<PluginSpec *> queue;
foreach (PluginSpec *spec, pluginSpecs) {
for (PluginSpec *spec : qAsConst(pluginSpecs)) {
QVector<PluginSpec *> circularityCheckQueue;
loadQueue(spec, queue, circularityCheckQueue);
}
@@ -1526,7 +1526,7 @@ void PluginManagerPrivate::setPluginPaths(const QStringList &paths)
readPluginPaths();
}
static QStringList pluginFiles(const QStringList &pluginPaths)
static const QStringList pluginFiles(const QStringList &pluginPaths)
{
QStringList pluginFiles;
QStringList searchPaths = pluginPaths;
@@ -1553,7 +1553,7 @@ void PluginManagerPrivate::readPluginPaths()
// default
pluginCategories.insert(QString(), QVector<PluginSpec *>());
foreach (const QString &pluginFile, pluginFiles(pluginPaths)) {
for (const QString &pluginFile : pluginFiles(pluginPaths)) {
auto *spec = new PluginSpec;
if (!spec->d->read(pluginFile)) { // not a Qt Creator plugin
delete spec;
@@ -1586,13 +1586,13 @@ void PluginManagerPrivate::readPluginPaths()
void PluginManagerPrivate::resolveDependencies()
{
foreach (PluginSpec *spec, pluginSpecs)
for (PluginSpec *spec : qAsConst(pluginSpecs))
spec->d->resolveDependencies(pluginSpecs);
}
void PluginManagerPrivate::enableDependenciesIndirectly()
{
foreach (PluginSpec *spec, pluginSpecs)
for (PluginSpec *spec : qAsConst(pluginSpecs))
spec->d->enabledIndirectly = false;
// cannot use reverse loadQueue here, because test dependencies can introduce circles
QVector<PluginSpec *> queue = Utils::filtered(pluginSpecs, &PluginSpec::isEffectivelyEnabled);
@@ -1607,7 +1607,7 @@ PluginSpec *PluginManagerPrivate::pluginForOption(const QString &option, bool *r
{
// Look in the plugins for an option
*requiresArgument = false;
foreach (PluginSpec *spec, pluginSpecs) {
for (PluginSpec *spec : qAsConst(pluginSpecs)) {
PluginArgumentDescription match = Utils::findOrDefault(spec->argumentDescriptions(),
[option](PluginArgumentDescription pad) {
return pad.name == option;

View File

@@ -62,8 +62,8 @@ public:
template <typename T> static T *getObject()
{
QReadLocker lock(listLock());
QVector<QObject *> all = allObjects();
foreach (QObject *obj, all) {
const QVector<QObject *> all = allObjects();
for (QObject *obj : all) {
if (T *result = qobject_cast<T *>(obj))
return result;
}
@@ -72,8 +72,8 @@ public:
template <typename T, typename Predicate> static T *getObject(Predicate predicate)
{
QReadLocker lock(listLock());
QVector<QObject *> all = allObjects();
foreach (QObject *obj, all) {
const QVector<QObject *> all = allObjects();
for (QObject *obj : all) {
if (T *result = qobject_cast<T *>(obj))
if (predicate(result))
return result;
@@ -94,8 +94,8 @@ public:
static QHash<QString, QVector<PluginSpec *>> pluginCollections();
static bool hasError();
static const QStringList allErrors();
static QSet<PluginSpec *> pluginsRequiringPlugin(PluginSpec *spec);
static QSet<PluginSpec *> pluginsRequiredByPlugin(PluginSpec *spec);
static const QSet<PluginSpec *> pluginsRequiringPlugin(PluginSpec *spec);
static const QSet<PluginSpec *> pluginsRequiredByPlugin(PluginSpec *spec);
static void checkForProblematicPlugins();
// Settings

View File

@@ -69,7 +69,7 @@ public:
void loadPlugins();
void shutdown();
void setPluginPaths(const QStringList &paths);
QVector<ExtensionSystem::PluginSpec *> loadQueue();
const QVector<ExtensionSystem::PluginSpec *> loadQueue();
void loadPlugin(PluginSpec *spec, PluginSpec::State destState);
void resolveDependencies();
void enableDependenciesIndirectly();

View File

@@ -803,8 +803,8 @@ bool PluginSpecPrivate::readMetaData(const QJsonObject &pluginMetaData)
if (!value.isUndefined() && !value.isArray())
return reportError(msgValueIsNotAObjectArray(DEPENDENCIES));
if (!value.isUndefined()) {
QJsonArray array = value.toArray();
foreach (const QJsonValue &v, array) {
const QJsonArray array = value.toArray();
for (const QJsonValue &v : array) {
if (!v.isObject())
return reportError(msgValueIsNotAObjectArray(DEPENDENCIES));
QJsonObject dependencyObject = v.toObject();
@@ -850,8 +850,8 @@ bool PluginSpecPrivate::readMetaData(const QJsonObject &pluginMetaData)
if (!value.isUndefined() && !value.isArray())
return reportError(msgValueIsNotAObjectArray(ARGUMENTS));
if (!value.isUndefined()) {
QJsonArray array = value.toArray();
foreach (const QJsonValue &v, array) {
const QJsonArray array = value.toArray();
for (const QJsonValue &v : array) {
if (!v.isObject())
return reportError(msgValueIsNotAObjectArray(ARGUMENTS));
QJsonObject argumentObject = v.toObject();
@@ -946,7 +946,7 @@ bool PluginSpecPrivate::resolveDependencies(const QVector<PluginSpec *> &specs)
return false;
}
QHash<PluginDependency, PluginSpec *> resolvedDependencies;
foreach (const PluginDependency &dependency, dependencies) {
for (const PluginDependency &dependency : qAsConst(dependencies)) {
PluginSpec * const found = Utils::findOrDefault(specs, [&dependency](PluginSpec *spec) {
return spec->provides(dependency.name, dependency.version);
});

View File

@@ -218,12 +218,12 @@ public:
class CollectionItem : public TreeItem
{
public:
CollectionItem(const QString &name, QVector<PluginSpec *> plugins, PluginView *view)
CollectionItem(const QString &name, const QVector<PluginSpec *> &plugins, PluginView *view)
: m_name(name)
, m_plugins(plugins)
, m_view(view)
{
foreach (PluginSpec *spec, plugins)
for (PluginSpec *spec : plugins)
appendChild(new PluginItem(spec, view));
}
@@ -243,7 +243,7 @@ public:
return PluginView::tr("Load on Startup");
if (role == Qt::CheckStateRole || role == SortRole) {
int checkedCount = 0;
foreach (PluginSpec *spec, m_plugins) {
for (PluginSpec *spec : m_plugins) {
if (spec->isEnabledBySettings())
++checkedCount;
}
@@ -284,7 +284,7 @@ public:
public:
QString m_name;
QVector<PluginSpec *> m_plugins;
const QVector<PluginSpec *> m_plugins;
PluginView *m_view; // Not owned.
};
@@ -437,7 +437,7 @@ void PluginView::updatePlugins()
}
Utils::sort(collections, &CollectionItem::m_name);
foreach (CollectionItem *collection, collections)
for (CollectionItem *collection : qAsConst(collections))
m_model->rootItem()->appendChild(collection);
emit m_model->layoutChanged();
@@ -455,8 +455,8 @@ bool PluginView::setPluginsEnabled(const QSet<PluginSpec *> &plugins, bool enabl
{
QSet<PluginSpec *> additionalPlugins;
if (enable) {
foreach (PluginSpec *spec, plugins) {
foreach (PluginSpec *other, PluginManager::pluginsRequiredByPlugin(spec)) {
for (PluginSpec *spec : plugins) {
for (PluginSpec *other : PluginManager::pluginsRequiredByPlugin(spec)) {
if (!other->isEnabledBySettings())
additionalPlugins.insert(other);
}
@@ -472,8 +472,8 @@ bool PluginView::setPluginsEnabled(const QSet<PluginSpec *> &plugins, bool enabl
return false;
}
} else {
foreach (PluginSpec *spec, plugins) {
foreach (PluginSpec *other, PluginManager::pluginsRequiringPlugin(spec)) {
for (PluginSpec *spec : plugins) {
for (PluginSpec *other : PluginManager::pluginsRequiringPlugin(spec)) {
if (other->isEnabledBySettings())
additionalPlugins.insert(other);
}
@@ -490,8 +490,8 @@ bool PluginView::setPluginsEnabled(const QSet<PluginSpec *> &plugins, bool enabl
}
}
QSet<PluginSpec *> affectedPlugins = plugins + additionalPlugins;
foreach (PluginSpec *spec, affectedPlugins) {
const QSet<PluginSpec *> affectedPlugins = plugins + additionalPlugins;
for (PluginSpec *spec : affectedPlugins) {
PluginItem *item = m_model->findItemAtLevel<2>([spec](PluginItem *item) {
return item->m_spec == spec;
});

View File

@@ -488,6 +488,10 @@ void SdkManagerOutputParser::parsePackageListing(const QString &output)
if (outputLine.startsWith(" "))
continue;
// We don't need to parse this because they would still be listed on available packages
if (m_currentSection == AvailableUpdatesMarker)
continue;
MarkerTag marker = parseMarkers(outputLine.trimmed());
if (marker & SectionMarkers) {
// Section marker found. Update the current section being parsed.

View File

@@ -68,7 +68,7 @@ JavaEditorFactory::JavaEditorFactory()
"transient", "try", "void", "volatile", "while"
};
setId(Constants::JAVA_EDITOR_ID);
setDisplayName(tr("Java Editor"));
setDisplayName(QCoreApplication::translate("OpenWith::Editors", "Java Editor"));
addMimeType(Constants::JAVA_MIMETYPE);
setDocumentCreator(createJavaDocument);

View File

@@ -32,8 +32,6 @@ namespace Internal {
class JavaEditorFactory : public TextEditor::TextEditorFactory
{
Q_OBJECT
public:
JavaEditorFactory();
};

View File

@@ -3,7 +3,6 @@ add_qtc_plugin(BareMetal
SOURCES
baremetal.qrc
baremetalconstants.h
baremetalcustomrunconfiguration.cpp baremetalcustomrunconfiguration.h
baremetaldebugsupport.cpp baremetaldebugsupport.h
baremetaldevice.cpp baremetaldevice.h
baremetaldeviceconfigurationwidget.cpp baremetaldeviceconfigurationwidget.h

View File

@@ -9,7 +9,6 @@ include(debugservers/uvsc/uvscservers.pri)
# BareMetal files
SOURCES += \
baremetalcustomrunconfiguration.cpp\
baremetaldebugsupport.cpp \
baremetaldevice.cpp \
baremetaldeviceconfigurationwidget.cpp \
@@ -30,7 +29,6 @@ SOURCES += \
HEADERS += \
baremetalconstants.h \
baremetalcustomrunconfiguration.h \
baremetaldebugsupport.h \
baremetaldevice.h \
baremetaldeviceconfigurationwidget.h \

View File

@@ -17,7 +17,6 @@ QtcPlugin {
files: [
"baremetal.qrc",
"baremetalconstants.h",
"baremetalcustomrunconfiguration.cpp", "baremetalcustomrunconfiguration.h",
"baremetaldebugsupport.cpp", "baremetaldebugsupport.h",
"baremetaldevice.cpp", "baremetaldevice.h",
"baremetaldeviceconfigurationwidget.cpp", "baremetaldeviceconfigurationwidget.h",

View File

@@ -1,78 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 Tim Sander <tim@krieglstein.org>
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** 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.
**
****************************************************************************/
#include "baremetalcustomrunconfiguration.h"
#include "baremetalconstants.h"
#include <projectexplorer/runconfigurationaspects.h>
#include <projectexplorer/target.h>
#include <qtsupport/qtoutputformatter.h>
using namespace Utils;
using namespace ProjectExplorer;
namespace BareMetal {
namespace Internal {
// BareMetalCustomRunConfiguration
BareMetalCustomRunConfiguration::BareMetalCustomRunConfiguration(Target *target, Core::Id id)
: RunConfiguration(target, id)
{
const auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setSettingsKey("BareMetal.CustomRunConfig.Executable");
exeAspect->setPlaceHolderText(tr("Unknown"));
exeAspect->setDisplayStyle(BaseStringAspect::PathChooserDisplay);
exeAspect->setHistoryCompleter("BareMetal.CustomRunConfig.History");
exeAspect->setExpectedKind(PathChooser::Any);
addAspect<ArgumentsAspect>();
addAspect<WorkingDirectoryAspect>();
setDefaultDisplayName(RunConfigurationFactory::decoratedTargetName(tr("Custom Executable"), target));
}
Tasks BareMetalCustomRunConfiguration::checkForIssues() const
{
Tasks tasks;
if (aspect<ExecutableAspect>()->executable().isEmpty()) {
tasks << createConfigurationIssue(tr("The remote executable must be set in order to run "
"a custom remote run configuration."));
}
return tasks;
}
// BareMetalCustomRunConfigurationFactory
BareMetalCustomRunConfigurationFactory::BareMetalCustomRunConfigurationFactory()
: FixedRunConfigurationFactory(BareMetalCustomRunConfiguration::tr("Custom Executable"), true)
{
registerRunConfiguration<BareMetalCustomRunConfiguration>("BareMetal");
addSupportedTargetDeviceType(BareMetal::Constants::BareMetalOsType);
}
} // namespace Internal
} // namespace BareMetal

View File

@@ -1,57 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 Tim Sander <tim@krieglstein.org>
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** 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.
**
****************************************************************************/
#pragma once
#include <projectexplorer/runconfiguration.h>
namespace BareMetal {
namespace Internal {
// BareMetalCustomRunConfiguration
class BareMetalCustomRunConfiguration final
: public ProjectExplorer::RunConfiguration
{
Q_OBJECT
public:
explicit BareMetalCustomRunConfiguration(ProjectExplorer::Target *target, Core::Id id);
public:
ProjectExplorer::Tasks checkForIssues() const final;
};
// BareMetalCustomRunConfigurationFactory
class BareMetalCustomRunConfigurationFactory final
: public ProjectExplorer::FixedRunConfigurationFactory
{
public:
explicit BareMetalCustomRunConfigurationFactory();
};
} // namespace Internal
} // namespace BareMetal

View File

@@ -25,7 +25,6 @@
****************************************************************************/
#include "baremetalconstants.h"
#include "baremetalcustomrunconfiguration.h"
#include "baremetaldebugsupport.h"
#include "baremetaldevice.h"
#include "baremetalplugin.h"

View File

@@ -38,11 +38,16 @@ using namespace Utils;
namespace BareMetal {
namespace Internal {
// BareMetalRunConfiguration
// RunConfigurations
BareMetalRunConfiguration::BareMetalRunConfiguration(Target *target, Core::Id id)
: RunConfiguration(target, id)
class BareMetalRunConfiguration final : public RunConfiguration
{
Q_DECLARE_TR_FUNCTIONS(BareMetal::Internal::BareMetalRunConfiguration)
public:
explicit BareMetalRunConfiguration(Target *target, Core::Id id)
: RunConfiguration(target, id)
{
const auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDisplayStyle(BaseStringAspect::LabelDisplay);
exeAspect->setPlaceHolderText(tr("Unknown"));
@@ -56,6 +61,42 @@ BareMetalRunConfiguration::BareMetalRunConfiguration(Target *target, Core::Id id
});
connect(target, &Target::buildSystemUpdated, this, &RunConfiguration::update);
}
};
class BareMetalCustomRunConfiguration final : public RunConfiguration
{
Q_DECLARE_TR_FUNCTIONS(BareMetal::Internal::BareMetalCustomRunConfiguration)
public:
explicit BareMetalCustomRunConfiguration(Target *target, Core::Id id)
: RunConfiguration(target, id)
{
const auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setSettingsKey("BareMetal.CustomRunConfig.Executable");
exeAspect->setPlaceHolderText(tr("Unknown"));
exeAspect->setDisplayStyle(BaseStringAspect::PathChooserDisplay);
exeAspect->setHistoryCompleter("BareMetal.CustomRunConfig.History");
exeAspect->setExpectedKind(PathChooser::Any);
addAspect<ArgumentsAspect>();
addAspect<WorkingDirectoryAspect>();
setDefaultDisplayName(RunConfigurationFactory::decoratedTargetName(tr("Custom Executable"), target));
}
public:
Tasks checkForIssues() const final;
};
Tasks BareMetalCustomRunConfiguration::checkForIssues() const
{
Tasks tasks;
if (aspect<ExecutableAspect>()->executable().isEmpty()) {
tasks << createConfigurationIssue(tr("The remote executable must be set in order to run "
"a custom remote run configuration."));
}
return tasks;
}
// BareMetalRunConfigurationFactory
@@ -67,6 +108,15 @@ BareMetalRunConfigurationFactory::BareMetalRunConfigurationFactory()
addSupportedTargetDeviceType(BareMetal::Constants::BareMetalOsType);
}
// BaseMetalCustomRunConfigurationFactory
BareMetalCustomRunConfigurationFactory::BareMetalCustomRunConfigurationFactory()
: FixedRunConfigurationFactory(BareMetalCustomRunConfiguration::tr("Custom Executable"), true)
{
registerRunConfiguration<BareMetalCustomRunConfiguration>("BareMetal");
addSupportedTargetDeviceType(BareMetal::Constants::BareMetalOsType);
}
} // namespace Internal
} // namespace BareMetal

View File

@@ -30,23 +30,18 @@
namespace BareMetal {
namespace Internal {
// BareMetalRunConfiguration
class BareMetalRunConfiguration final : public ProjectExplorer::RunConfiguration
{
Q_OBJECT
public:
explicit BareMetalRunConfiguration(ProjectExplorer::Target *target, Core::Id id);
};
// BareMetalRunConfigurationFactory
class BareMetalRunConfigurationFactory final
: public ProjectExplorer::RunConfigurationFactory
{
public:
explicit BareMetalRunConfigurationFactory();
BareMetalRunConfigurationFactory();
};
class BareMetalCustomRunConfigurationFactory final
: public ProjectExplorer::FixedRunConfigurationFactory
{
public:
BareMetalCustomRunConfigurationFactory();
};
} // namespace Internal

View File

@@ -223,7 +223,7 @@ static TextDocument *createCMakeDocument()
CMakeEditorFactory::CMakeEditorFactory()
{
setId(Constants::CMAKE_EDITOR_ID);
setDisplayName(tr(Constants::CMAKE_EDITOR_DISPLAY_NAME));
setDisplayName(QCoreApplication::translate("OpenWith::Editors", "CMake Editor"));
addMimeType(Constants::CMAKEMIMETYPE);
addMimeType(Constants::CMAKEPROJECTMIMETYPE);

View File

@@ -45,8 +45,6 @@ public:
class CMakeEditorFactory : public TextEditor::TextEditorFactory
{
Q_OBJECT
public:
CMakeEditorFactory();
};

View File

@@ -33,7 +33,6 @@ namespace Constants {
const char CMAKEMIMETYPE[] = "text/x-cmake";
const char CMAKEPROJECTMIMETYPE[] = "text/x-cmake-project";
const char CMAKE_EDITOR_ID[] = "CMakeProject.CMakeEditor";
const char CMAKE_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("CMakeProjectManager::Internal::CMakeEditorFactory", "CMake Editor");
const char RUNCMAKE[] = "CMakeProject.RunCMake";
const char CLEARCMAKECACHE[] = "CMakeProject.ClearCache";
const char RESCANPROJECT[] = "CMakeProject.RescanProject";

View File

@@ -510,7 +510,7 @@ static TextEditor::TextDocument *createCompilationDatabaseDocument()
CompilationDatabaseEditorFactory::CompilationDatabaseEditorFactory()
{
setId(Constants::COMPILATIONDATABASEPROJECT_ID);
setDisplayName("Compilation Database");
setDisplayName(QCoreApplication::translate("OpenWith::Editors", "Compilation Database"));
addMimeType(Constants::COMPILATIONDATABASEMIMETYPE);
setEditorCreator([]() { return new TextEditor::BaseTextEditor; });

View File

@@ -88,8 +88,6 @@ public:
class CompilationDatabaseEditorFactory : public TextEditor::TextEditorFactory
{
Q_OBJECT
public:
CompilationDatabaseEditorFactory();
};

View File

@@ -42,13 +42,13 @@ Q_DECLARE_METATYPE(Core::Internal::MenuActionContainer*)
using namespace Utils;
namespace Core {
namespace Internal {
/*!
\class ActionContainer
\mainclass
\class Core::ActionContainer
\ingroup mainclasses
\inmodule QtCreator
\brief The ActionContainer class represents a menu or menu bar in Qt Creator.
\brief The ActionContainer class represents a menu or menu bar in \QC.
You don't create instances of this class directly, but instead use the
\l{ActionManager::createMenu()}, \l{ActionManager::createMenuBar()} and
@@ -58,23 +58,25 @@ namespace Internal {
Within a menu or menu bar you can group menus and items together by defining groups
(the order of the groups is defined by the order of the \l{ActionContainer::appendGroup()} calls), and
adding menus/actions to these groups. If no custom groups are defined, an action container
adding menus or actions to these groups. If no custom groups are defined, an action container
has three default groups \c{Core::Constants::G_DEFAULT_ONE}, \c{Core::Constants::G_DEFAULT_TWO}
and \c{Core::Constants::G_DEFAULT_THREE}.
You can define if the menu represented by this action container should automatically disable
or hide whenever it only contains disabled items and submenus by setting the corresponding
You can specify whether the menu represented by this action container should
be automatically disabled or hidden whenever it only contains disabled items
and submenus by setting the corresponding
\l{ActionContainer::setOnAllDisabledBehavior()}{OnAllDisabledBehavior}. The default is
ActionContainer::Disable for menus, and ActionContainer::Show for menu bars.
*/
/*!
\enum ActionContainer::OnAllDisabledBehavior
Defines what happens when the represented menu is empty or contains only disabled/invisible items.
Defines what happens when the represented menu is empty or contains only
disabled or invisible items.
\value Disable
The menu will be visible but disabled.
\value Hide
The menu will not be visible until the state of the subitems change.
The menu will not be visible until the state of the subitems changes.
\value Show
The menu will still be visible and active.
*/
@@ -90,7 +92,7 @@ namespace Internal {
/*!
\fn ActionContainer::onAllDisabledBehavior() const
Returns the \a behavior of the menu represented by this action container for the case
Returns the behavior of the menu represented by this action container for the case
whenever it only contains disabled items and submenus.
The default is ActionContainer::Disable for menus, and ActionContainer::Show for menu bars.
\sa ActionContainer::OnAllDisabledBehavior
@@ -122,9 +124,10 @@ namespace Internal {
/*!
\fn void ActionContainer::appendGroup(Id group)
Adds a group with the given \a identifier to the action container. Using groups
you can segment your action container into logical parts and add actions and
menus directly to these parts.
Adds \a group to the action container.
Use groups to segment your action container into logical parts. You can add
actions and menus directly into groups.
\sa addAction()
\sa addMenu()
*/
@@ -145,6 +148,45 @@ namespace Internal {
\sa addAction()
*/
/*!
\fn void ActionContainer::addMenu(ActionContainer *before, ActionContainer *menu)
Add \a menu as a submenu to this action container before the menu specified
by \a before.
\sa appendGroup()
\sa addAction()
*/
/*!
\fn ActionContainer::clear()
Clears this menu and submenus from all actions and submenus. However, does
does not destroy the submenus and commands, just removes them from their
parents.
*/
/*!
\fn ActionContainer::insertGroup(Id before, Id group)
Inserts \a group to the action container before the group specified by
\a before.
*/
/*!
\fn virtual Utils::TouchBar *ActionContainer::touchBar() const
Returns the touch bar that is represented by this action container.
*/
/*!
\fn ActionContainer::addSeparator(const Context &context, Id group, QAction **outSeparator)
Adds a separator to the end of the given \a group to the action container,
which is enabled for a given \a context. Returns the created separator
action, \a outSeparator.
*/
namespace Internal {
// ---------- ActionContainerPrivate ------------
/*!
@@ -293,15 +335,6 @@ void ActionContainerPrivate::addMenu(ActionContainer *before, ActionContainer *m
scheduleUpdate();
}
/*!
* Adds a separator to the end of the given \a group to the action container, which is enabled
* for a given \a context. The created separator action is returned through \a outSeparator.
*
* Returns the created Command for the separator.
*/
/*! \a context \a group \a outSeparator
* \internal
*/
Command *ActionContainerPrivate::addSeparator(const Context &context, Id group, QAction **outSeparator)
{
static int separatorIdCount = 0;
@@ -648,6 +681,11 @@ bool TouchBarActionContainer::updateInternal()
} // namespace Internal
/*!
Adds a separator to the end of \a group to the action container.
Returns the created separator.
*/
Command *ActionContainer::addSeparator(Id group)
{
static const Context context(Constants::C_GLOBAL);

View File

@@ -52,18 +52,18 @@ using namespace Core::Internal;
/*!
\class Core::ActionManager
\mainclass
\inmodule Qt Creator
\ingroup mainclasses
\inmodule QtCreator
\brief The ActionManager class is responsible for registration of menus and
menu items and keyboard shortcuts.
The ActionManager is the central bookkeeper of actions and their shortcuts and layout.
It is a singleton containing mostly static functions. If you need access to the instance,
e.g. for connecting to signals, is its ActionManager::instance() function.
e.g. for connecting to signals, call its ActionManager::instance() function.
The main reasons for the need of this class is to provide a central place where the user
can specify all his keyboard shortcuts, and to provide a solution for actions that should
The main reasons for the need of this class is to provide a central place where the users
can specify all their keyboard shortcuts, and to provide a solution for actions that should
behave differently in different contexts (like the copy/replace/undo/redo actions).
\section1 Contexts
@@ -147,7 +147,7 @@ using namespace Core::Internal;
*/
/*!
\fn void ActionManager::commandAdded(const QString &id)
\fn void ActionManager::commandAdded(Core::Id id)
Emitted when a command (with the \a id) is added.
*/
@@ -262,7 +262,7 @@ ActionContainer *ActionManager::createTouchBar(Id id, const QIcon &icon, const Q
for the currently active context.
If the optional \a context argument is not specified, the global context
will be assumed.
A scriptable action can be called from a script without the need for the user
A \a scriptable action can be called from a script without the need for the user
to interact with it.
*/
Command *ActionManager::registerAction(QAction *action, Id id, const Context &context, bool scriptable)
@@ -356,7 +356,7 @@ void ActionManager::unregisterAction(QAction *action, Id id)
/*!
Handles the display of the used shortcuts in the presentation mode. The presentation mode is
enabled when starting \QC with the command line argument \c{-presentationMode}. In the
\a enabled when starting \QC with the command line argument \c{-presentationMode}. In the
presentation mode, \QC displays any pressed shortcut in a grey box.
*/
void ActionManager::setPresentationModeEnabled(bool enabled)
@@ -377,11 +377,19 @@ void ActionManager::setPresentationModeEnabled(bool enabled)
d->m_presentationModeEnabled = enabled;
}
/*!
Returns whether presentation mode is enabled.
\sa setPresentationModeEnabled
*/
bool ActionManager::isPresentationModeEnabled()
{
return d->m_presentationModeEnabled;
}
/*!
\internal
*/
QString ActionManager::withNumberAccelerator(const QString &text, const int number)
{
if (Utils::HostOsInfo::isMacHost() || number > 9)

View File

@@ -40,9 +40,11 @@
/*!
\class Core::Command
\mainclass
\inmodule QtCreator
\ingroup mainclasses
\brief The Command class represents an action, such as a menu item, tool button, or shortcut.
You do not create Command objects directly, but use \l{ActionManager::registerAction()}
to register an action and retrieve a Command. The Command object represents the user visible
action and its properties. If multiple actions are registered with the same ID (but
@@ -69,13 +71,12 @@
This enum defines how the user visible action is updated when the active action changes.
The default is to update the enabled and visible state, and to disable the
user visible action when there is no active action.
\omitvalue CA_Mask
\value CA_UpdateText
Also update the actions text.
\value CA_UpdateIcon
Also update the actions icon.
\value CA_Hide
When there is no active action, hide the user "visible" action, instead of just
When there is no active action, hide the user-visible action, instead of just
disabling it.
\value CA_NonConfigurable
Flag to indicate that the keyboard shortcut of this Command should not be
@@ -150,6 +151,12 @@
no active action for the current context.
*/
/*!
\fn Context Command::context() const
Returns the context for this command.
*/
/*!
\fn void Command::setAttribute(CommandAttribute attribute)
Adds \a attribute to the attributes of this Command.
@@ -187,18 +194,48 @@
/*!
\fn bool Command::isScriptable(const Context &) const
Returns whether the Command is scriptable for the given context.
A scriptable command can be called from a script without the need for the user to
interact with it.
\internal
Returns whether the Command is scriptable.
*/
/*!
\fn void Command::activeStateChanged()
This signal is emitted when the active state of the command changes.
*/
/*!
\fn virtual void Command::setTouchBarText(const QString &text)
Sets the text for the action on the touch bar to \a text.
*/
/*!
\fn virtual QString Command::touchBarText() const
Returns the text for the action on the touch bar.
*/
/*!
\fn virtual void Command::setTouchBarIcon(const QIcon &icon)
Sets the icon for the action on the touch bar to \a icon.
*/
/*! \fn virtual QIcon Command::touchBarIcon() const
Returns the icon for the action on the touch bar.
*/
/*! \fn virtual QAction *Command::touchBarAction() const
Adds an action to the touch bar.
*/
namespace Core {
namespace Internal {
/*!
\class Action
\internal
*/
Action::Action(Id id)
: m_attributes({}),
m_id(id),
@@ -453,6 +490,10 @@ QAction *Action::touchBarAction() const
} // namespace Internal
/*!
Appends the keyboard shortcut that is currently assigned to the action \a a
to its tool tip.
*/
void Command::augmentActionWithShortcutToolTip(QAction *a) const
{
a->setToolTip(stringWithAppendedShortcut(a->text()));
@@ -464,6 +505,11 @@ void Command::augmentActionWithShortcutToolTip(QAction *a) const
});
}
/*!
Returns a tool button for \a action.
Appends the keyboard shortcut \a cmd to the tool tip of the action.
*/
QToolButton *Command::toolButtonWithAppendedShortcut(QAction *action, Command *cmd)
{
auto button = new QToolButton;

View File

@@ -34,6 +34,7 @@ using namespace Core;
/*!
\class Core::CommandButton
\inmodule QtCreator
\brief The CommandButton class is a tool button associated with one of
the registered Command objects.
@@ -42,12 +43,23 @@ using namespace Core;
key sequence which is automatically updated when user changes it.
*/
/*!
\property CommandButton::toolTipBase
\brief The tool tip base for the command button.
*/
/*!
\internal
*/
CommandButton::CommandButton(QWidget *parent)
: QToolButton(parent)
, m_command(nullptr)
{
}
/*!
\internal
*/
CommandButton::CommandButton(Id id, QWidget *parent)
: QToolButton(parent)
, m_command(nullptr)
@@ -55,6 +67,9 @@ CommandButton::CommandButton(Id id, QWidget *parent)
setCommandId(id);
}
/*!
Sets the ID of the command associated with this tool button to \a id.
*/
void CommandButton::setCommandId(Id id)
{
if (m_command)

View File

@@ -123,6 +123,12 @@ public:
} // namespace Internal
/*!
\class Core::CommandMappings
\inmodule QtCreator
\internal
*/
CommandMappings::CommandMappings(QWidget *parent)
: QWidget(parent), d(new Internal::CommandMappingsPrivate(this))
{

View File

@@ -64,13 +64,15 @@ Context::Context() :
}
/*!
\class CommandsFile
\class Core::Internal::CommandsFile
\internal
\inmodule QtCreator
\brief The CommandsFile class provides a collection of import and export commands.
\inheaderfile commandsfile.h
*/
/*!
...
\internal
*/
CommandsFile::CommandsFile(const QString &filename)
: m_filename(filename)
@@ -79,7 +81,7 @@ CommandsFile::CommandsFile(const QString &filename)
}
/*!
...
\internal
*/
QMap<QString, QKeySequence> CommandsFile::importCommands() const
{
@@ -123,7 +125,7 @@ QMap<QString, QKeySequence> CommandsFile::importCommands() const
}
/*!
...
\internal
*/
bool CommandsFile::exportCommands(const QList<ShortcutItem *> &items)

View File

@@ -64,8 +64,30 @@ public:
} // Internal
/*!
\class Core::BaseFileFilter
\inmodule QtCreator
\brief The BaseFileFilter class is a base class for locator filter classes.
*/
/*!
\class Core::BaseFileFilter::Iterator
\inmodule QtCreator
\internal
*/
/*!
\class Core::BaseFileFilter::ListIterator
\inmodule QtCreator
\internal
*/
BaseFileFilter::Iterator::~Iterator() = default;
/*!
\internal
*/
BaseFileFilter::BaseFileFilter()
: d(new Internal::BaseFileFilterPrivate)
{
@@ -73,11 +95,17 @@ BaseFileFilter::BaseFileFilter()
setFileIterator(new ListIterator({}));
}
/*!
\internal
*/
BaseFileFilter::~BaseFileFilter()
{
delete d;
}
/*!
\reimp
*/
void BaseFileFilter::prepareSearch(const QString &entry)
{
Q_UNUSED(entry)
@@ -104,6 +132,9 @@ ILocatorFilter::MatchLevel BaseFileFilter::matchLevelFor(const QRegularExpressio
return MatchLevel::Normal;
}
/*!
\reimp
*/
QList<LocatorFilterEntry> BaseFileFilter::matchesFor(QFutureInterface<LocatorFilterEntry> &future, const QString &origEntry)
{
QList<LocatorFilterEntry> entries[int(MatchLevel::Count)];
@@ -184,6 +215,9 @@ QList<LocatorFilterEntry> BaseFileFilter::matchesFor(QFutureInterface<LocatorFil
return std::accumulate(std::begin(entries), std::end(entries), QList<LocatorFilterEntry>());
}
/*!
\reimp
*/
void BaseFileFilter::accept(LocatorFilterEntry selection,
QString *newText, int *selectionStart, int *selectionLength) const
{
@@ -206,6 +240,9 @@ void BaseFileFilter::setFileIterator(BaseFileFilter::Iterator *iterator)
d->m_data.iterator.reset(iterator);
}
/*!
Returns the file iterator.
*/
QSharedPointer<BaseFileFilter::Iterator> BaseFileFilter::fileIterator()
{
return d->m_data.iterator;

View File

@@ -40,6 +40,12 @@ struct CommandLocatorPrivate
QList<Command *> commands;
};
/*!
\class Core::CommandLocator
\inmodule QtCreator
\internal
*/
CommandLocator::CommandLocator(Id id,
const QString &displayName,
const QString &shortCutString,

View File

@@ -37,6 +37,12 @@
namespace Core {
/*!
\class Core::DirectoryFilter
\inmodule QtCreator
\internal
*/
DirectoryFilter::DirectoryFilter(Id id)
: m_filters({"*.h", "*.cpp", "*.ui", "*.qrc"}),
m_exclusionFilters({"*/.git/*", "*/.cvs/*", "*/.svn/*"})

View File

@@ -41,13 +41,25 @@ using namespace Core;
/*!
\class Core::ILocatorFilter
\inmodule Qt Creator
\inmodule QtCreator
\brief The ILocatorFilter class adds a locator filter.
The filter is added to \uicontrol Tools > \uicontrol Locate.
*/
/*!
\class Core::LocatorFilterEntry
\inmodule QtCreator
\internal
*/
/*!
\class Core::LocatorFilterEntry::HighlightInfo
\inmodule QtCreator
\internal
*/
static QList<ILocatorFilter *> g_locatorFilters;
/*!
@@ -64,6 +76,9 @@ ILocatorFilter::~ILocatorFilter()
g_locatorFilters.removeOne(this);
}
/*!
Returns the list of all locator filters.
*/
const QList<ILocatorFilter *> ILocatorFilter::allLocatorFilters()
{
return g_locatorFilters;
@@ -207,11 +222,19 @@ Qt::CaseSensitivity ILocatorFilter::caseSensitivity(const QString &str)
return str == str.toLower() ? Qt::CaseInsensitive : Qt::CaseSensitive;
}
/*!
Creates the search term \a text as a regular expression with case
sensitivity set to \a caseSensitivity.
*/
QRegularExpression ILocatorFilter::createRegExp(const QString &text, Qt::CaseSensitivity caseSensitivity)
{
return FuzzyMatcher::createRegExp(text, caseSensitivity);
}
/*!
Returns information for highlighting the results of matching the regular
expression, specified by \a match, for the data of the type \a dataType.
*/
LocatorFilterEntry::HighlightInfo ILocatorFilter::highlightInfo(
const QRegularExpressionMatch &match, LocatorFilterEntry::HighlightInfo::DataType dataType)
{
@@ -288,7 +311,9 @@ bool ILocatorFilter::isIncludedByDefault() const
}
/*!
Sets whether using the shortcut string is required to use this filter.
Sets whether using the shortcut string is required to use this filter
to \a includedByDefault.
Call from the constructor of subclasses to change the default.
\sa isIncludedByDefault()
@@ -312,8 +337,8 @@ bool ILocatorFilter::isHidden() const
}
/*!
Hides the filter in the \uicontrol {Locator filters} filter,
menus, and locator settings. Call in the constructor of subclasses.
Sets the filter in the \uicontrol {Locator filters} filter, menus, and
locator settings to \a hidden. Call in the constructor of subclasses.
*/
void ILocatorFilter::setHidden(bool hidden)
{
@@ -344,6 +369,9 @@ Id ILocatorFilter::id() const
return m_id;
}
/*!
Returns the filter's action ID.
*/
Id ILocatorFilter::actionId() const
{
return m_id.withPrefix("Locator.");
@@ -373,7 +401,7 @@ ILocatorFilter::Priority ILocatorFilter::priority() const
}
/*!
Sets whether the filter is currently available.
Sets whether the filter is currently available to \a enabled.
\sa isEnabled()
*/
@@ -383,7 +411,7 @@ void ILocatorFilter::setEnabled(bool enabled)
}
/*!
Sets the filter's unique ID.
Sets the filter's unique \a id.
Subclasses must set the ID in their constructor.
\sa id()
@@ -394,7 +422,7 @@ void ILocatorFilter::setId(Id id)
}
/*!
Sets the priority of results of this filter in the result list.
Sets the \a priority of results of this filter in the result list.
\sa priority()
*/
@@ -404,7 +432,7 @@ void ILocatorFilter::setPriority(Priority priority)
}
/*!
Sets the translated display name of this filter.
Sets the translated display name of this filter to \a displayString.
Subclasses must set the display name in their constructor.
@@ -416,7 +444,7 @@ void ILocatorFilter::setDisplayName(const QString &displayString)
}
/*!
Sets whether the filter provides a configuration dialog.
Sets whether the filter provides a configuration dialog to \a configurable.
Most filters should at least provide the default dialog.
\sa isConfigurable()
@@ -475,3 +503,19 @@ void ILocatorFilter::setConfigurable(bool configurable)
The results for this filter are placed below the results for filters
that have other priorities.
*/
/*!
\enum ILocatorFilter::MatchLevel
This enum value holds the level for ordering the results based on how well
they match the search criteria.
\value Best
The result is the best match for the regular expression.
\value Better
\value Good
\value Normal
\value Count
The result has the highest number of matches for the regular
expression.
*/

View File

@@ -37,6 +37,23 @@
using namespace Core;
using namespace Core::Tests;
/*!
\class Core::Tests::BasicLocatorFilterTest
\inmodule QtCreator
\internal
*/
/*!
\class Core::Tests::TestDataDir
\inmodule QtCreator
\internal
*/
/*!
\namespace Core::Tests
\inmodule QtCreator
\internal
*/
BasicLocatorFilterTest::BasicLocatorFilterTest(ILocatorFilter *filter) : m_filter(filter)
{
}
@@ -54,6 +71,11 @@ QList<LocatorFilterEntry> BasicLocatorFilterTest::matchesFor(const QString &sear
return locatorSearch.results();
}
/*!
\class Core::Tests::ResultData
\inmodule QtCreator
\internal
*/
ResultData::ResultData() = default;
ResultData::ResultData(const QString &textColumn1, const QString &textColumn2,

View File

@@ -40,6 +40,12 @@ using namespace Core::Internal;
namespace Core {
/*!
\class Core::LocatorManager
\inmodule QtCreator
\internal
*/
LocatorManager::LocatorManager()
{
}

View File

@@ -119,6 +119,12 @@ void UrlFilterOptions::updateActionButtons()
// -- UrlLocatorFilter
/*!
\class Core::UrlLocatorFilter
\inmodule QtCreator
\internal
*/
UrlLocatorFilter::UrlLocatorFilter(Id id)
: UrlLocatorFilter(tr("URL Template"), id)
{}

View File

@@ -34,8 +34,6 @@ int languageVariant(const QString &mimeType);
class GlslEditorFactory : public TextEditor::TextEditorFactory
{
Q_OBJECT
public:
GlslEditorFactory();
};

View File

@@ -45,7 +45,7 @@ namespace Nim {
NimEditorFactory::NimEditorFactory()
{
setId(Constants::C_NIMEDITOR_ID);
setDisplayName(tr(Nim::Constants::C_EDITOR_DISPLAY_NAME));
setDisplayName(QCoreApplication::translate("OpenWith::Editors", "Nim Editor"));
addMimeType(QLatin1String(Nim::Constants::C_NIM_MIMETYPE));
addMimeType(QLatin1String(Nim::Constants::C_NIM_SCRIPT_MIMETYPE));

View File

@@ -29,14 +29,12 @@
namespace Nim {
class NimEditorFactory : public TextEditor::TextEditorFactory
class NimEditorFactory final : public TextEditor::TextEditorFactory
{
Q_OBJECT
public:
NimEditorFactory();
static void decorateEditor(TextEditor::TextEditorWidget *editor);
};
}
} // Nim

View File

@@ -34,7 +34,6 @@ namespace Constants {
const char C_NIMPROJECT_ID[] = "Nim.NimProject";
const char C_NIMBLEPROJECT_ID[] = "Nim.NimbleProject";
const char C_NIMEDITOR_ID[] = "Nim.NimEditor";
const char C_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("OpenWith::Editors", "Nim Editor");
// NimToolChain
const char C_NIMTOOLCHAIN_TYPEID[] = "Nim.NimToolChain";

View File

@@ -47,6 +47,23 @@ using namespace Utils;
namespace ProjectExplorer {
namespace Internal {
class DesktopRunConfiguration : public RunConfiguration
{
Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::Internal::DesktopRunConfiguration)
protected:
enum Kind { Qmake, Qbs, CMake }; // FIXME: Remove
DesktopRunConfiguration(Target *target, Core::Id id, Kind kind);
private:
void updateTargetInformation();
Utils::FilePath executableToRun(const BuildTargetInfo &targetInfo) const;
const Kind m_kind;
};
DesktopRunConfiguration::DesktopRunConfiguration(Target *target, Core::Id id, Kind kind)
: RunConfiguration(target, id), m_kind(kind)
{
@@ -148,7 +165,7 @@ Utils::FilePath DesktopRunConfiguration::executableToRun(const BuildTargetInfo &
// Factory
class DesktopQmakeRunConfiguration : public DesktopRunConfiguration
class DesktopQmakeRunConfiguration final : public DesktopRunConfiguration
{
public:
DesktopQmakeRunConfiguration(Target *target, Core::Id id)
@@ -156,7 +173,7 @@ public:
{}
};
class QbsRunConfiguration : public DesktopRunConfiguration
class QbsRunConfiguration final : public DesktopRunConfiguration
{
public:
QbsRunConfiguration(Target *target, Core::Id id)
@@ -164,7 +181,7 @@ public:
{}
};
class CMakeRunConfiguration : public DesktopRunConfiguration
class CMakeRunConfiguration final : public DesktopRunConfiguration
{
public:
CMakeRunConfiguration(Target *target, Core::Id id)

View File

@@ -31,36 +31,19 @@
namespace ProjectExplorer {
namespace Internal {
class DesktopRunConfiguration : public RunConfiguration
{
Q_OBJECT
protected:
enum Kind { Qmake, Qbs, CMake }; // FIXME: Remove
DesktopRunConfiguration(Target *target, Core::Id id, Kind kind);
private:
void updateTargetInformation();
Utils::FilePath executableToRun(const BuildTargetInfo &targetInfo) const;
const Kind m_kind;
};
class DesktopQmakeRunConfigurationFactory : public RunConfigurationFactory
class DesktopQmakeRunConfigurationFactory final : public RunConfigurationFactory
{
public:
DesktopQmakeRunConfigurationFactory();
};
class QbsRunConfigurationFactory : public RunConfigurationFactory
class QbsRunConfigurationFactory final : public RunConfigurationFactory
{
public:
QbsRunConfigurationFactory();
};
class CMakeRunConfigurationFactory : public RunConfigurationFactory
class CMakeRunConfigurationFactory final : public RunConfigurationFactory
{
public:
CMakeRunConfigurationFactory();

View File

@@ -2738,6 +2738,28 @@ static bool hasBuildSettings(const Project *pro)
});
}
static QPair<bool, QString> subprojectEnabledState(const Project *pro)
{
QPair<bool, QString> result;
result.first = true;
const QList<Project *> &projects = SessionManager::projectOrder(pro);
foreach (Project *project, projects) {
if (project && project->activeTarget()
&& project->activeTarget()->activeBuildConfiguration()
&& !project->activeTarget()->activeBuildConfiguration()->isEnabled()) {
result.first = false;
result.second
+= QCoreApplication::translate("ProjectExplorerPluginPrivate",
"Building \"%1\" is disabled: %2<br>")
.arg(project->displayName(),
project->activeTarget()->activeBuildConfiguration()->disabledReason());
}
}
return result;
}
QPair<bool, QString> ProjectExplorerPluginPrivate::buildSettingsEnabled(const Project *pro)
{
QPair<bool, QString> result;
@@ -2755,18 +2777,7 @@ QPair<bool, QString> ProjectExplorerPluginPrivate::buildSettingsEnabled(const Pr
result.first = false;
result.second = tr("Project has no build settings.");
} else {
const QList<Project *> & projects = SessionManager::projectOrder(pro);
foreach (Project *project, projects) {
if (project
&& project->activeTarget()
&& project->activeTarget()->activeBuildConfiguration()
&& !project->activeTarget()->activeBuildConfiguration()->isEnabled()) {
result.first = false;
result.second += tr("Building \"%1\" is disabled: %2<br>")
.arg(project->displayName(),
project->activeTarget()->activeBuildConfiguration()->disabledReason());
}
}
result = subprojectEnabledState(pro);
}
return result;
}
@@ -2785,18 +2796,7 @@ QPair<bool, QString> ProjectExplorerPluginPrivate::buildSettingsEnabledForSessio
result.first = false;
result.second = tr("Project has no build settings.");
} else {
foreach (Project *project, SessionManager::projectOrder(nullptr)) {
if (project
&& project->activeTarget()
&& project->activeTarget()->activeBuildConfiguration()
&& !project->activeTarget()->activeBuildConfiguration()->isEnabled()) {
result.first = false;
result.second += tr("Building \"%1\" is disabled: %2")
.arg(project->displayName(),
project->activeTarget()->activeBuildConfiguration()->disabledReason());
result.second += QLatin1Char('\n');
}
}
result = subprojectEnabledState(nullptr);
}
return result;
}

View File

@@ -32,8 +32,6 @@ namespace Internal {
class ProFileEditorFactory : public TextEditor::TextEditorFactory
{
Q_OBJECT
public:
ProFileEditorFactory();
};

View File

@@ -142,8 +142,6 @@ public:
class QMLJSEDITOR_EXPORT QmlJSEditorFactory : public TextEditor::TextEditorFactory
{
Q_OBJECT
public:
QmlJSEditorFactory();
QmlJSEditorFactory(Core::Id id);

View File

@@ -24,7 +24,6 @@
****************************************************************************/
#include "exampleslistmodel.h"
#include "screenshotcropper.h"
#include <QBuffer>
@@ -34,6 +33,8 @@
#include <QPixmapCache>
#include <QUrl>
#include <android/androidconstants.h>
#include <ios/iosconstants.h>
#include <coreplugin/helpmanager.h>
#include <coreplugin/icore.h>
@@ -216,6 +217,11 @@ int ExampleSetModel::getQtId(int i) const
return variant.toInt();
}
bool ExampleSetModel::selectedQtSupports(const Core::Id &target) const
{
return m_selectedQtTypes.contains(target);
}
int ExampleSetModel::getExtraExampleSetIndex(int i) const
{
QTC_ASSERT(i >= 0, return -1);
@@ -651,6 +657,10 @@ void ExampleSetModel::selectExampleSet(int index)
if (index != m_selectedExampleSetIndex) {
m_selectedExampleSetIndex = index;
writeCurrentIdToSettings(m_selectedExampleSetIndex);
if (getType(m_selectedExampleSetIndex) == ExampleSetModel::QtExampleSet) {
BaseQtVersion *selectedQtVersion = QtVersionManager::version(getQtId(m_selectedExampleSetIndex));
m_selectedQtTypes = selectedQtVersion->targetDeviceTypes();
}
emit selectedExampleSetChanged(m_selectedExampleSetIndex);
}
}
@@ -690,7 +700,8 @@ void ExampleSetModel::tryToInitialize()
ExamplesListModelFilter::ExamplesListModelFilter(ExamplesListModel *sourceModel, bool showTutorialsOnly, QObject *parent) :
Core::ListModelFilter(sourceModel, parent),
m_showTutorialsOnly(showTutorialsOnly)
m_showTutorialsOnly(showTutorialsOnly),
m_examplesListModel(sourceModel)
{
}
@@ -699,16 +710,30 @@ bool ExamplesListModelFilter::leaveFilterAcceptsRowBeforeFiltering(const Core::L
{
QTC_ASSERT(earlyExitResult, return false);
const ExampleItem *exampleItem = static_cast<const ExampleItem *>(item);
if (m_showTutorialsOnly && exampleItem->type != Tutorial) {
const bool isTutorial = static_cast<const ExampleItem *>(item)->type == Tutorial;
if (m_showTutorialsOnly) {
*earlyExitResult = isTutorial;
return !isTutorial;
}
if (isTutorial) {
*earlyExitResult = false;
return true;
}
if (!m_showTutorialsOnly && exampleItem->type != Example && exampleItem->type != Demo) {
if (m_examplesListModel->exampleSetModel()->selectedQtSupports(Android::Constants::ANDROID_DEVICE_TYPE)
&& !item->tags.contains("android")) {
*earlyExitResult = false;
return true;
}
if (m_examplesListModel->exampleSetModel()->selectedQtSupports(Ios::Constants::IOS_DEVICE_TYPE)
&& !item->tags.contains("ios")) {
*earlyExitResult = false;
return true;
}
return false;
}

View File

@@ -50,6 +50,7 @@ public:
int selectedExampleSet() const { return m_selectedExampleSetIndex; }
void selectExampleSet(int index);
QStringList exampleSources(QString *examplesInstallPath, QString *demosInstallPath);
bool selectedQtSupports(const Core::Id &target) const;
signals:
void selectedExampleSetChanged(int);
@@ -89,6 +90,7 @@ private:
QList<ExtraExampleSet> m_extraExampleSets;
QList<BaseQtVersion*> m_qtVersions;
int m_selectedExampleSetIndex = -1;
QSet<Core::Id> m_selectedQtTypes;
bool m_qtVersionManagerInitialized = false;
bool m_helpManagerInitialized = false;
@@ -158,6 +160,7 @@ protected:
bool *earlyExitResult) const override;
private:
const bool m_showTutorialsOnly;
ExamplesListModel *m_examplesListModel = nullptr;
};
} // namespace Internal

View File

@@ -87,8 +87,7 @@ public:
}
};
ScxmlEditorData::ScxmlEditorData(QObject *parent)
: QObject(parent)
ScxmlEditorData::ScxmlEditorData()
{
m_contexts.add(ScxmlEditor::Constants::C_SCXMLEDITOR);

View File

@@ -46,7 +46,7 @@ class ScxmlEditorData : public QObject
{
Q_OBJECT
public:
ScxmlEditorData(QObject *parent = nullptr);
ScxmlEditorData();
~ScxmlEditorData() override;
void fullInit();

View File

@@ -48,7 +48,7 @@ ScxmlEditorFactory::ScxmlEditorFactory()
setEditorCreator([this] {
if (!m_editorData) {
m_editorData = new ScxmlEditorData(this);
m_editorData = new ScxmlEditorData;
QGuiApplication::setOverrideCursor(Qt::WaitCursor);
m_editorData->fullInit();
QGuiApplication::restoreOverrideCursor();
@@ -56,3 +56,8 @@ ScxmlEditorFactory::ScxmlEditorFactory()
return m_editorData->createEditor();
});
}
ScxmlEditorFactory::~ScxmlEditorFactory()
{
delete m_editorData;
}

View File

@@ -36,6 +36,7 @@ class ScxmlEditorFactory final : public Core::IEditorFactory
{
public:
ScxmlEditorFactory();
~ScxmlEditorFactory();
private:
ScxmlEditorData* m_editorData = nullptr;

View File

@@ -33,58 +33,49 @@
#include <coreplugin/icore.h>
#include <QPointer>
namespace TextEditor {
struct DisplaySettingsPage::DisplaySettingsPagePrivate
class DisplaySettingsPagePrivate
{
public:
DisplaySettingsPagePrivate();
QPointer<QWidget> m_widget;
Internal::Ui::DisplaySettingsPage *m_page = nullptr;
DisplaySettings m_displaySettings;
MarginSettings m_marginSettings;
QString m_settingsPrefix;
};
DisplaySettingsPage::DisplaySettingsPagePrivate::DisplaySettingsPagePrivate()
DisplaySettingsPagePrivate::DisplaySettingsPagePrivate()
{
m_settingsPrefix = QLatin1String("text");
m_displaySettings.fromSettings(m_settingsPrefix, Core::ICore::settings());
m_marginSettings.fromSettings(m_settingsPrefix, Core::ICore::settings());
}
DisplaySettingsPage::DisplaySettingsPage()
: d(new DisplaySettingsPagePrivate)
class DisplaySettingsWidget final : public Core::IOptionsPageWidget
{
setId(Constants::TEXT_EDITOR_DISPLAY_SETTINGS);
setDisplayName(tr("Display"));
setCategory(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("TextEditor", "Text Editor"));
setCategoryIconPath(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY_ICON_PATH);
}
Q_DECLARE_TR_FUNCTIONS(TextEditor::DisplaySettingsPage)
DisplaySettingsPage::~DisplaySettingsPage()
{
delete d;
}
QWidget *DisplaySettingsPage::widget()
{
if (!d->m_widget) {
d->m_widget = new QWidget;
d->m_page = new Internal::Ui::DisplaySettingsPage;
d->m_page->setupUi(d->m_widget);
public:
DisplaySettingsWidget(DisplaySettingsPagePrivate *data)
: m_data(data)
{
m_ui.setupUi(this);
settingsToUI();
}
return d->m_widget;
}
void DisplaySettingsPage::apply()
void apply() final;
void settingsFromUI(DisplaySettings &displaySettings, MarginSettings &marginSettings) const;
void settingsToUI();
void setDisplaySettings(const DisplaySettings &, const MarginSettings &newMarginSettings);
DisplaySettingsPagePrivate *m_data = nullptr;
Internal::Ui::DisplaySettingsPage m_ui;
};
void DisplaySettingsWidget::apply()
{
if (!d->m_page) // page was never shown
return;
DisplaySettings newDisplaySettings;
MarginSettings newMarginSettings;
@@ -92,73 +83,64 @@ void DisplaySettingsPage::apply()
setDisplaySettings(newDisplaySettings, newMarginSettings);
}
void DisplaySettingsPage::finish()
{
delete d->m_widget;
if (!d->m_page) // page was never shown
return;
delete d->m_page;
d->m_page = nullptr;
}
void DisplaySettingsPage::settingsFromUI(DisplaySettings &displaySettings,
void DisplaySettingsWidget::settingsFromUI(DisplaySettings &displaySettings,
MarginSettings &marginSettings) const
{
displaySettings.m_displayLineNumbers = d->m_page->displayLineNumbers->isChecked();
displaySettings.m_textWrapping = d->m_page->enableTextWrapping->isChecked();
marginSettings.m_showMargin = d->m_page->showWrapColumn->isChecked();
marginSettings.m_marginColumn = d->m_page->wrapColumn->value();
displaySettings.m_visualizeWhitespace = d->m_page->visualizeWhitespace->isChecked();
displaySettings.m_displayFoldingMarkers = d->m_page->displayFoldingMarkers->isChecked();
displaySettings.m_highlightCurrentLine = d->m_page->highlightCurrentLine->isChecked();
displaySettings.m_highlightBlocks = d->m_page->highlightBlocks->isChecked();
displaySettings.m_animateMatchingParentheses = d->m_page->animateMatchingParentheses->isChecked();
displaySettings.m_highlightMatchingParentheses = d->m_page->highlightMatchingParentheses->isChecked();
displaySettings.m_markTextChanges = d->m_page->markTextChanges->isChecked();
displaySettings.m_autoFoldFirstComment = d->m_page->autoFoldFirstComment->isChecked();
displaySettings.m_centerCursorOnScroll = d->m_page->centerOnScroll->isChecked();
displaySettings.m_openLinksInNextSplit = d->m_page->openLinksInNextSplit->isChecked();
displaySettings.m_displayFileEncoding = d->m_page->displayFileEncoding->isChecked();
displaySettings.m_scrollBarHighlights = d->m_page->scrollBarHighlights->isChecked();
displaySettings.m_animateNavigationWithinFile = d->m_page->animateNavigationWithinFile->isChecked();
displaySettings.m_displayAnnotations = d->m_page->displayAnnotations->isChecked();
if (d->m_page->leftAligned->isChecked())
displaySettings.m_displayLineNumbers = m_ui.displayLineNumbers->isChecked();
displaySettings.m_textWrapping = m_ui.enableTextWrapping->isChecked();
marginSettings.m_showMargin = m_ui.showWrapColumn->isChecked();
marginSettings.m_marginColumn = m_ui.wrapColumn->value();
displaySettings.m_visualizeWhitespace = m_ui.visualizeWhitespace->isChecked();
displaySettings.m_displayFoldingMarkers = m_ui.displayFoldingMarkers->isChecked();
displaySettings.m_highlightCurrentLine = m_ui.highlightCurrentLine->isChecked();
displaySettings.m_highlightBlocks = m_ui.highlightBlocks->isChecked();
displaySettings.m_animateMatchingParentheses = m_ui.animateMatchingParentheses->isChecked();
displaySettings.m_highlightMatchingParentheses = m_ui.highlightMatchingParentheses->isChecked();
displaySettings.m_markTextChanges = m_ui.markTextChanges->isChecked();
displaySettings.m_autoFoldFirstComment = m_ui.autoFoldFirstComment->isChecked();
displaySettings.m_centerCursorOnScroll = m_ui.centerOnScroll->isChecked();
displaySettings.m_openLinksInNextSplit = m_ui.openLinksInNextSplit->isChecked();
displaySettings.m_displayFileEncoding = m_ui.displayFileEncoding->isChecked();
displaySettings.m_scrollBarHighlights = m_ui.scrollBarHighlights->isChecked();
displaySettings.m_animateNavigationWithinFile = m_ui.animateNavigationWithinFile->isChecked();
displaySettings.m_displayAnnotations = m_ui.displayAnnotations->isChecked();
if (m_ui.leftAligned->isChecked())
displaySettings.m_annotationAlignment = AnnotationAlignment::NextToContent;
else if (d->m_page->atMargin->isChecked())
else if (m_ui.atMargin->isChecked())
displaySettings.m_annotationAlignment = AnnotationAlignment::NextToMargin;
else if (d->m_page->rightAligned->isChecked())
else if (m_ui.rightAligned->isChecked())
displaySettings.m_annotationAlignment = AnnotationAlignment::RightSide;
else if (d->m_page->betweenLines->isChecked())
else if (m_ui.betweenLines->isChecked())
displaySettings.m_annotationAlignment = AnnotationAlignment::BetweenLines;
}
void DisplaySettingsPage::settingsToUI()
void DisplaySettingsWidget::settingsToUI()
{
const DisplaySettings &displaySettings = d->m_displaySettings;
const MarginSettings &marginSettings = d->m_marginSettings;
d->m_page->displayLineNumbers->setChecked(displaySettings.m_displayLineNumbers);
d->m_page->enableTextWrapping->setChecked(displaySettings.m_textWrapping);
d->m_page->showWrapColumn->setChecked(marginSettings.m_showMargin);
d->m_page->wrapColumn->setValue(marginSettings.m_marginColumn);
d->m_page->visualizeWhitespace->setChecked(displaySettings.m_visualizeWhitespace);
d->m_page->displayFoldingMarkers->setChecked(displaySettings.m_displayFoldingMarkers);
d->m_page->highlightCurrentLine->setChecked(displaySettings.m_highlightCurrentLine);
d->m_page->highlightBlocks->setChecked(displaySettings.m_highlightBlocks);
d->m_page->animateMatchingParentheses->setChecked(displaySettings.m_animateMatchingParentheses);
d->m_page->highlightMatchingParentheses->setChecked(displaySettings.m_highlightMatchingParentheses);
d->m_page->markTextChanges->setChecked(displaySettings.m_markTextChanges);
d->m_page->autoFoldFirstComment->setChecked(displaySettings.m_autoFoldFirstComment);
d->m_page->centerOnScroll->setChecked(displaySettings.m_centerCursorOnScroll);
d->m_page->openLinksInNextSplit->setChecked(displaySettings.m_openLinksInNextSplit);
d->m_page->displayFileEncoding->setChecked(displaySettings.m_displayFileEncoding);
d->m_page->scrollBarHighlights->setChecked(displaySettings.m_scrollBarHighlights);
d->m_page->animateNavigationWithinFile->setChecked(displaySettings.m_animateNavigationWithinFile);
d->m_page->displayAnnotations->setChecked(displaySettings.m_displayAnnotations);
const DisplaySettings &displaySettings = m_data->m_displaySettings;
const MarginSettings &marginSettings = m_data->m_marginSettings;
m_ui.displayLineNumbers->setChecked(displaySettings.m_displayLineNumbers);
m_ui.enableTextWrapping->setChecked(displaySettings.m_textWrapping);
m_ui.showWrapColumn->setChecked(marginSettings.m_showMargin);
m_ui.wrapColumn->setValue(marginSettings.m_marginColumn);
m_ui.visualizeWhitespace->setChecked(displaySettings.m_visualizeWhitespace);
m_ui.displayFoldingMarkers->setChecked(displaySettings.m_displayFoldingMarkers);
m_ui.highlightCurrentLine->setChecked(displaySettings.m_highlightCurrentLine);
m_ui.highlightBlocks->setChecked(displaySettings.m_highlightBlocks);
m_ui.animateMatchingParentheses->setChecked(displaySettings.m_animateMatchingParentheses);
m_ui.highlightMatchingParentheses->setChecked(displaySettings.m_highlightMatchingParentheses);
m_ui.markTextChanges->setChecked(displaySettings.m_markTextChanges);
m_ui.autoFoldFirstComment->setChecked(displaySettings.m_autoFoldFirstComment);
m_ui.centerOnScroll->setChecked(displaySettings.m_centerCursorOnScroll);
m_ui.openLinksInNextSplit->setChecked(displaySettings.m_openLinksInNextSplit);
m_ui.displayFileEncoding->setChecked(displaySettings.m_displayFileEncoding);
m_ui.scrollBarHighlights->setChecked(displaySettings.m_scrollBarHighlights);
m_ui.animateNavigationWithinFile->setChecked(displaySettings.m_animateNavigationWithinFile);
m_ui.displayAnnotations->setChecked(displaySettings.m_displayAnnotations);
switch (displaySettings.m_annotationAlignment) {
case AnnotationAlignment::NextToContent: d->m_page->leftAligned->setChecked(true); break;
case AnnotationAlignment::NextToMargin: d->m_page->atMargin->setChecked(true); break;
case AnnotationAlignment::RightSide: d->m_page->rightAligned->setChecked(true); break;
case AnnotationAlignment::BetweenLines: d->m_page->betweenLines->setChecked(true); break;
case AnnotationAlignment::NextToContent: m_ui.leftAligned->setChecked(true); break;
case AnnotationAlignment::NextToMargin: m_ui.atMargin->setChecked(true); break;
case AnnotationAlignment::RightSide: m_ui.rightAligned->setChecked(true); break;
case AnnotationAlignment::BetweenLines: m_ui.betweenLines->setChecked(true); break;
}
}
@@ -172,22 +154,38 @@ const MarginSettings &DisplaySettingsPage::marginSettings() const
return d->m_marginSettings;
}
void DisplaySettingsPage::setDisplaySettings(const DisplaySettings &newDisplaySettings,
void DisplaySettingsWidget::setDisplaySettings(const DisplaySettings &newDisplaySettings,
const MarginSettings &newMarginSettings)
{
if (newDisplaySettings != d->m_displaySettings) {
d->m_displaySettings = newDisplaySettings;
d->m_displaySettings.toSettings(d->m_settingsPrefix, Core::ICore::settings());
if (newDisplaySettings != m_data->m_displaySettings) {
m_data->m_displaySettings = newDisplaySettings;
m_data->m_displaySettings.toSettings(m_data->m_settingsPrefix, Core::ICore::settings());
emit TextEditorSettings::instance()->displaySettingsChanged(newDisplaySettings);
}
if (newMarginSettings != d->m_marginSettings) {
d->m_marginSettings = newMarginSettings;
d->m_marginSettings.toSettings(d->m_settingsPrefix, Core::ICore::settings());
if (newMarginSettings != m_data->m_marginSettings) {
m_data->m_marginSettings = newMarginSettings;
m_data->m_marginSettings.toSettings(m_data->m_settingsPrefix, Core::ICore::settings());
emit TextEditorSettings::instance()->marginSettingsChanged(newMarginSettings);
}
}
DisplaySettingsPage::DisplaySettingsPage()
: d(new DisplaySettingsPagePrivate)
{
setId(Constants::TEXT_EDITOR_DISPLAY_SETTINGS);
setDisplayName(DisplaySettingsWidget::tr("Display"));
setCategory(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("TextEditor", "Text Editor"));
setCategoryIconPath(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY_ICON_PATH);
setWidgetCreator([this] { return new DisplaySettingsWidget(d); });
}
DisplaySettingsPage::~DisplaySettingsPage()
{
delete d;
}
} // TextEditor

View File

@@ -25,37 +25,24 @@
#pragma once
#include "texteditor_global.h"
#include <coreplugin/dialogs/ioptionspage.h>
namespace TextEditor {
class DisplaySettings;
class MarginSettings;
class DisplaySettingsPagePrivate;
class DisplaySettingsPage : public Core::IOptionsPage
{
Q_OBJECT
public:
DisplaySettingsPage();
~DisplaySettingsPage() override;
// IOptionsPage
QWidget *widget() override;
void apply() override;
void finish() override;
const DisplaySettings &displaySettings() const;
const MarginSettings &marginSettings() const;
private:
void settingsFromUI(DisplaySettings &displaySettings, MarginSettings &marginSettings) const;
void settingsToUI();
void setDisplaySettings(const DisplaySettings &, const MarginSettings &newMarginSettings);
struct DisplaySettingsPagePrivate;
DisplaySettingsPagePrivate *d;
};

View File

@@ -31,8 +31,6 @@ namespace TextEditor {
class TEXTEDITOR_EXPORT PlainTextEditorFactory : public TextEditor::TextEditorFactory
{
Q_OBJECT
public:
PlainTextEditorFactory();
static PlainTextEditorFactory *instance();

View File

@@ -634,7 +634,6 @@ private:
class TEXTEDITOR_EXPORT TextEditorFactory : public Core::IEditorFactory
{
Q_OBJECT
public:
TextEditorFactory();

View File

@@ -252,10 +252,6 @@ void VcsBaseClientImpl::saveSettings()
settings().writeSettings(Core::ICore::settings());
}
VcsBaseClient::StatusItem::StatusItem(const QString &s, const QString &f) :
flags(s), file(f)
{ }
VcsBaseClient::VcsBaseClient(VcsBaseClientSettings *settings) :
VcsBaseClientImpl(settings)
{

View File

@@ -140,7 +140,6 @@ public:
{
public:
StatusItem() = default;
StatusItem(const QString &s, const QString &f);
QString flags;
QString file;
};

View File

@@ -44,7 +44,7 @@ bool MyPlugin1::initialize(const QStringList & /*arguments*/, QString *errorStri
bool found2 = false;
bool found3 = false;
foreach (QObject *object, ExtensionSystem::PluginManager::allObjects()) {
for (QObject *object : ExtensionSystem::PluginManager::allObjects()) {
if (object->objectName() == QLatin1String("MyPlugin2"))
found2 = true;
else if (object->objectName() == QLatin1String("MyPlugin3"))

View File

@@ -43,7 +43,7 @@ bool MyPlugin3::initialize(const QStringList & /*arguments*/, QString *errorStri
ExtensionSystem::PluginManager::addObject(object1);
bool found2 = false;
foreach (QObject *object, ExtensionSystem::PluginManager::allObjects()) {
for (QObject *object : ExtensionSystem::PluginManager::allObjects()) {
if (object->objectName() == QLatin1String("MyPlugin2"))
found2 = true;
}