ExtensionSystem: Add PluginId and VendorId

Change-Id: I4f47f95e1f4ff4af73c2b81320087b4592007993
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-08-27 10:03:35 +02:00
parent 324b62ce61
commit 587cf11530
139 changed files with 701 additions and 324 deletions

View File

@@ -400,7 +400,7 @@ function(add_qtc_plugin target_name)
get_property(_v TARGET "${i}" PROPERTY _arg_VERSION) get_property(_v TARGET "${i}" PROPERTY _arg_VERSION)
endif() endif()
string(APPEND _arg_DEPENDENCY_STRING string(APPEND _arg_DEPENDENCY_STRING
" { \"Name\" : \"${i}\", \"Version\" : \"${_v}\" }" " { \"Id\" : \"${i}\", \"Version\" : \"${_v}\" }"
) )
endforeach(i) endforeach(i)
foreach(i IN LISTS _arg_PLUGIN_RECOMMENDS) foreach(i IN LISTS _arg_PLUGIN_RECOMMENDS)
@@ -411,7 +411,7 @@ function(add_qtc_plugin target_name)
get_property(_v TARGET "${i}" PROPERTY _arg_VERSION) get_property(_v TARGET "${i}" PROPERTY _arg_VERSION)
endif() endif()
string(APPEND _arg_DEPENDENCY_STRING string(APPEND _arg_DEPENDENCY_STRING
" { \"Name\" : \"${i}\", \"Version\" : \"${_v}\", \"Type\" : \"optional\" }" " { \"Id\" : \"${i}\", \"Version\" : \"${_v}\", \"Type\" : \"optional\" }"
) )
endforeach(i) endforeach(i)
foreach(i IN LISTS _arg_PLUGIN_TEST_DEPENDS) foreach(i IN LISTS _arg_PLUGIN_TEST_DEPENDS)
@@ -420,7 +420,7 @@ function(add_qtc_plugin target_name)
endif() endif()
set(_v ${IDE_VERSION}) set(_v ${IDE_VERSION})
string(APPEND _arg_DEPENDENCY_STRING string(APPEND _arg_DEPENDENCY_STRING
" { \"Name\" : \"${i}\", \"Version\" : \"${_v}\", \"Type\" : \"test\" }" " { \"Id\" : \"${i}\", \"Version\" : \"${_v}\", \"Type\" : \"test\" }"
) )
endforeach(i) endforeach(i)
list(LENGTH _arg_PLUGIN_MANUAL_DEPENDS manualdep_len) list(LENGTH _arg_PLUGIN_MANUAL_DEPENDS manualdep_len)
@@ -430,11 +430,11 @@ function(add_qtc_plugin target_name)
foreach (i RANGE 0 ${manualdep_maxindex} 3) foreach (i RANGE 0 ${manualdep_maxindex} 3)
math(EXPR dep_version_i "${i} + 1") math(EXPR dep_version_i "${i} + 1")
math(EXPR dep_type_i "${i} + 2") math(EXPR dep_type_i "${i} + 2")
list(GET _arg_PLUGIN_MANUAL_DEPENDS ${i} dep_name) list(GET _arg_PLUGIN_MANUAL_DEPENDS ${i} dep_id)
list(GET _arg_PLUGIN_MANUAL_DEPENDS ${dep_version_i} dep_version) list(GET _arg_PLUGIN_MANUAL_DEPENDS ${dep_version_i} dep_version)
list(GET _arg_PLUGIN_MANUAL_DEPENDS ${dep_type_i} dep_type) list(GET _arg_PLUGIN_MANUAL_DEPENDS ${dep_type_i} dep_type)
string(APPEND _arg_DEPENDENCY_STRING string(APPEND _arg_DEPENDENCY_STRING
" { \"Name\" : \"${dep_name}\", \"Version\" : \"${dep_version}\", \"Type\" : \"${dep_type}\" }" " { \"Id\" : \"${dep_id}\", \"Version\" : \"${dep_version}\", \"Type\" : \"${dep_type}\" }"
) )
endforeach() endforeach()
endif() endif()

View File

@@ -59,7 +59,7 @@
\li Disable the startup check for a previously crashed \QC instance. \li Disable the startup check for a previously crashed \QC instance.
\row \row
\li -load <plugin> \li -load <plugin-id>
\li Enable the specified plugin and all plugins that it depends on. \li Enable the specified plugin and all plugins that it depends on.
You can combine \c -load and \c -noload options and specify both You can combine \c -load and \c -noload options and specify both
options multiple times to enable and disable several plugins. options multiple times to enable and disable several plugins.
@@ -70,7 +70,7 @@
\li Enable all plugins. \li Enable all plugins.
\row \row
\li -noload <plugin> \li -noload <plugin-id>
\li Disable the specified plugin and all plugins that depend on it. \li Disable the specified plugin and all plugins that depend on it.
\row \row

View File

@@ -1,10 +1,12 @@
{ {
//! [1] //! [1]
"Id" : "example",
"Name" : "Example", "Name" : "Example",
"Version" : "0.0.1", "Version" : "0.0.1",
"CompatVersion" : "0.0.1", "CompatVersion" : "0.0.1",
//! [1] //! [1]
//! [2] //! [2]
"VendorId" : "mycompany",
"Vendor" : "MyCompany", "Vendor" : "MyCompany",
"Copyright" : "(C) MyCompany", "Copyright" : "(C) MyCompany",
"License" : "Put short license information here", "License" : "Put short license information here",

View File

@@ -255,8 +255,8 @@
\snippet exampleplugin/Example.json.in 3 \snippet exampleplugin/Example.json.in 3
The \c {IDE_PLUGIN_DEPENDENCIES} variable is automatically replaced by the The \c {IDE_PLUGIN_DEPENDENCIES} variable is automatically replaced by the
dependency information in \c {QTC_PLUGIN_DEPENDS} and dependency information in \c {PLUGIN_DEPENDS} amd \c {PLUGIN_RECOMMENDS}
\c {QTC_PLUGIN_RECOMMENDS} from your plugin's \c {.pro} file. from your plugin's \c {add_qtc_plugin()} call in its \c {CMakeLists.txt} file.
\section1 Plugin Class \section1 Plugin Class

View File

@@ -17,7 +17,7 @@
\section2 Main Keys \section2 Main Keys
The main keys that are used to identify your your plugin and define default loading behavior, The main keys that are used to identify your your plugin and define default loading behavior,
consist of the mandatory keys \c Name and \c Version, and the optional keys \c CompatVersion, consist of the mandatory keys \c Id and \c Version, and the optional keys \c CompatVersion,
\c Experimental, \c DisabledByDefault, \c Required and \c Platform. \c Experimental, \c DisabledByDefault, \c Required and \c Platform.
\table \table
\header \header
@@ -25,10 +25,14 @@
\li Value Type \li Value Type
\li Meaning \li Meaning
\row \row
\li Name \li Id
\li String \li String
\li This is used as an identifier for the plugin and can e.g. \li This is used as an identifier for the plugin and can e.g.
be referenced in other plugin's dependencies. be referenced in other plugin's dependencies.
\row
\li Name
\li String
\li This is used as the display name of your plugin in the UI.
\row \row
\li Version \li Version
\li String \li String
@@ -146,36 +150,37 @@
these other plugins are loaded before this plugin. these other plugins are loaded before this plugin.
Dependencies are declared with the key \c Dependency, which contains an array of JSON objects Dependencies are declared with the key \c Dependency, which contains an array of JSON objects
with required keys \c Name and \c Version, and optional key \c Type. with required keys \c Id and \c Version, and optional key \c Type.
The following formulas illustrate how the dependency information is matched. The following formulas illustrate how the dependency information is matched.
In the formulas the name of the required plugin (as defined in the \c Name of the dependency In the formulas the Id of the required plugin (as defined in the \c Id of the dependency
object) is denoted as \c DependencyName object) is denoted as \c DependencyId
and the required version of the plugin is denoted as \c DependencyVersion. and the required version of the plugin is denoted as \c DependencyVersion.
A plugin with given \c Name, \c Version and \c CompatVersion A plugin with given \c Id, \c Version and \c CompatVersion
as defined in the plugin meta data matches as defined in the plugin meta data matches
the dependency if the dependency if
\list \list
\li its \c Name matches \c DependencyName, and \li its \c Id matches \c DependencyId, and
\li \c {CompatVersion <= DependencyVersion <= Version}. \li \c {CompatVersion <= DependencyVersion <= Version}.
\endlist \endlist
For example a dependency For example a dependency
\code \code
{ {
"Name" : "SomeOtherPlugin", "Id" : "someotherplugin",
"Version" : "2.3.0_2" "Version" : "2.3.0_2"
} }
\endcode \endcode
would be matched by a plugin with would be matched by a plugin with
\code \code
{ {
"Id" : "someotherplugin",
"Name" : "SomeOtherPlugin", "Name" : "SomeOtherPlugin",
"Version" : "3.1.0", "Version" : "3.1.0",
"CompatVersion" : "2.2.0", "CompatVersion" : "2.2.0",
... ...
} }
\endcode \endcode
since the name matches, and the version \c{2.3.0_2} given in the dependency tag since the id matches, and the version \c{2.3.0_2} given in the dependency tag
lies in the range of \c{2.2.0} and \c{3.1.0}. lies in the range of \c{2.2.0} and \c{3.1.0}.
\table \table
@@ -196,9 +201,9 @@
\li Value Type \li Value Type
\li Meaning \li Meaning
\row \row
\li Name \li Id
\li String \li String
\li The name of the plugin, on which this plugin relies. \li The Id of the plugin, on which this plugin relies.
\row \row
\li Version \li Version
\li String \li String
@@ -298,9 +303,11 @@
\code \code
{ {
"Id" : "test",
"Name" : "Test", "Name" : "Test",
"Version" : "1.0.1", "Version" : "1.0.1",
"CompatVersion" : "1.0.0", "CompatVersion" : "1.0.0",
"VendorId" : "mycompany",
"Vendor" : "My Company", "Vendor" : "My Company",
"Copyright" : "(C) 2016 MyCompany", "Copyright" : "(C) 2016 MyCompany",
"License" : [ "License" : [
@@ -323,8 +330,8 @@
} }
], ],
"Dependencies" : [ "Dependencies" : [
{ "Name" : "SomeOtherPlugin", "Version" : "2.3.0_2" }, { "Id" : "someotherplugin", "Version" : "2.3.0_2" },
{ "Name" : "EvenOther", "Version" : "1.0.0" } { "Id" : "evenother", "Version" : "1.0.0" }
] ]
} }
\endcode \endcode

View File

@@ -60,7 +60,7 @@ Module {
var depdeps = deps[d].dependencies; var depdeps = deps[d].dependencies;
for (var dd in depdeps) { for (var dd in depdeps) {
if (depdeps[dd].name == 'pluginjson') { if (depdeps[dd].name == 'pluginjson') {
cmd.plugin_depends.push(deps[d].name); cmd.plugin_depends.push(deps[d].id);
break; break;
} }
} }
@@ -87,13 +87,13 @@ Module {
vars['QTC_PLUGIN_REVISION'] = product.vcs ? (product.vcs.repoState || "") : ""; vars['QTC_PLUGIN_REVISION'] = product.vcs ? (product.vcs.repoState || "") : "";
var deplist = []; var deplist = [];
for (i in plugin_depends) { for (i in plugin_depends) {
deplist.push(" { \"Name\" : \"" + plugin_depends[i] + "\", \"Version\" : \"" + qtcVersion + "\" }"); deplist.push(" { \"Id\" : \"" + plugin_depends[i] + "\", \"Version\" : \"" + qtcVersion + "\" }");
} }
for (i in plugin_recommends) { for (i in plugin_recommends) {
deplist.push(" { \"Name\" : \"" + plugin_recommends[i] + "\", \"Version\" : \"" + qtcVersion + "\", \"Type\" : \"optional\" }"); deplist.push(" { \"Id\" : \"" + plugin_recommends[i] + "\", \"Version\" : \"" + qtcVersion + "\", \"Type\" : \"optional\" }");
} }
for (i in plugin_test_depends) { for (i in plugin_test_depends) {
deplist.push(" { \"Name\" : \"" + plugin_test_depends[i] + "\", \"Version\" : \"" + qtcVersion + "\", \"Type\" : \"test\" }"); deplist.push(" { \"Id\" : \"" + plugin_test_depends[i] + "\", \"Version\" : \"" + qtcVersion + "\", \"Type\" : \"test\" }");
} }
deplist = deplist.join(",\n") deplist = deplist.join(",\n")
vars['IDE_PLUGIN_DEPENDENCIES'] = "\"Dependencies\" : [\n" + deplist + "\n ]"; vars['IDE_PLUGIN_DEPENDENCIES'] = "\"Dependencies\" : [\n" + deplist + "\n ]";
@@ -109,4 +109,3 @@ Module {
} }
} }
} }

View File

@@ -1,9 +1,11 @@
-- Copyright (C) 2024 The Qt Company Ltd. -- Copyright (C) 2024 The Qt Company Ltd.
-- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
return { return {
Name = "AIAssistant", Id = "aiassistant",
Name = "Qt AI Assistant",
Version = "1.0.0", Version = "1.0.0",
CompatVersion = "1.0.0", CompatVersion = "1.0.0",
VendorId = "theqtcompany",
Vendor = "The Qt Company", Vendor = "The Qt Company",
Category = "Language Client", Category = "Language Client",
Description = "Qt AI Assistant", Description = "Qt AI Assistant",
@@ -17,8 +19,8 @@ You also need one of the following valid Qt licenses: Qt for Application Develop
You will need access to a LLM for the suggestions. You can use a subscription to a commercial, cloud-hosted LLM, a privately hosted or on-premise LLM, or a Small Language Model running locally on your computer. You will need access to a LLM for the suggestions. You can use a subscription to a commercial, cloud-hosted LLM, a privately hosted or on-premise LLM, or a Small Language Model running locally on your computer.
]], ]],
Dependencies = { Dependencies = {
{ Name = "Lua", Version = "14.0.0" }, { Id = "lua", Version = "14.0.0" },
{ Name = "LuaLanguageClient", Version = "14.0.0" } { Id = "lualanguageclient", Version = "14.0.0" }
}, },
hooks = { hooks = {
editors = { editors = {

View File

@@ -1,9 +1,11 @@
-- Copyright (C) 2024 The Qt Company Ltd. -- Copyright (C) 2024 The Qt Company Ltd.
-- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
return { return {
Id = "lualanguageserver",
Name = "Lua Language Server", Name = "Lua Language Server",
Version = "1.0.0", Version = "1.0.0",
CompatVersion = "1.0.0", CompatVersion = "1.0.0",
VendorId = "theqtcompany",
Vendor = "The Qt Company", Vendor = "The Qt Company",
Category = "Language Client", Category = "Language Client",
Description = "The Lua Language Server", Description = "The Lua Language Server",
@@ -14,8 +16,8 @@ This plugin provides the Lua Language Server.
It will try to install it if it is not found. It will try to install it if it is not found.
]], ]],
Dependencies = { Dependencies = {
{ Name = "Lua", Version = "14.0.0" }, { Id = "lua", Version = "14.0.0" },
{ Name = "LuaLanguageClient", Version = "14.0.0" } { Id = "lualanguageclient", Version = "14.0.0" }
}, },
setup = function() setup = function()
require 'init'.setup() require 'init'.setup()

View File

@@ -1,9 +1,11 @@
-- Copyright (C) 2024 The Qt Company Ltd. -- Copyright (C) 2024 The Qt Company Ltd.
-- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
return { return {
Id = "luatests",
Name = "Lua Tests", Name = "Lua Tests",
Version = "1.0.0", Version = "1.0.0",
CompatVersion = "1.0.0", CompatVersion = "1.0.0",
VendorId = "theqtcompany",
Vendor = "The Qt Company", Vendor = "The Qt Company",
Category = "Tests", Category = "Tests",
DisabledByDefault = true, DisabledByDefault = true,
@@ -13,7 +15,7 @@ return {
It has tests for (almost) all functionality exposed by the API. It has tests for (almost) all functionality exposed by the API.
]], ]],
Dependencies = { Dependencies = {
{ Name = "Lua", Version = "14.0.0" } { Id = "lua", Version = "14.0.0" }
}, },
setup = function() require 'tests'.setup() end, setup = function() require 'tests'.setup() end,
printToOutputPane = true, printToOutputPane = true,

View File

@@ -1,9 +1,11 @@
-- Copyright (C) 2024 The Qt Company Ltd. -- Copyright (C) 2024 The Qt Company Ltd.
-- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -- SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
return { return {
Id = "rustlanguageserver",
Name = "Rust Language Server", Name = "Rust Language Server",
Version = "1.0.0", Version = "1.0.0",
CompatVersion = "1.0.0", CompatVersion = "1.0.0",
VendorId = "theqtcompany",
Vendor = "The Qt Company", Vendor = "The Qt Company",
Category = "Language Client", Category = "Language Client",
Description = "The Rust Language Server", Description = "The Rust Language Server",
@@ -14,8 +16,8 @@ This plugin provides the Rust Language Server.
It will try to install it if it is not found. It will try to install it if it is not found.
]], ]],
Dependencies = { Dependencies = {
{ Name = "Lua", Version = "14.0.0" }, { Id = "lua", Version = "14.0.0" },
{ Name = "LuaLanguageClient", Version = "14.0.0" } { Id = "lualanguageclient", Version = "14.0.0" }
}, },
setup = function() setup = function()
require 'init'.setup() require 'init'.setup()

View File

@@ -41,14 +41,16 @@ local function setup()
end end
return { return {
Id = "tellajoke",
Name = "Tell A Joke", Name = "Tell A Joke",
Version = "1.0.0", Version = "1.0.0",
CompatVersion = "1.0.0", CompatVersion = "1.0.0",
VendorId = "theqtcompany",
Vendor = "The Qt Company", Vendor = "The Qt Company",
Category = "Fun", Category = "Fun",
Description = "This plugin adds an action that tells a joke.", Description = "This plugin adds an action that tells a joke.",
Dependencies = { Dependencies = {
{ Name = "Lua", Version = "14.0.0" }, { Id = "lua", Version = "14.0.0" },
}, },
setup = setup, setup = setup,
} --[[@as QtcPlugin]] } --[[@as QtcPlugin]]

View File

@@ -109,18 +109,18 @@ bool OptionsParser::checkForTestOptions()
}); });
} else { } else {
QStringList args = m_currentArg.split(QLatin1Char(',')); QStringList args = m_currentArg.split(QLatin1Char(','));
const QString pluginName = args.takeFirst(); const QString pluginId = args.takeFirst();
if (PluginSpec *spec = m_pmPrivate->pluginByName(pluginName)) { if (PluginSpec *spec = m_pmPrivate->pluginById(pluginId.toLower())) {
if (m_pmPrivate->containsTestSpec(spec)) { if (m_pmPrivate->containsTestSpec(spec)) {
if (m_errorString) if (m_errorString)
*m_errorString = Tr::tr("The plugin \"%1\" is specified twice for testing.").arg(pluginName); *m_errorString = Tr::tr("The plugin \"%1\" is specified twice for testing.").arg(pluginId);
m_hasError = true; m_hasError = true;
} else { } else {
m_pmPrivate->testSpecs.emplace_back(spec, args); m_pmPrivate->testSpecs.emplace_back(spec, args);
} }
} else { } else {
if (m_errorString) if (m_errorString)
*m_errorString = Tr::tr("The plugin \"%1\" does not exist.").arg(pluginName); *m_errorString = Tr::tr("The plugin \"%1\" does not exist.").arg(pluginId);
m_hasError = true; m_hasError = true;
} }
} }
@@ -128,7 +128,7 @@ bool OptionsParser::checkForTestOptions()
return true; return true;
} else if (m_currentArg == QLatin1String(NOTEST_OPTION)) { } else if (m_currentArg == QLatin1String(NOTEST_OPTION)) {
if (nextToken(RequiredToken)) { if (nextToken(RequiredToken)) {
if (PluginSpec *spec = m_pmPrivate->pluginByName(m_currentArg)) { if (PluginSpec *spec = m_pmPrivate->pluginById(m_currentArg.toLower())) {
if (!m_pmPrivate->containsTestSpec(spec)) { if (!m_pmPrivate->containsTestSpec(spec)) {
if (m_errorString) if (m_errorString)
*m_errorString = Tr::tr("The plugin \"%1\" is not tested.").arg(m_currentArg); *m_errorString = Tr::tr("The plugin \"%1\" is not tested.").arg(m_currentArg);
@@ -179,7 +179,7 @@ bool OptionsParser::checkForLoadOption()
spec->setForceEnabled(true); spec->setForceEnabled(true);
m_isDependencyRefreshNeeded = true; m_isDependencyRefreshNeeded = true;
} else { } else {
PluginSpec *spec = m_pmPrivate->pluginByName(m_currentArg); PluginSpec *spec = m_pmPrivate->pluginById(m_currentArg.toLower());
if (!spec) { if (!spec) {
if (m_errorString) if (m_errorString)
*m_errorString = Tr::tr("The plugin \"%1\" does not exist.").arg(m_currentArg); *m_errorString = Tr::tr("The plugin \"%1\" does not exist.").arg(m_currentArg);
@@ -204,7 +204,7 @@ bool OptionsParser::checkForNoLoadOption()
spec->setForceDisabled(true); spec->setForceDisabled(true);
m_isDependencyRefreshNeeded = true; m_isDependencyRefreshNeeded = true;
} else { } else {
PluginSpec *spec = m_pmPrivate->pluginByName(m_currentArg); PluginSpec *spec = m_pmPrivate->pluginById(m_currentArg.toLower());
if (!spec) { if (!spec) {
if (m_errorString) if (m_errorString)
*m_errorString = Tr::tr("The plugin \"%1\" does not exist.").arg(m_currentArg); *m_errorString = Tr::tr("The plugin \"%1\" does not exist.").arg(m_currentArg);

View File

@@ -43,10 +43,12 @@ class PluginDetailsViewPrivate
public: public:
PluginDetailsViewPrivate(PluginDetailsView *detailsView) PluginDetailsViewPrivate(PluginDetailsView *detailsView)
: q(detailsView) : q(detailsView)
, id(createContentsLabel())
, name(createContentsLabel()) , name(createContentsLabel())
, version(createContentsLabel()) , version(createContentsLabel())
, compatVersion(createContentsLabel()) , compatVersion(createContentsLabel())
, vendor(createContentsLabel()) , vendor(createContentsLabel())
, vendorId(createContentsLabel())
, component(createContentsLabel()) , component(createContentsLabel())
, url(createContentsLabel()) , url(createContentsLabel())
, documentationUrl(createContentsLabel()) , documentationUrl(createContentsLabel())
@@ -62,10 +64,12 @@ public:
// clang-format off // clang-format off
Form { Form {
Tr::tr("ID:"), id, br,
Tr::tr("Name:"), name, br, Tr::tr("Name:"), name, br,
Tr::tr("Version:"), version, br, Tr::tr("Version:"), version, br,
Tr::tr("Compatibility version:"), compatVersion, br, Tr::tr("Compatibility version:"), compatVersion, br,
Tr::tr("Vendor:"), vendor, br, Tr::tr("Vendor:"), vendor, br,
Tr::tr("VendorId:"), vendorId, br,
Tr::tr("Group:"), component, br, Tr::tr("Group:"), component, br,
Tr::tr("URL:"), url, br, Tr::tr("URL:"), url, br,
Tr::tr("Documentation:"), documentationUrl, br, Tr::tr("Documentation:"), documentationUrl, br,
@@ -83,10 +87,12 @@ public:
PluginDetailsView *q = nullptr; PluginDetailsView *q = nullptr;
QLabel *id = nullptr;
QLabel *name = nullptr; QLabel *name = nullptr;
QLabel *version = nullptr; QLabel *version = nullptr;
QLabel *compatVersion = nullptr; QLabel *compatVersion = nullptr;
QLabel *vendor = nullptr; QLabel *vendor = nullptr;
QLabel *vendorId = nullptr;
QLabel *component = nullptr; QLabel *component = nullptr;
QLabel *url = nullptr; QLabel *url = nullptr;
QLabel *documentationUrl = nullptr; QLabel *documentationUrl = nullptr;
@@ -140,6 +146,7 @@ PluginDetailsView::~PluginDetailsView()
*/ */
void PluginDetailsView::update(PluginSpec *spec) void PluginDetailsView::update(PluginSpec *spec)
{ {
d->id->setText(spec->id());
d->name->setText(spec->name()); d->name->setText(spec->name());
const QString revision = spec->revision(); const QString revision = spec->revision();
const QString versionString = spec->version() const QString versionString = spec->version()
@@ -147,6 +154,7 @@ void PluginDetailsView::update(PluginSpec *spec)
d->version->setText(versionString); d->version->setText(versionString);
d->compatVersion->setText(spec->compatVersion()); d->compatVersion->setText(spec->compatVersion());
d->vendor->setText(spec->vendor()); d->vendor->setText(spec->vendor());
d->vendorId->setText(spec->vendorId());
d->component->setText(spec->category().isEmpty() ? Tr::tr("None") : spec->category()); d->component->setText(spec->category().isEmpty() ? Tr::tr("None") : spec->category());
const auto toHtmlLink = [](const QString &url) { const auto toHtmlLink = [](const QString &url) {
return QString::fromLatin1("<a href=\"%1\">%1</a>").arg(url); return QString::fromLatin1("<a href=\"%1\">%1</a>").arg(url);

View File

@@ -8,6 +8,7 @@
#include "pluginmanager.h" #include "pluginmanager.h"
#include "pluginspec.h" #include "pluginspec.h"
#include <utils/algorithm.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <QCoreApplication> #include <QCoreApplication>
@@ -79,7 +80,8 @@ PluginErrorOverview::PluginErrorOverview(QWidget *parent)
for (PluginSpec *spec : PluginManager::plugins()) { for (PluginSpec *spec : PluginManager::plugins()) {
// only show errors on startup if plugin is enabled. // only show errors on startup if plugin is enabled.
if (spec->hasError() && spec->isEffectivelyEnabled()) { if (spec->hasError() && spec->isEffectivelyEnabled()) {
QListWidgetItem *item = new QListWidgetItem(spec->name()); const QString name = spec->displayName();
QListWidgetItem *item = new QListWidgetItem(name);
item->setData(Qt::UserRole, QVariant::fromValue(spec)); item->setData(Qt::UserRole, QVariant::fromValue(spec));
pluginList->addItem(item); pluginList->addItem(item);
} }

View File

@@ -772,9 +772,15 @@ void PluginManager::formatPluginOptions(QTextStream &str, int optionIndentation,
for (PluginSpec *ps : std::as_const(d->pluginSpecs)) { for (PluginSpec *ps : std::as_const(d->pluginSpecs)) {
const PluginSpec::PluginArgumentDescriptions pargs = ps->argumentDescriptions(); const PluginSpec::PluginArgumentDescriptions pargs = ps->argumentDescriptions();
if (!pargs.empty()) { if (!pargs.empty()) {
str << "\nPlugin: " << ps->name() << '\n'; str << "\nPlugin: " << ps->id() << '\n';
for (const PluginArgumentDescription &pad : pargs) for (const PluginArgumentDescription &pad : pargs)
formatOption(str, pad.name, pad.parameter, pad.description, optionIndentation, descriptionIndentation); formatOption(
str,
pad.name,
pad.parameter,
pad.description,
optionIndentation,
descriptionIndentation);
} }
} }
} }
@@ -1006,18 +1012,24 @@ void PluginManagerPrivate::writeSettings()
settings->setValueWithDefault(C_FORCEENABLED_PLUGINS, tempForceEnabledPlugins); settings->setValueWithDefault(C_FORCEENABLED_PLUGINS, tempForceEnabledPlugins);
} }
static inline QStringList toLower(const QStringList &list)
{
return Utils::transform(list, [](const QString &s) { return s.toLower(); });
}
/*! /*!
\internal \internal
*/ */
void PluginManagerPrivate::readSettings() void PluginManagerPrivate::readSettings()
{ {
if (globalSettings) { if (globalSettings) {
defaultDisabledPlugins = globalSettings->value(C_IGNORED_PLUGINS).toStringList(); defaultDisabledPlugins = toLower(globalSettings->value(C_IGNORED_PLUGINS).toStringList());
defaultEnabledPlugins = globalSettings->value(C_FORCEENABLED_PLUGINS).toStringList(); defaultEnabledPlugins = toLower(
globalSettings->value(C_FORCEENABLED_PLUGINS).toStringList());
} }
if (settings) { if (settings) {
disabledPlugins = settings->value(C_IGNORED_PLUGINS).toStringList(); disabledPlugins = toLower(settings->value(C_IGNORED_PLUGINS).toStringList());
forceEnabledPlugins = settings->value(C_FORCEENABLED_PLUGINS).toStringList(); forceEnabledPlugins = toLower(settings->value(C_FORCEENABLED_PLUGINS).toStringList());
} }
} }
@@ -1053,7 +1065,7 @@ void PluginManagerPrivate::checkForDuplicatePlugins()
{ {
QHash<QString, PluginSpec *> seen; QHash<QString, PluginSpec *> seen;
for (PluginSpec *spec : pluginSpecs) { for (PluginSpec *spec : pluginSpecs) {
if (PluginSpec *other = seen.value(spec->name())) { if (PluginSpec *other = seen.value(spec->id())) {
// Plugin with same name already there. We do not know, which version is the right one, // Plugin with same name already there. We do not know, which version is the right one,
// keep it simple and fail both (if enabled). // keep it simple and fail both (if enabled).
if (spec->isEffectivelyEnabled() && other->isEffectivelyEnabled()) { if (spec->isEffectivelyEnabled() && other->isEffectivelyEnabled()) {
@@ -1063,7 +1075,8 @@ void PluginManagerPrivate::checkForDuplicatePlugins()
other->setError(error); other->setError(error);
} }
} else { } else {
seen.insert(spec->name(), spec); if (!spec->id().isEmpty())
seen.insert(spec->id(), spec);
} }
} }
} }
@@ -1551,15 +1564,15 @@ public:
+ ".lock"; + ".lock";
} }
static std::optional<QString> lockedPluginName(PluginManagerPrivate *pm) static std::optional<QString> lockedPluginId(PluginManagerPrivate *pm)
{ {
const QString lockFilePath = LockFile::filePath(pm); const QString lockFilePath = LockFile::filePath(pm);
if (QFileInfo::exists(lockFilePath)) { if (QFileInfo::exists(lockFilePath)) {
QFile f(lockFilePath); QFile f(lockFilePath);
if (f.open(QIODevice::ReadOnly)) { if (f.open(QIODevice::ReadOnly)) {
const auto pluginName = QString::fromUtf8(f.readLine()).trimmed(); const auto pluginId = QString::fromUtf8(f.readLine()).trimmed();
f.close(); f.close();
return pluginName; return pluginId;
} else { } else {
qCDebug(pluginLog) << "Lock file" << lockFilePath << "exists but is not readable"; qCDebug(pluginLog) << "Lock file" << lockFilePath << "exists but is not readable";
} }
@@ -1591,9 +1604,9 @@ void PluginManagerPrivate::checkForProblematicPlugins()
{ {
if (!enableCrashCheck) if (!enableCrashCheck)
return; return;
const std::optional<QString> pluginName = LockFile::lockedPluginName(this); const std::optional<QString> pluginId = LockFile::lockedPluginId(this);
if (pluginName) { if (pluginId) {
PluginSpec *spec = pluginByName(*pluginName); PluginSpec *spec = pluginById(*pluginId);
if (spec && !spec->isRequired()) { if (spec && !spec->isRequired()) {
const QSet<PluginSpec *> dependents = PluginManager::pluginsRequiringPlugin(spec); const QSet<PluginSpec *> dependents = PluginManager::pluginsRequiringPlugin(spec);
auto dependentsNames = Utils::transform<QStringList>(dependents, &PluginSpec::name); auto dependentsNames = Utils::transform<QStringList>(dependents, &PluginSpec::name);
@@ -1763,16 +1776,16 @@ void PluginManagerPrivate::addPlugins(const PluginSpecs &specs)
for (PluginSpec *spec : specs) { for (PluginSpec *spec : specs) {
// defaultDisabledPlugins and defaultEnabledPlugins from install settings // defaultDisabledPlugins and defaultEnabledPlugins from install settings
// is used to override the defaults read from the plugin spec // is used to override the defaults read from the plugin spec
if (spec->isEnabledByDefault() && defaultDisabledPlugins.contains(spec->name())) { if (spec->isEnabledByDefault() && defaultDisabledPlugins.contains(spec->id())) {
spec->setEnabledByDefault(false); spec->setEnabledByDefault(false);
spec->setEnabledBySettings(false); spec->setEnabledBySettings(false);
} else if (!spec->isEnabledByDefault() && defaultEnabledPlugins.contains(spec->name())) { } else if (!spec->isEnabledByDefault() && defaultEnabledPlugins.contains(spec->id())) {
spec->setEnabledByDefault(true); spec->setEnabledByDefault(true);
spec->setEnabledBySettings(true); spec->setEnabledBySettings(true);
} }
if (!spec->isEnabledByDefault() && forceEnabledPlugins.contains(spec->name())) if (!spec->isEnabledByDefault() && forceEnabledPlugins.contains(spec->id()))
spec->setEnabledBySettings(true); spec->setEnabledBySettings(true);
if (spec->isEnabledByDefault() && disabledPlugins.contains(spec->name())) if (spec->isEnabledByDefault() && disabledPlugins.contains(spec->id()))
spec->setEnabledBySettings(false); spec->setEnabledBySettings(false);
pluginCategories[spec->category()].append(spec); pluginCategories[spec->category()].append(spec);
@@ -1838,10 +1851,9 @@ PluginSpec *PluginManagerPrivate::pluginForOption(const QString &option, bool *r
// Look in the plugins for an option // Look in the plugins for an option
*requiresArgument = false; *requiresArgument = false;
for (PluginSpec *spec : std::as_const(pluginSpecs)) { for (PluginSpec *spec : std::as_const(pluginSpecs)) {
PluginArgumentDescription match = Utils::findOrDefault(spec->argumentDescriptions(), PluginArgumentDescription match = Utils::findOrDefault(
[option](PluginArgumentDescription pad) { spec->argumentDescriptions(),
return pad.name == option; [option](PluginArgumentDescription pad) { return pad.name == option; });
});
if (!match.name.isEmpty()) { if (!match.name.isEmpty()) {
*requiresArgument = !match.parameter.isEmpty(); *requiresArgument = !match.parameter.isEmpty();
return spec; return spec;
@@ -1850,9 +1862,10 @@ PluginSpec *PluginManagerPrivate::pluginForOption(const QString &option, bool *r
return nullptr; return nullptr;
} }
PluginSpec *PluginManagerPrivate::pluginByName(const QString &name) const PluginSpec *PluginManagerPrivate::pluginById(const QString &id) const
{ {
return Utils::findOrDefault(pluginSpecs, [name](PluginSpec *spec) { return spec->name() == name; }); QTC_CHECK(id.isLower()); // Plugin ids are always lower case. So the id argument should be too.
return Utils::findOrDefault(pluginSpecs, [id](PluginSpec *spec) { return spec->id() == id; });
} }
void PluginManagerPrivate::increaseProfilingVerbosity() void PluginManagerPrivate::increaseProfilingVerbosity()

View File

@@ -117,7 +117,7 @@ public:
// Look in argument descriptions of the specs for the option. // Look in argument descriptions of the specs for the option.
PluginSpec *pluginForOption(const QString &option, bool *requiresArgument) const; PluginSpec *pluginForOption(const QString &option, bool *requiresArgument) const;
PluginSpec *pluginByName(const QString &name) const; PluginSpec *pluginById(const QString &id) const;
static void addTestCreator(IPlugin *plugin, const std::function<QObject *()> &testCreator); static void addTestCreator(IPlugin *plugin, const std::function<QObject *()> &testCreator);

View File

@@ -139,7 +139,7 @@ namespace ExtensionSystem {
*/ */
size_t qHash(const PluginDependency &value) size_t qHash(const PluginDependency &value)
{ {
return qHash(value.name); return qHash(value.id);
} }
/*! /*!
@@ -147,7 +147,7 @@ size_t qHash(const PluginDependency &value)
*/ */
bool PluginDependency::operator==(const PluginDependency &other) const bool PluginDependency::operator==(const PluginDependency &other) const
{ {
return name == other.name && version == other.version && type == other.type; return id == other.id && version == other.version && type == other.type;
} }
static QString typeString(PluginDependency::Type type) static QString typeString(PluginDependency::Type type)
@@ -168,7 +168,7 @@ static QString typeString(PluginDependency::Type type)
*/ */
QString PluginDependency::toString() const QString PluginDependency::toString() const
{ {
return name + " (" + version + typeString(type) + ")"; return id + " (" + version + typeString(type) + ")";
} }
namespace Internal { namespace Internal {
@@ -186,9 +186,11 @@ class PluginSpecPrivate
public: public:
ExtensionSystem::PerformanceData performanceData; ExtensionSystem::PerformanceData performanceData;
QString id;
QString name; QString name;
QString version; QString version;
QString compatVersion; QString compatVersion;
QString vendorId;
QString vendor; QString vendor;
QString category; QString category;
QString description; QString description;
@@ -254,6 +256,26 @@ QString PluginSpec::name() const
return d->name; return d->name;
} }
/*!
Returns the plugin display name. This is valid after the PluginSpec::Read
state is reached.
*/
QString PluginSpec::id() const
{
return d->id;
}
/*!
Returns either name(), or id() if name() is empty. If both are empty, returns "<unknown>".
*/
QString PluginSpec::displayName() const
{
return Utils::findOr(
QStringList{name(), id(), filePath().fileName()},
"<Unknown>",
std::not_fn(&QString::isEmpty));
}
/*! /*!
Returns the plugin version. This is valid after the PluginSpec::Read state Returns the plugin version. This is valid after the PluginSpec::Read state
is reached. is reached.
@@ -281,6 +303,15 @@ QString PluginSpec::vendor() const
return d->vendor; return d->vendor;
} }
/*!
Returns the display name of the plugins vendor. This is valid after the PluginSpec::Read
state is reached.
*/
QString PluginSpec::vendorId() const
{
return d->vendorId;
}
/*! /*!
Returns the plugin copyright. This is valid after the PluginSpec::Read Returns the plugin copyright. This is valid after the PluginSpec::Read
state is reached. state is reached.
@@ -576,7 +607,7 @@ QString PluginSpec::errorString() const
*/ */
bool PluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const bool PluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const
{ {
if (QString::compare(dependency.name, spec->name(), Qt::CaseInsensitive) != 0) if (QString::compare(dependency.id, spec->id(), Qt::CaseInsensitive) != 0)
return false; return false;
return (versionCompare(spec->version(), dependency.version) >= 0) return (versionCompare(spec->version(), dependency.version) >= 0)
@@ -674,6 +705,7 @@ PluginSpecs PluginSpec::enableDependenciesIndirectly(bool enableTestDependencies
namespace { namespace {
const char PLUGIN_METADATA[] = "MetaData"; const char PLUGIN_METADATA[] = "MetaData";
const char PLUGIN_NAME[] = "Name"; const char PLUGIN_NAME[] = "Name";
const char PLUGIN_ID[] = "Id";
const char PLUGIN_VERSION[] = "Version"; const char PLUGIN_VERSION[] = "Version";
const char PLUGIN_COMPATVERSION[] = "CompatVersion"; const char PLUGIN_COMPATVERSION[] = "CompatVersion";
const char PLUGIN_REQUIRED[] = "Required"; const char PLUGIN_REQUIRED[] = "Required";
@@ -682,6 +714,7 @@ namespace {
const char PLUGIN_DEPRECATED[] = "Deprecated"; const char PLUGIN_DEPRECATED[] = "Deprecated";
const char PLUGIN_SOFTLOADABLE[] = "SoftLoadable"; const char PLUGIN_SOFTLOADABLE[] = "SoftLoadable";
const char VENDOR[] = "Vendor"; const char VENDOR[] = "Vendor";
const char VENDOR_ID[] = "VendorId";
const char COPYRIGHT[] = "Copyright"; const char COPYRIGHT[] = "Copyright";
const char LICENSE[] = "License"; const char LICENSE[] = "License";
const char DESCRIPTION[] = "Description"; const char DESCRIPTION[] = "Description";
@@ -691,7 +724,7 @@ namespace {
const char CATEGORY[] = "Category"; const char CATEGORY[] = "Category";
const char PLATFORM[] = "Platform"; const char PLATFORM[] = "Platform";
const char DEPENDENCIES[] = "Dependencies"; const char DEPENDENCIES[] = "Dependencies";
const char DEPENDENCY_NAME[] = "Name"; const char DEPENDENCY_ID[] = "Id";
const char DEPENDENCY_VERSION[] = "Version"; const char DEPENDENCY_VERSION[] = "Version";
const char DEPENDENCY_TYPE[] = "Type"; const char DEPENDENCY_TYPE[] = "Type";
const char DEPENDENCY_TYPE_SOFT[] = "optional"; const char DEPENDENCY_TYPE_SOFT[] = "optional";
@@ -807,108 +840,145 @@ expected_str<void> CppPluginSpec::readMetaData(const QJsonObject &pluginMetaData
return PluginSpec::readMetaData(value.toObject()); return PluginSpec::readMetaData(value.toObject());
} }
template<typename T>
struct Invert
{
T &value;
Invert(T &value)
: value(value)
{}
Invert &operator=(const T &other)
{
value = !other;
return *this;
}
};
template<class T>
using copy_assign_t = decltype(std::declval<T &>() = std::declval<const T &>());
Utils::expected_str<void> PluginSpecPrivate::readMetaData(const QJsonObject &data) Utils::expected_str<void> PluginSpecPrivate::readMetaData(const QJsonObject &data)
{ {
metaData = data; metaData = data;
QJsonValue value = metaData.value(QLatin1String(PLUGIN_NAME)); auto assign = [&data](QString &member, const char *fieldName) -> expected_str<void> {
QJsonValue value = data.value(QLatin1String(fieldName));
if (value.isUndefined()) if (value.isUndefined())
return reportError(msgValueMissing(PLUGIN_NAME)); return make_unexpected(msgValueMissing(fieldName));
if (!value.isString()) if (!value.isString())
return reportError(msgValueIsNotAString(PLUGIN_NAME)); return make_unexpected(msgValueIsNotAString(fieldName));
name = value.toString(); member = value.toString();
return {};
};
value = metaData.value(QLatin1String(PLUGIN_VERSION)); auto assignOr =
[&data](auto &&member, const char *fieldName, auto &&defaultValue) -> expected_str<void> {
QJsonValue value = data.value(QLatin1String(fieldName));
if (value.isUndefined()) if (value.isUndefined())
return reportError(msgValueMissing(PLUGIN_VERSION)); member = defaultValue;
else {
constexpr bool isBool = std::is_assignable<decltype(member), bool>::value;
constexpr bool isString = std::is_assignable<decltype(member), QString>::value;
static_assert(isString || isBool, "Unsupported type");
if constexpr (isString) {
if (!value.isString()) if (!value.isString())
return reportError(msgValueIsNotAString(PLUGIN_VERSION)); return make_unexpected(msgValueIsNotAString(fieldName));
version = value.toString(); member = value.toString();
} else if constexpr (isBool) {
if (!value.isBool())
return make_unexpected(msgValueIsNotABool(fieldName));
member = value.toBool();
}
}
return {};
};
auto assignMultiLine = [&data](QString &member, const char *fieldName) -> expected_str<void> {
QJsonValue value = data.value(QLatin1String(fieldName));
if (value.isUndefined())
return {};
if (!readMultiLineString(value, &member))
return make_unexpected(msgValueIsNotAMultilineString(fieldName));
return {};
};
if (auto r = assign(id, PLUGIN_ID); !r.has_value())
return reportError(r.error());
if (!id.isLower())
return reportError(::ExtensionSystem::Tr::tr("Plugin id \"%1\" must be lowercase").arg(id));
if (auto r = assignOr(name, PLUGIN_NAME, id); !r.has_value())
return reportError(r.error());
if (auto r = assign(version, PLUGIN_VERSION); !r.has_value())
return reportError(r.error());
if (!PluginSpec::isValidVersion(version)) if (!PluginSpec::isValidVersion(version))
return reportError(msgInvalidFormat(PLUGIN_VERSION, version)); return reportError(msgInvalidFormat(PLUGIN_VERSION, version));
value = metaData.value(QLatin1String(PLUGIN_COMPATVERSION)); if (auto r = assignOr(compatVersion, PLUGIN_COMPATVERSION, version); !r.has_value())
if (!value.isUndefined() && !value.isString()) return reportError(r.error());
return reportError(msgValueIsNotAString(PLUGIN_COMPATVERSION)); if (!PluginSpec::isValidVersion(compatVersion))
compatVersion = value.toString(version);
if (!value.isUndefined() && !PluginSpec::isValidVersion(compatVersion))
return reportError(msgInvalidFormat(PLUGIN_COMPATVERSION, compatVersion)); return reportError(msgInvalidFormat(PLUGIN_COMPATVERSION, compatVersion));
value = metaData.value(QLatin1String(PLUGIN_REQUIRED)); if (auto r = assignOr(required, PLUGIN_REQUIRED, false); !r.has_value())
if (!value.isUndefined() && !value.isBool()) return reportError(r.error());
return reportError(msgValueIsNotABool(PLUGIN_REQUIRED));
required = value.toBool(false);
qCDebug(pluginLog) << "required =" << required; qCDebug(pluginLog) << "required =" << required;
value = metaData.value(QLatin1String(PLUGIN_EXPERIMENTAL)); if (auto r = assignOr(experimental, PLUGIN_EXPERIMENTAL, false); !r.has_value())
if (!value.isUndefined() && !value.isBool()) return reportError(r.error());
return reportError(msgValueIsNotABool(PLUGIN_EXPERIMENTAL));
experimental = value.toBool(false);
qCDebug(pluginLog) << "experimental =" << experimental; qCDebug(pluginLog) << "experimental =" << experimental;
value = metaData.value(QLatin1String(PLUGIN_DEPRECATED)); if (auto r = assignOr(deprecated, PLUGIN_DEPRECATED, false); !r.has_value())
if (!value.isUndefined() && !value.isBool()) return reportError(r.error());
return reportError(msgValueIsNotABool(PLUGIN_DEPRECATED));
deprecated = value.toBool(false);
qCDebug(pluginLog) << "deprecated =" << deprecated; qCDebug(pluginLog) << "deprecated =" << deprecated;
value = metaData.value(QLatin1String(PLUGIN_DISABLED_BY_DEFAULT)); if (auto r
if (!value.isUndefined() && !value.isBool()) = assignOr(Invert(enabledByDefault), PLUGIN_DISABLED_BY_DEFAULT, experimental || deprecated);
return reportError(msgValueIsNotABool(PLUGIN_DISABLED_BY_DEFAULT)); !r.has_value())
enabledByDefault = !value.toBool(experimental || deprecated); return reportError(r.error());
qCDebug(pluginLog) << "enabledByDefault =" << enabledByDefault;
qCDebug(pluginLog) << "enabledByDefault =" << enabledByDefault;
enabledBySettings = enabledByDefault; enabledBySettings = enabledByDefault;
value = metaData.value(QLatin1String(PLUGIN_SOFTLOADABLE)); if (auto r = assignOr(softLoadable, PLUGIN_SOFTLOADABLE, false); !r.has_value())
if (!value.isUndefined() && !value.isBool()) return reportError(r.error());
return reportError(msgValueIsNotABool(PLUGIN_SOFTLOADABLE));
softLoadable = value.toBool(false);
qCDebug(pluginLog) << "softLoadable =" << softLoadable; qCDebug(pluginLog) << "softLoadable =" << softLoadable;
value = metaData.value(QLatin1String(VENDOR)); if (auto r = assign(vendorId, VENDOR_ID); !r.has_value())
if (!value.isUndefined() && !value.isString()) return reportError(r.error());
return reportError(msgValueIsNotAString(VENDOR));
vendor = value.toString();
value = metaData.value(QLatin1String(COPYRIGHT)); if (auto r = assignOr(vendor, VENDOR, vendorId); !r.has_value())
if (!value.isUndefined() && !value.isString()) return reportError(r.error());
return reportError(msgValueIsNotAString(COPYRIGHT));
copyright = value.toString();
value = metaData.value(QLatin1String(DESCRIPTION)); if (auto r = assignOr(copyright, COPYRIGHT, QString{}); !r.has_value())
if (!value.isUndefined() && !readMultiLineString(value, &description)) return reportError(r.error());
return reportError(msgValueIsNotAString(DESCRIPTION));
value = metaData.value(QLatin1String(LONGDESCRIPTION)); if (auto r = assignMultiLine(description, DESCRIPTION); !r.has_value())
if (!value.isUndefined() && !readMultiLineString(value, &longDescription)) return reportError(r.error());
return reportError(msgValueIsNotAString(LONGDESCRIPTION));
value = metaData.value(QLatin1String(URL)); if (auto r = assignMultiLine(longDescription, LONGDESCRIPTION); !r.has_value())
if (!value.isUndefined() && !value.isString()) return reportError(r.error());
return reportError(msgValueIsNotAString(URL));
url = value.toString();
value = metaData.value(QLatin1String(DOCUMENTATIONURL)); if (auto r = assignOr(url, URL, QString{}); !r.has_value())
if (!value.isUndefined() && !value.isString()) return reportError(r.error());
return reportError(msgValueIsNotAString(DOCUMENTATIONURL));
documentationUrl = value.toString();
value = metaData.value(QLatin1String(CATEGORY)); if (auto r = assignOr(documentationUrl, DOCUMENTATIONURL, QString{}); !r.has_value())
if (!value.isUndefined() && !value.isString()) return reportError(r.error());
return reportError(msgValueIsNotAString(CATEGORY));
category = value.toString();
value = metaData.value(QLatin1String(LICENSE)); if (auto r = assignOr(category, CATEGORY, QString{}); !r.has_value())
if (!value.isUndefined() && !readMultiLineString(value, &license)) return reportError(r.error());
return reportError(msgValueIsNotAMultilineString(LICENSE));
value = metaData.value("Revision"); if (auto r = assignMultiLine(license, LICENSE); !r.has_value())
if (!value.isUndefined() && !value.isString()) return reportError(r.error());
return reportError(msgValueIsNotAString("Revision"));
revision = value.toString();
value = metaData.value(QLatin1String(PLATFORM)); if (auto r = assignOr(revision, "Revision", QString{}); !r.has_value())
return reportError(r.error());
QJsonValue value = metaData.value(QLatin1String(PLATFORM));
if (!value.isUndefined() && !value.isString()) if (!value.isUndefined() && !value.isString())
return reportError(msgValueIsNotAString(PLATFORM)); return reportError(msgValueIsNotAString(PLATFORM));
const QString platformSpec = value.toString().trimmed(); const QString platformSpec = value.toString().trimmed();
@@ -930,18 +1000,16 @@ Utils::expected_str<void> PluginSpecPrivate::readMetaData(const QJsonObject &dat
return reportError(msgValueIsNotAObjectArray(DEPENDENCIES)); return reportError(msgValueIsNotAObjectArray(DEPENDENCIES));
QJsonObject dependencyObject = v.toObject(); QJsonObject dependencyObject = v.toObject();
PluginDependency dep; PluginDependency dep;
value = dependencyObject.value(QLatin1String(DEPENDENCY_NAME)); value = dependencyObject.value(QLatin1String(DEPENDENCY_ID));
if (value.isUndefined()) { if (value.isUndefined()) {
return reportError( return reportError(
::ExtensionSystem::Tr::tr("Dependency: %1") ::ExtensionSystem::Tr::tr("Dependency: %1").arg(msgValueMissing(DEPENDENCY_ID)));
.arg(msgValueMissing(DEPENDENCY_NAME)));
} }
if (!value.isString()) { if (!value.isString()) {
return reportError( return reportError(::ExtensionSystem::Tr::tr("Dependency: %1")
::ExtensionSystem::Tr::tr("Dependency: %1") .arg(msgValueIsNotAString(DEPENDENCY_ID)));
.arg(msgValueIsNotAString(DEPENDENCY_NAME)));
} }
dep.name = value.toString(); dep.id = value.toString();
value = dependencyObject.value(QLatin1String(DEPENDENCY_VERSION)); value = dependencyObject.value(QLatin1String(DEPENDENCY_VERSION));
if (!value.isUndefined() && !value.isString()) { if (!value.isUndefined() && !value.isString()) {
return reportError( return reportError(
@@ -1098,7 +1166,7 @@ bool PluginSpec::resolveDependencies(const PluginSpecs &specs)
if (dependency.type == PluginDependency::Required) { if (dependency.type == PluginDependency::Required) {
const QString error = ::ExtensionSystem::Tr::tr( const QString error = ::ExtensionSystem::Tr::tr(
"Could not resolve dependency '%1(%2)'") "Could not resolve dependency '%1(%2)'")
.arg(dependency.name, dependency.version); .arg(dependency.id, dependency.version);
if (hasError()) if (hasError())
setError(errorString() + '\n' + error); setError(errorString() + '\n' + error);
else else

View File

@@ -39,13 +39,13 @@ struct EXTENSIONSYSTEM_EXPORT PluginDependency
enum Type { Required, Optional, Test }; enum Type { Required, Optional, Test };
PluginDependency() : type(Required) {} PluginDependency() : type(Required) {}
PluginDependency(const QString &name, const QString &version, Type type = Required) PluginDependency(const QString &id, const QString &version, Type type = Required)
: name(name) : id(id)
, version(version) , version(version)
, type(type) , type(type)
{} {}
QString name; QString id;
QString version; QString version;
Type type; Type type;
bool operator==(const PluginDependency &other) const; bool operator==(const PluginDependency &other) const;
@@ -96,9 +96,11 @@ public:
// information read from the plugin, valid after 'Read' state is reached // information read from the plugin, valid after 'Read' state is reached
virtual QString name() const; virtual QString name() const;
virtual QString id() const;
virtual QString version() const; virtual QString version() const;
virtual QString compatVersion() const; virtual QString compatVersion() const;
virtual QString vendor() const; virtual QString vendor() const;
virtual QString vendorId() const;
virtual QString copyright() const; virtual QString copyright() const;
virtual QString license() const; virtual QString license() const;
virtual QString description() const; virtual QString description() const;
@@ -109,6 +111,8 @@ public:
virtual QString revision() const; virtual QString revision() const;
virtual QRegularExpression platformSpecification() const; virtual QRegularExpression platformSpecification() const;
virtual QString displayName() const;
virtual bool isAvailableForHostPlatform() const; virtual bool isAvailableForHostPlatform() const;
virtual bool isRequired() const; virtual bool isRequired() const;
virtual bool isExperimental() const; virtual bool isExperimental() const;

View File

@@ -96,24 +96,29 @@ public:
QVariant data(int column, int role) const override QVariant data(int column, int role) const override
{ {
switch (column) { switch (column) {
case NameColumn: case NameColumn: {
const QString displayName = m_spec->displayName();
if (role == Qt::DisplayRole) { if (role == Qt::DisplayRole) {
if (m_spec->isDeprecated()) { QStringList decoration;
//: %1 is a plugin name if (m_spec->isDeprecated())
return Tr::tr("%1 (deprecated)").arg(m_spec->name()); decoration.append(Tr::tr("deprecated"));
} if (m_spec->isExperimental())
//: %1 is a plugin name decoration.append(Tr::tr("experimental"));
return m_spec->isExperimental() ? Tr::tr("%1 (experimental)").arg(m_spec->name())
: m_spec->name(); if (decoration.isEmpty())
return displayName;
return QString::fromLatin1("%1 (%2)")
.arg(displayName, decoration.join(QLatin1Char(',')));
} }
if (role == SortRole) if (role == SortRole)
return m_spec->name(); return displayName;
if (role == Qt::ToolTipRole) { if (role == Qt::ToolTipRole) {
QString toolTip; QString toolTip;
if (!m_spec->isAvailableForHostPlatform()) if (!m_spec->isAvailableForHostPlatform())
toolTip = Tr::tr("Path: %1\nPlugin is not available on this platform."); toolTip = Tr::tr("Path: %1\nPlugin is not available on this platform.");
else if (m_spec->isEnabledIndirectly()) else if (m_spec->isEnabledIndirectly())
toolTip = Tr::tr("Path: %1\nPlugin is enabled as dependency of an enabled plugin."); toolTip = Tr::tr(
"Path: %1\nPlugin is enabled as dependency of an enabled plugin.");
else if (m_spec->isForceEnabled()) else if (m_spec->isForceEnabled())
toolTip = Tr::tr("Path: %1\nPlugin is enabled by command line argument."); toolTip = Tr::tr("Path: %1\nPlugin is enabled by command line argument.");
else if (m_spec->isForceDisabled()) else if (m_spec->isForceDisabled())
@@ -130,6 +135,7 @@ public:
return i; return i;
} }
break; break;
}
case LoadedColumn: case LoadedColumn:
if (!m_spec->isAvailableForHostPlatform()) { if (!m_spec->isAvailableForHostPlatform()) {

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "android",
"Name" : "Android", "Name" : "Android",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "kdenecessitas",
"Vendor" : "KDE Necessitas", "Vendor" : "KDE Necessitas",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,9 +1,11 @@
{ {
"Id" : "appstatisticsmonitor",
"Name" : "AppStatisticsMonitor", "Name" : "AppStatisticsMonitor",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"DisabledByDefault" : ${APPSTATISTICSMONITOR_DISABLEDBYDEFAULT}, "DisabledByDefault" : ${APPSTATISTICSMONITOR_DISABLEDBYDEFAULT},
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "autotest",
"Name" : "AutoTest", "Name" : "AutoTest",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "autotoolsprojectmanager",
"Name" : "AutotoolsProjectManager", "Name" : "AutotoolsProjectManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"VendorId" : "openismusgmbh",
"Vendor" : "Openismus GmbH", "Vendor" : "Openismus GmbH",
"Copyright" : "(C) 2016 Openismus GmbH, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2016 Openismus GmbH, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,9 +1,11 @@
{ {
"Id" : "axivion",
"Name" : "Axivion", "Name" : "Axivion",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Revision" : "${QTC_PLUGIN_REVISION}", "Revision" : "${QTC_PLUGIN_REVISION}",
"Experimental" : true, "Experimental" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "baremetal",
"Name" : "BareMetal", "Name" : "BareMetal",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"VendorId" : "timsander",
"Vendor" : "Tim Sander", "Vendor" : "Tim Sander",
"Copyright" : "(C) 2016 Tim Sander, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2016 Tim Sander, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "bazaar",
"Name" : "Bazaar", "Name" : "Bazaar",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "huguesdelorme",
"Vendor" : "Hugues Delorme", "Vendor" : "Hugues Delorme",
"Copyright" : "(C) 2016 Hugues Delorme, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2016 Hugues Delorme, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "beautifier",
"Name" : "Beautifier", "Name" : "Beautifier",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"VendorId" : "lorenzhaas",
"Vendor" : "Lorenz Haas", "Vendor" : "Lorenz Haas",
"Copyright" : "(C) 2017 Lorenz Haas, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2017 Lorenz Haas, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "bineditor",
"Name" : "BinEditor", "Name" : "BinEditor",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "boot2qt",
"Name" : "Boot2Qt", "Name" : "Boot2Qt",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "clangcodemodel",
"Name" : "ClangCodeModel", "Name" : "ClangCodeModel",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "clangformat",
"Name" : "ClangFormat", "Name" : "ClangFormat",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "clangtools",
"Name" : "ClangTools", "Name" : "ClangTools",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "classview",
"Name" : "ClassView", "Name" : "ClassView",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) 2016 Denis Mingulov, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2016 Denis Mingulov, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,9 +1,11 @@
{ {
"Id" : "clearcase",
"Name" : "ClearCase", "Name" : "ClearCase",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"Platform" : "^(Linux|Windows)", "Platform" : "^(Linux|Windows)",
"VendorId" : "audiocodes",
"Vendor" : "AudioCodes", "Vendor" : "AudioCodes",
"Copyright" : "(C) 2016 AudioCodes Ltd., (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2016 AudioCodes Ltd., (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "cmakeprojectmanager",
"Name" : "CMakeProjectManager", "Name" : "CMakeProjectManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "coco",
"Name" : "Coco", "Name" : "Coco",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "compilationdatabaseprojectmanager",
"Name" : "CompilationDatabaseProjectManager", "Name" : "CompilationDatabaseProjectManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,9 +1,11 @@
{ {
"Id" : "compilerexplorer",
"Name" : "CompilerExplorer", "Name" : "CompilerExplorer",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"SoftLoadable" : true, "SoftLoadable" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "conan",
"Name" : "Conan", "Name" : "Conan",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "jochenseemann",
"Vendor" : "Jochen Seemann", "Vendor" : "Jochen Seemann",
"Copyright" : "(C) 2018 Jochen Seemann, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2018 Jochen Seemann, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "copilot",
"Name" : "Copilot", "Name" : "Copilot",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "core",
"Name" : "Core", "Name" : "Core",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Required" : true, "Required" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -92,6 +92,7 @@ signals:
private: private:
LogCategoryRegistry() = default; LogCategoryRegistry() = default;
~LogCategoryRegistry() { QLoggingCategory::installFilter(s_oldFilter); }
void onFilter(QLoggingCategory *category) void onFilter(QLoggingCategory *category)
{ {

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "codepaster",
"Name" : "CodePaster", "Name" : "CodePaster",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "cppcheck",
"Name" : "Cppcheck", "Name" : "Cppcheck",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"VendorId" : "sergeymorozov",
"Vendor" : "Sergey Morozov", "Vendor" : "Sergey Morozov",
"Copyright" : "(C) 2018 Sergey Morozov, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2018 Sergey Morozov, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "cppeditor",
"Name" : "CppEditor", "Name" : "CppEditor",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "ctfvisualizer",
"Name" : "CtfVisualizer", "Name" : "CtfVisualizer",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Vendor" : "KDAB Group, www.kdab.com", "Vendor" : "KDAB Group, www.kdab.com",
"VendorId" : "kdab",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",
"", "",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "cvs",
"Name" : "CVS", "Name" : "CVS",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "debugger",
"Name" : "Debugger", "Name" : "Debugger",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "designer",
"Name" : "Designer", "Name" : "Designer",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "diffeditor",
"Name" : "DiffEditor", "Name" : "DiffEditor",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "docker",
"Name" : "Docker", "Name" : "Docker",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "effectcomposer",
"Name" : "EffectComposer", "Name" : "EffectComposer",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",
@@ -13,4 +15,3 @@
"DisabledByDefault" : true, "DisabledByDefault" : true,
${IDE_PLUGIN_DEPENDENCIES} ${IDE_PLUGIN_DEPENDENCIES}
} }

View File

@@ -1,9 +1,11 @@
{ {
"Id" : "emacskeys",
"Name" : "EmacsKeys", "Name" : "EmacsKeys",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"SoftLoadable" : true, "SoftLoadable" : true,
"VendorId" : "nsf",
"Vendor" : "nsf", "Vendor" : "nsf",
"Copyright" : "(C) 2016 nsf <no.smile.face@gmail.com>, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2016 nsf <no.smile.face@gmail.com>, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "extensionmanager",
"Name" : "ExtensionManager", "Name" : "ExtensionManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -226,7 +226,7 @@ public:
const ItemType itemType = current.data(RoleItemType).value<ItemType>(); const ItemType itemType = current.data(RoleItemType).value<ItemType>();
const bool isPack = itemType == ItemTypePack; const bool isPack = itemType == ItemTypePack;
const bool isRemotePlugin = !(isPack || pluginSpecForName(name)); const bool isRemotePlugin = !(isPack || pluginSpecForId(current.data(RoleId).toString()));
installButton->setVisible(isRemotePlugin && !pluginData.empty()); installButton->setVisible(isRemotePlugin && !pluginData.empty());
if (installButton->isVisible()) if (installButton->isVisible())
installButton->setToolTip(pluginData.constFirst().second); installButton->setToolTip(pluginData.constFirst().second);
@@ -270,7 +270,7 @@ public:
}.attachTo(this); }.attachTo(this);
connect(m_switch, &QCheckBox::clicked, this, [this](bool checked) { connect(m_switch, &QCheckBox::clicked, this, [this](bool checked) {
ExtensionSystem::PluginSpec *spec = pluginSpecForName(m_pluginName); ExtensionSystem::PluginSpec *spec = pluginSpecForId(m_pluginId);
if (spec == nullptr) if (spec == nullptr)
return; return;
const bool doIt = m_pluginView.data().setPluginsEnabled({spec}, checked); const bool doIt = m_pluginView.data().setPluginsEnabled({spec}, checked);
@@ -290,16 +290,16 @@ public:
update(); update();
} }
void setPluginName(const QString &name) void setPluginId(const QString &id)
{ {
m_pluginName = name; m_pluginId = id;
update(); update();
} }
private: private:
void update() void update()
{ {
const ExtensionSystem::PluginSpec *spec = pluginSpecForName(m_pluginName); const ExtensionSystem::PluginSpec *spec = pluginSpecForId(m_pluginId);
setVisible(spec != nullptr); setVisible(spec != nullptr);
if (spec == nullptr) if (spec == nullptr)
return; return;
@@ -322,7 +322,7 @@ private:
InfoLabel *m_label; InfoLabel *m_label;
Switch *m_switch; Switch *m_switch;
QAbstractButton *m_restartButton; QAbstractButton *m_restartButton;
QString m_pluginName; QString m_pluginId;
ExtensionSystem::PluginView m_pluginView{this}; ExtensionSystem::PluginView m_pluginView{this};
}; };
@@ -583,9 +583,9 @@ void ExtensionManagerWidget::updateView(const QModelIndex &current)
if (!showContent) if (!showContent)
return; return;
m_currentItemName = current.data().toString(); m_currentItemName = current.data(RoleName).toString();
const bool isPack = current.data(RoleItemType) == ItemTypePack; const bool isPack = current.data(RoleItemType) == ItemTypePack;
m_pluginStatus->setPluginName(isPack ? QString() : m_currentItemName); m_pluginStatus->setPluginId(isPack ? QString() : current.data(RoleId).toString());
m_currentItemPlugins = current.data(RolePlugins).value<PluginsData>(); m_currentItemPlugins = current.data(RolePlugins).value<PluginsData>();
auto toContentParagraph = [](const QString &text) { auto toContentParagraph = [](const QString &text) {

View File

@@ -220,7 +220,7 @@ public:
x += iconBgSizeSmall.width() + ExPaddingGapL; x += iconBgSizeSmall.width() + ExPaddingGapL;
y += ExPaddingGapL; y += ExPaddingGapL;
const QRect itemNameR(x, y, middleColumnW, itemNameTF.lineHeight()); const QRect itemNameR(x, y, middleColumnW, itemNameTF.lineHeight());
const QString itemName = index.data().toString(); const QString itemName = index.data(RoleName).toString();
const QSize checkmarkS(12, 12); const QSize checkmarkS(12, 12);
const QRect checkmarkR(x + middleColumnW - checkmarkS.width(), y, const QRect checkmarkR(x + middleColumnW - checkmarkS.width(), y,
@@ -714,7 +714,7 @@ QPixmap itemIcon(const QModelIndex &index, Size size)
pixmap.setDevicePixelRatio(dpr); pixmap.setDevicePixelRatio(dpr);
const QRect iconBgR(QPoint(), pixmap.deviceIndependentSize().toSize()); const QRect iconBgR(QPoint(), pixmap.deviceIndependentSize().toSize());
const PluginSpec *ps = pluginSpecForName(index.data(RoleName).toString()); const PluginSpec *ps = pluginSpecForId(index.data(RoleId).toString());
const bool isEnabled = ps == nullptr || ps->isEffectivelyEnabled(); const bool isEnabled = ps == nullptr || ps->isEffectivelyEnabled();
const QGradientStops gradientStops = { const QGradientStops gradientStops = {
{0, creatorColor(isEnabled ? Theme::Token_Gradient01_Start {0, creatorColor(isEnabled ? Theme::Token_Gradient01_Start

View File

@@ -21,6 +21,8 @@
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QVersionNumber> #include <QVersionNumber>
#include <functional>
using namespace ExtensionSystem; using namespace ExtensionSystem;
using namespace Core; using namespace Core;
using namespace Utils; using namespace Utils;
@@ -31,7 +33,7 @@ Q_LOGGING_CATEGORY(modelLog, "qtc.extensionmanager.model", QtWarningMsg)
struct Dependency struct Dependency
{ {
QString name; QString id;
QString version; QString version;
}; };
using Dependencies = QList<Dependency>; using Dependencies = QList<Dependency>;
@@ -41,6 +43,7 @@ struct Plugin
QString copyright; QString copyright;
Dependencies dependencies; Dependencies dependencies;
bool isInternal = false; bool isInternal = false;
QString id;
QString name; QString name;
QString packageUrl; QString packageUrl;
QString vendor; QString vendor;
@@ -68,6 +71,7 @@ struct Extension {
QStringList tags; QStringList tags;
ItemType type = ItemTypePack; ItemType type = ItemTypePack;
QString vendor; QString vendor;
QString vendorId;
QString version; QString version;
}; };
using Extensions = QList<Extension>; using Extensions = QList<Extension>;
@@ -80,7 +84,7 @@ static const Dependencies dependenciesFromJson(const QJsonObject &obj)
const QJsonObject dependencyObj = dependencyVal.toObject(); const QJsonObject dependencyObj = dependencyVal.toObject();
const QJsonObject metaDataObj = dependencyObj.value("meta_data").toObject(); const QJsonObject metaDataObj = dependencyObj.value("meta_data").toObject();
dependencies.append({ dependencies.append({
.name = metaDataObj.value("Name").toString(), .id = metaDataObj.value("Id").toString(),
.version = metaDataObj.value("Version").toString(), .version = metaDataObj.value("Version").toString(),
}); });
} }
@@ -96,6 +100,7 @@ static Plugin pluginFromJson(const QJsonObject &obj)
.copyright = metaDataObj.value("Copyright").toString(), .copyright = metaDataObj.value("Copyright").toString(),
.dependencies = dependenciesFromJson(metaDataObj), .dependencies = dependenciesFromJson(metaDataObj),
.isInternal = obj.value("is_internal").toBool(false), .isInternal = obj.value("is_internal").toBool(false),
.id = metaDataObj.value("Id").toString(),
.name = metaDataObj.value("Name").toString(), .name = metaDataObj.value("Name").toString(),
.packageUrl = obj.value("url").toString(), .packageUrl = obj.value("url").toString(),
.vendor = metaDataObj.value("Vendor").toString(), .vendor = metaDataObj.value("Vendor").toString(),
@@ -182,6 +187,7 @@ static Extension extensionFromJson(const QJsonObject &obj)
.tags = tags, .tags = tags,
.type = obj.value("is_pack").toBool(true) ? ItemTypePack : ItemTypeExtension, .type = obj.value("is_pack").toBool(true) ? ItemTypePack : ItemTypeExtension,
.vendor = obj.value("vendor").toString(), .vendor = obj.value("vendor").toString(),
.vendorId = obj.value("vendor_id").toString(),
.version = obj.value("version").toString(), .version = obj.value("version").toString(),
}; };
@@ -204,16 +210,17 @@ static Extensions parseExtensionsRepoReply(const QByteArray &jsonData)
static Extension extensionFromPluginSpec(const PluginSpec *pluginSpec) static Extension extensionFromPluginSpec(const PluginSpec *pluginSpec)
{ {
const Dependencies dependencies = transform(pluginSpec->dependencies(), const Dependencies dependencies
[](const PluginDependency &pd) -> Dependency { = transform(pluginSpec->dependencies(), [](const PluginDependency &pd) -> Dependency {
return { return {
.name = pd.name, .id = pd.id,
.version = pd.version, .version = pd.version,
}; };
}); });
const Plugin plugin = { const Plugin plugin = {
.copyright = pluginSpec->copyright(), .copyright = pluginSpec->copyright(),
.dependencies = dependencies, .dependencies = dependencies,
.id = pluginSpec->id(),
.name = pluginSpec->name(), .name = pluginSpec->name(),
.packageUrl = {}, .packageUrl = {},
.vendor = pluginSpec->vendor(), .vendor = pluginSpec->vendor(),
@@ -243,7 +250,7 @@ static Extension extensionFromPluginSpec(const PluginSpec *pluginSpec)
.compatVersion = pluginSpec->compatVersion(), .compatVersion = pluginSpec->compatVersion(),
.copyright = pluginSpec->copyright(), .copyright = pluginSpec->copyright(),
.description = description, .description = description,
.id = {}, .id = pluginSpec->id(),
.license = pluginSpec->license(), .license = pluginSpec->license(),
.name = pluginSpec->name(), .name = pluginSpec->name(),
.platforms = platforms, .platforms = platforms,
@@ -251,6 +258,7 @@ static Extension extensionFromPluginSpec(const PluginSpec *pluginSpec)
.tags = {}, .tags = {},
.type = ItemTypeExtension, .type = ItemTypeExtension,
.vendor = pluginSpec->vendor(), .vendor = pluginSpec->vendor(),
.vendorId = pluginSpec->vendorId(),
.version = pluginSpec->version(), .version = pluginSpec->version(),
}; };
return extension; return extension;
@@ -302,8 +310,8 @@ static QStringList dependenciesFromExtension(const Extension &extension)
QStringList dependencies; QStringList dependencies;
for (const Plugin &plugin : extension.plugins) { for (const Plugin &plugin : extension.plugins) {
for (const Dependency &dependency : plugin.dependencies) { for (const Dependency &dependency : plugin.dependencies) {
const QString withVersion = QString::fromLatin1("%1 (%2)").arg(dependency.name) const QString withVersion
.arg(dependency.version); = QString::fromLatin1("%1 (%2)").arg(dependency.id).arg(dependency.version);
dependencies.append(withVersion); dependencies.append(withVersion);
} }
} }
@@ -317,7 +325,10 @@ static QVariant dataFromExtension(const Extension &extension, int role)
switch (role) { switch (role) {
case Qt::DisplayRole: case Qt::DisplayRole:
case RoleName: case RoleName:
return extension.name; return Utils::findOr(
QStringList{extension.name, extension.id},
"No name found",
std::not_fn(&QString::isEmpty));
case RoleCompatVersion: case RoleCompatVersion:
return extension.compatVersion; return extension.compatVersion;
case RoleCopyright: case RoleCopyright:
@@ -345,7 +356,7 @@ static QVariant dataFromExtension(const Extension &extension, int role)
case RolePlugins: { case RolePlugins: {
PluginsData plugins; PluginsData plugins;
for (const Plugin &plugin : extension.plugins) for (const Plugin &plugin : extension.plugins)
plugins.append(qMakePair(plugin.name, plugin.packageUrl)); plugins.append(qMakePair(plugin.id, plugin.packageUrl));
return QVariant::fromValue(plugins); return QVariant::fromValue(plugins);
} }
case RoleSize: case RoleSize:
@@ -356,6 +367,8 @@ static QVariant dataFromExtension(const Extension &extension, int role)
return !extension.vendor.isEmpty() ? extension.vendor : QVariant(); return !extension.vendor.isEmpty() ? extension.vendor : QVariant();
case RoleVersion: case RoleVersion:
return !extension.version.isEmpty() ? extension.version : QVariant(); return !extension.version.isEmpty() ? extension.version : QVariant();
case RoleVendorId:
return extension.vendorId;
default: default:
break; break;
} }
@@ -367,7 +380,7 @@ ExtensionState extensionState(const QModelIndex &index)
if (index.data(RoleItemType) != ItemTypeExtension) if (index.data(RoleItemType) != ItemTypeExtension)
return None; return None;
const PluginSpec *ps = pluginSpecForName(index.data(RoleName).toString()); const PluginSpec *ps = pluginSpecForId(index.data(RoleId).toString());
if (!ps) if (!ps)
return NotInstalled; return NotInstalled;
@@ -398,9 +411,9 @@ QVariant ExtensionsModel::data(const QModelIndex &index, int role) const
const QVariant extensionData = dataFromExtension(extension, role); const QVariant extensionData = dataFromExtension(extension, role);
// If data is unavailable, retrieve it from the first contained plugin // If data is unavailable, retrieve it from the first contained plugin
if (extensionData.isNull() && !extension.plugins.isEmpty()) { if (extensionData.isNull() && !extension.plugins.isEmpty()) {
const QString firstPluginName = extension.plugins.constFirst().name; const QString firstPluginId = extension.plugins.constFirst().id;
const Extension firstPluginExtension = const Extension firstPluginExtension
findOrDefault(d->extensions, Utils::equal(&Extension::name, firstPluginName)); = findOrDefault(d->extensions, Utils::equal(&Extension::id, firstPluginId));
if (firstPluginExtension.name.isEmpty()) if (firstPluginExtension.name.isEmpty())
return {}; return {};
return dataFromExtension(firstPluginExtension, role); return dataFromExtension(firstPluginExtension, role);
@@ -416,9 +429,9 @@ void ExtensionsModel::setExtensionsJson(const QByteArray &json)
endResetModel(); endResetModel();
} }
PluginSpec *pluginSpecForName(const QString &pluginName) PluginSpec *pluginSpecForId(const QString &pluginId)
{ {
return findOrDefault(PluginManager::plugins(), equal(&PluginSpec::name, pluginName)); return findOrDefault(PluginManager::plugins(), equal(&PluginSpec::id, pluginId));
} }
} // ExtensionManager::Internal } // ExtensionManager::Internal

View File

@@ -50,6 +50,7 @@ enum Role {
RoleSize, RoleSize,
RoleTags, RoleTags,
RoleVendor, RoleVendor,
RoleVendorId,
RoleVersion, RoleVersion,
}; };
@@ -68,7 +69,7 @@ private:
class ExtensionsModelPrivate *d = nullptr; class ExtensionsModelPrivate *d = nullptr;
}; };
ExtensionSystem::PluginSpec *pluginSpecForName(const QString &pluginName); ExtensionSystem::PluginSpec *pluginSpecForId(const QString &pluginId);
#ifdef WITH_TESTS #ifdef WITH_TESTS
QObject *createExtensionsModelTest(); QObject *createExtensionsModelTest();

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "fakevim",
"Name" : "FakeVim", "Name" : "FakeVim",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "fossil",
"Name" : "Fossil", "Name" : "Fossil",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"VendorId" : "arturshepilko",
"Vendor" : "Artur Shepilko", "Vendor" : "Artur Shepilko",
"Copyright" : "(C) 2018 Artur Shepilko", "Copyright" : "(C) 2018 Artur Shepilko",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "genericprojectmanager",
"Name" : "GenericProjectManager", "Name" : "GenericProjectManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "git",
"Name" : "Git", "Name" : "Git",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "gitlab",
"Name" : "GitLab", "Name" : "GitLab",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "glsleditor",
"Name" : "GLSLEditor", "Name" : "GLSLEditor",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "haskell",
"Name" : "Haskell", "Name" : "Haskell",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"VendorId" : "eikeziller",
"Vendor" : "Eike Ziller", "Vendor" : "Eike Ziller",
"Copyright" : "(C) Eike Ziller", "Copyright" : "(C) Eike Ziller",
"License" : "MIT", "License" : "MIT",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "helloworld",
"Name" : "HelloWorld", "Name" : "HelloWorld",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "help",
"Name" : "Help", "Name" : "Help",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "imageviewer",
"Name" : "ImageViewer", "Name" : "ImageViewer",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "incredibuild",
"Name" : "IncrediBuild", "Name" : "IncrediBuild",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Platform" : "^(Linux|Windows)", "Platform" : "^(Linux|Windows)",
"VendorId" : "incredibuild",
"Vendor" : "IncrediBuild", "Vendor" : "IncrediBuild",
"Copyright" : "(C) IncrediBuild", "Copyright" : "(C) IncrediBuild",
"Category" : "Build Systems", "Category" : "Build Systems",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "insight",
"Name" : "Insight", "Name" : "Insight",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Revision" : "${QTC_PLUGIN_REVISION}", "Revision" : "${QTC_PLUGIN_REVISION}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "ios",
"Name" : "Ios", "Name" : "Ios",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Platform" : "OS X.*", "Platform" : "OS X.*",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "languageclient",
"Name" : "Language Client", "Name" : "Language Client",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,10 +1,12 @@
{ {
"Id" : "lualanguageclient",
"Name" : "Lua Language Client", "Name" : "Lua Language Client",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"LuaCompatibleVersion" : "14.0.0", "LuaCompatibleVersion" : "14.0.0",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"SoftLoadable" : true, "SoftLoadable" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,10 +1,12 @@
{ {
"Id" : "lua",
"Name" : "Lua", "Name" : "Lua",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"LuaCompatibleVersion" : "14.0.0", "LuaCompatibleVersion" : "14.0.0",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"SoftLoadable" : true, "SoftLoadable" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -95,14 +95,14 @@ ExtensionSystem::IPlugin *LuaPluginSpec::plugin() const
bool LuaPluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const bool LuaPluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const
{ {
if (QString::compare(dependency.name, spec->name(), Qt::CaseInsensitive) != 0) if (QString::compare(dependency.id, spec->id(), Qt::CaseInsensitive) != 0)
return false; return false;
const QString luaCompatibleVersion = spec->metaData().value("LuaCompatibleVersion").toString(); const QString luaCompatibleVersion = spec->metaData().value("LuaCompatibleVersion").toString();
if (luaCompatibleVersion.isEmpty()) { if (luaCompatibleVersion.isEmpty()) {
qCWarning(luaPluginSpecLog) qCWarning(luaPluginSpecLog)
<< "The plugin" << spec->name() << "The plugin" << spec->id()
<< "does not specify a \"LuaCompatibleVersion\", but the lua plugin" << name() << "does not specify a \"LuaCompatibleVersion\", but the lua plugin" << name()
<< "requires it."; << "requires it.";
return false; return false;

View File

@@ -9,10 +9,12 @@ PluginSpec = {}
Qtc = {} Qtc = {}
---@class (exact) QtcPlugin ---@class (exact) QtcPlugin
---@field Name string The name of the plugin. ---@field Id string The id of the plugin.
---@field Name string? The name of the plugin. ( Default: `Id` )
---@field Version string The version of the plugin. (`major.minor.patch`) ---@field Version string The version of the plugin. (`major.minor.patch`)
---@field CompatVersion string The lowest previous version of the plugin that this one is compatible to. (`major.minor.patch`) ---@field CompatVersion string The lowest previous version of the plugin that this one is compatible to. (`major.minor.patch`)
---@field Vendor string The vendor of the plugin. ---@field VendorId string
---@field Vendor string? The display name of the vendor of the plugin. ( Default: `VendorId` )
---@field Category string The category of the plugin. ---@field Category string The category of the plugin.
---@field Dependencies? QtcPluginDependency[] The dependencies of the plugin. ---@field Dependencies? QtcPluginDependency[] The dependencies of the plugin.
---@field Description? string A short one line description of the plugin. ---@field Description? string A short one line description of the plugin.
@@ -33,7 +35,7 @@ Qtc = {}
QtcPlugin = {} QtcPlugin = {}
---@class QtcPluginDependency ---@class QtcPluginDependency
---@field Name string The name of the dependency. ---@field Id string The name of the dependency.
---@field Version string The version of the dependency. (`major.minor.patch`) ---@field Version string The version of the dependency. (`major.minor.patch`)
---@field Required? "required"|"optional"|"test" Whether the dependency is required or not. (Default: "required") ---@field Required? "required"|"optional"|"test" Whether the dependency is required or not. (Default: "required")
QtcPluginDependency = {} QtcPluginDependency = {}

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "macros",
"Name" : "Macros", "Name" : "Macros",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "marketplace",
"Name" : "Marketplace", "Name" : "Marketplace",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "mcusupport",
"Name" : "McuSupport", "Name" : "McuSupport",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "mercurial",
"Name" : "Mercurial", "Name" : "Mercurial",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "brianmcgillion",
"Vendor" : "Brian McGillion", "Vendor" : "Brian McGillion",
"Copyright" : "(C) 2016 Brian McGillion, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2016 Brian McGillion, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "mesonprojectmanager",
"Name" : "MesonProjectManager", "Name" : "MesonProjectManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "laboratory of plasma physics",
"Vendor" : "Laboratory of Plasma Physics", "Vendor" : "Laboratory of Plasma Physics",
"Experimental" : true, "Experimental" : true,
"DisabledByDefault" : true, "DisabledByDefault" : true,

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "modeleditor",
"Name" : "ModelEditor", "Name" : "ModelEditor",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "jochenbecher",
"Vendor" : "Jochen Becher", "Vendor" : "Jochen Becher",
"Copyright" : "(C) 2017 Jochen Becher, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2017 Jochen Becher, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "nim",
"Name" : "Nim", "Name" : "Nim",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "filippocucchetto",
"Vendor" : "Filippo Cucchetto", "Vendor" : "Filippo Cucchetto",
"Copyright" : "(C) 2017 Filippo Cucchetto, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2017 Filippo Cucchetto, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,8 +1,10 @@
{ {
"Id" : "perforce",
"Name" : "Perforce", "Name" : "Perforce",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"DisabledByDefault" : true, "DisabledByDefault" : true,
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "perfprofiler",
"Name" : "PerfProfiler", "Name" : "PerfProfiler",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "projectexplorer",
"Name" : "Project Explorer", "Name" : "Project Explorer",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "python",
"Name" : "Python", "Name" : "Python",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qbsprojectmanager",
"Name" : "QbsProjectManager", "Name" : "QbsProjectManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmakeprojectmanager",
"Name" : "QmakeProjectManager", "Name" : "QmakeProjectManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmldesigner",
"Name" : "QmlDesigner", "Name" : "QmlDesigner",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmldesignerbase",
"Name" : "QmlDesignerBase", "Name" : "QmlDesignerBase",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmldesignerlite",
"Name" : "QmlDesignerLite", "Name" : "QmlDesignerLite",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmljseditor",
"Name" : "QmlJSEditor", "Name" : "QmlJSEditor",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmljstools",
"Name" : "QmlJSTools", "Name" : "QmlJSTools",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmlpreview",
"Name" : "QmlPreview", "Name" : "QmlPreview",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmlprofiler",
"Name" : "QmlProfiler", "Name" : "QmlProfiler",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qmlprojectmanager",
"Name" : "QmlProjectManager", "Name" : "QmlProjectManager",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qnx",
"Name" : "Qnx", "Name" : "Qnx",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "blackberry",
"Vendor" : "BlackBerry", "Vendor" : "BlackBerry",
"Copyright" : "(C) 2017 BlackBerry, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2017 BlackBerry, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,9 +1,11 @@
{ {
"Id" : "qtapplicationmanagerintegration",
"Name" : "QtApplicationManagerIntegration", "Name" : "QtApplicationManagerIntegration",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"Experimental" : true, "Experimental" : true,
"Revision" : "${QTC_PLUGIN_REVISION}", "Revision" : "${QTC_PLUGIN_REVISION}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) 2020 Luxoft Sweden AB, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) 2020 Luxoft Sweden AB, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

View File

@@ -1,7 +1,9 @@
{ {
"Id" : "qtsupport",
"Name" : "QtSupport", "Name" : "QtSupport",
"Version" : "${IDE_VERSION}", "Version" : "${IDE_VERSION}",
"CompatVersion" : "${IDE_VERSION_COMPAT}", "CompatVersion" : "${IDE_VERSION_COMPAT}",
"VendorId" : "theqtcompany",
"Vendor" : "The Qt Company Ltd", "Vendor" : "The Qt Company Ltd",
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd", "Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
"License" : [ "Commercial Usage", "License" : [ "Commercial Usage",

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