aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2020-10-08 12:04:06 +0200
committerEike Ziller <eike.ziller@qt.io>2020-10-08 12:04:06 +0200
commit9828e6887ed4e31c206505ce8f5b0a452b44ae74 (patch)
tree624dfc74416d90fea0bfd927055336aea2355416 /src/plugins/qmldesigner
parentc68f49fefaab4251c70c4ccaece0dd52993b653a (diff)
parente61152bf56fba1da4e6457dc801b7ac4b4216edb (diff)
Merge remote-tracking branch 'origin/4.14' into master
Diffstat (limited to 'src/plugins/qmldesigner')
-rw-r--r--src/plugins/qmldesigner/CMakeLists.txt15
-rw-r--r--src/plugins/qmldesigner/components/importmanager/importswidget.cpp15
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp53
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp6
-rw-r--r--src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp129
-rw-r--r--src/plugins/qmldesigner/designermcumanager.cpp267
-rw-r--r--src/plugins/qmldesigner/designermcumanager.h95
-rw-r--r--src/plugins/qmldesigner/qmldesignerplugin.pri6
-rw-r--r--src/plugins/qmldesigner/qmldesignerplugin.qbs2
-rw-r--r--src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp2
10 files changed, 438 insertions, 152 deletions
diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt
index 3d09bd2d193..11be30c80e1 100644
--- a/src/plugins/qmldesigner/CMakeLists.txt
+++ b/src/plugins/qmldesigner/CMakeLists.txt
@@ -1,3 +1,8 @@
+set(QmlDesignerPluginInstallPrefix "${IDE_PLUGIN_PATH}/qmldesigner")
+if (APPLE)
+ set(QmlDesignerPluginInstallPrefix "${IDE_PLUGIN_PATH}/QmlDesigner")
+endif()
+
add_qtc_plugin(QmlDesigner
DEPENDS
QmlJS LanguageUtils QmlEditorWidgets AdvancedDockingSystem
@@ -25,21 +30,17 @@ add_qtc_plugin(QmlDesigner
settingspage.cpp settingspage.h settingspage.ui
shortcutmanager.cpp shortcutmanager.h
switchsplittabwidget.cpp switchsplittabwidget.h
+ designermcumanager.cpp designermcumanager.h
EXPLICIT_MOC
components/propertyeditor/propertyeditorvalue.h
components/connectioneditor/connectionviewwidget.h
SKIP_DEBUG_CMAKE_FILE_CHECK
EXTRA_TRANSLATIONS
"${PROJECT_SOURCE_DIR}/share/qtcreator/qmldesigner"
+ PROPERTIES
+ QMLDESIGNER_PLUGIN_PATH "${QmlDesignerPluginInstallPrefix}"
)
-set(QmlDesignerPluginInstallPrefix "${IDE_PLUGIN_PATH}/qmldesigner")
-if (APPLE)
- set(QmlDesignerPluginInstallPrefix "${IDE_PLUGIN_PATH}/QmlDesigner")
-endif()
-
-extend_qtc_plugin(QmlDesigner PROPERTIES QMLDESIGNER_PLUGIN_PATH "${QmlDesignerPluginInstallPrefix}")
-
add_qtc_plugin(assetexporterplugin
CONDITION TARGET QmlDesigner
DEPENDS Core ProjectExplorer QmlDesigner Utils Qt5::Qml
diff --git a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp
index d69511acd67..283a0501150 100644
--- a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp
+++ b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp
@@ -29,6 +29,7 @@
#include <designdocument.h>
#include <qmldesignerplugin.h>
+#include <designermcumanager.h>
#include <utils/algorithm.h>
@@ -94,20 +95,20 @@ void ImportsWidget::setPossibleImports(QList<Import> possibleImports)
Utils::sort(possibleImports, importLess);
m_addImportComboBox->clear();
- const DesignDocument *designDocument = QmlDesignerPlugin::instance()->currentDesignDocument();
- const bool isQtForMCUs = designDocument && designDocument->isQtForMCUsProject();
+ const DesignerMcuManager &mcuManager = DesignerMcuManager::instance();
+ const bool isQtForMCUs = mcuManager.isMCUProject();
QList<Import> filteredImports;
- const QStringList mcuPostiveList = {"QtQuick", "QtQuick.Controls", "QtQuick.Timeline"};
- const QStringList mcuNegativeList = {"FlowView"};
+ const QStringList mcuAllowedList = mcuManager.allowedImports();
+ const QStringList mcuBannedList = mcuManager.bannedImports();
if (isQtForMCUs) {
filteredImports = Utils::filtered(possibleImports,
- [mcuPostiveList, mcuNegativeList](const Import &import) {
- return (mcuPostiveList.contains(import.url())
+ [mcuAllowedList, mcuBannedList](const Import &import) {
+ return (mcuAllowedList.contains(import.url())
|| !import.url().startsWith("Qt"))
- && !mcuNegativeList.contains(import.url());
+ && !mcuBannedList.contains(import.url());
});
} else {
filteredImports = possibleImports;
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
index 7f09bc0b493..a01ce38fc72 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp
@@ -35,6 +35,7 @@
#include <designdocument.h>
#include <qmldesignerplugin.h>
+#include <designermcumanager.h>
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
@@ -200,52 +201,12 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model)
forceVisiblity = isItem;
}
- DesignDocument *designDocument = QmlDesignerPlugin::instance()
- ->documentManager()
- .currentDesignDocument();
-
- if (designDocument && designDocument->isQtForMCUsProject()) {
- const QList<TypeName> blockTypes = {"QtQuick.AnimatedImage",
- "QtQuick.BorderImage",
- "QtQuick.FocusScope",
- "QtQuick.TextInput",
- "QtQuick.TextEdit",
- "QtQuick.Flow",
- "QtQuick.Grid",
- "QtQuick.GridView",
- "QtQuick.PathView",
- "QtQuick.Controls",
- "QtQuick.Controls.BusyIndicator",
- "QtQuick.Controls.ButtonGroup",
- "QtQuick.Controls.CheckDelegate",
- "QtQuick.Controls.Container",
- "QtQuick.Controls.ComboBox",
- "QtQuick.Controls.DelayButton",
- "QtQuick.Controls.Frame",
- "QtQuick.Controls.GroupBox",
- "QtQuick.Controls.ItemDelegate",
- "QtQuick.Controls.Label",
- "QtQuick.Controls.Page",
- "QtQuick.Controls.PageIndicator",
- "QtQuick.Controls.Pane",
- "QtQuick.Controls.RadioDelegate",
- "QtQuick.Controls.RangeSlider",
- "QtQuick.Controls.RoundButton",
- "QtQuick.Controls.ScrollView",
- "QtQuick.Controls.SpinBox",
- "QtQuick.Controls.StackView",
- "QtQuick.Controls.SwipeDelegate",
- "QtQuick.Controls.SwitchDelegate",
- "QtQuick.Controls.ToolBar",
- "QtQuick.Controls.ToolButton",
- "QtQuick.Controls.TabBar",
- "QtQuick.Controls.TabButton",
- "QtQuick.Controls.TextArea",
- "QtQuick.Controls.TextField",
- "QtQuick.Controls.ToolSeparator",
- "QtQuick.Controls.Tumbler"};
-
- if (blockTypes.contains(entry.typeName()))
+ const DesignerMcuManager &mcuManager = DesignerMcuManager::instance();
+
+ if (mcuManager.isMCUProject()) {
+ const QSet<QString> blockTypes = mcuManager.bannedItems();
+
+ if (blockTypes.contains(QString::fromUtf8(entry.typeName())))
valid = false;
}
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
index 8526e8a1f51..45e56011351 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
@@ -39,6 +39,7 @@
#include <qmldesignerplugin.h>
#include <qmldesignerconstants.h>
#include <designeractionmanager.h>
+#include <designermcumanager.h>
#include <utils/algorithm.h>
#include <utils/flowlayout.h>
@@ -351,8 +352,9 @@ void ItemLibraryWidget::reloadQmlSource()
void ItemLibraryWidget::setupImportTagWidget()
{
QTC_ASSERT(m_model, return);
- const DesignDocument *designDocument = QmlDesignerPlugin::instance()->currentDesignDocument();
- const bool isQtForMCUs = designDocument && designDocument->isQtForMCUsProject();
+
+ const DesignerMcuManager &mcuManager = DesignerMcuManager::instance();
+ const bool isQtForMCUs = mcuManager.isMCUProject();
const QStringList imports = m_model->metaInfo().itemLibraryInfo()->showTagsForImports();
diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp
index 56a17e3d11c..dd507df5ea7 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp
@@ -32,6 +32,8 @@
#include <nodemetainfo.h>
#include <qmldesignerplugin.h>
#include <qmlobjectnode.h>
+#include <designermcumanager.h>
+#include <qmlitemnode.h>
#include <utils/qtcassert.h>
@@ -261,76 +263,12 @@ bool PropertyEditorValue::isTranslated() const
return false;
}
-static bool itemOrImage(const QmlDesigner::NodeMetaInfo &metaInfo)
+static bool isAllowedSubclassType(const QString &type, const QmlDesigner::NodeMetaInfo &metaInfo)
{
if (!metaInfo.isValid())
return false;
- if (metaInfo.isSubclassOf("QtQuick.Image") || metaInfo.isSubclassOf("QtQuick.Text"))
- return true;
-
- return false;
-}
-
-static QList<QByteArray> prepareNonMcuProperties()
-{
- QList<QByteArray> result;
-
- //Builtins:
- const QList<QByteArray> itemProperties = {"layer", "opacity", "gradient", "smooth", "antialiasing",
- "border", "baselineOffset", "focus", "activeFocusOnTab"};
- const QList<QByteArray> mouseAreaProperties = {"propagateComposedEvents", "preventStealing", "cursorShape",
- "scrollGestureEnabled", "drag", "acceptedButtons", "hoverEnabled"};
- const QList<QByteArray> flickableProperties = {"boundsBehavior", "boundsMovement",
- "flickDeceleration", "flickableDirection",
- "leftMargin", "rightMargin", "bottomMargin", "topMargin",
- "originX", "originY",
- "pixelAligned", "pressDelay", "synchronousDrag"};
- const QList<QByteArray> imageProperties = {"mirror", "mipmap", "cache", "autoTransform", "asynchronous",
- "sourceSize", "smooth"};
- const QList<QByteArray> textProperties = {"elide", "lineHeight", "lineHeightMode", "wrapMode", "style",
- "styleColor", "minimumPointSize", "minimumPixelSize", "styleColor",
- "fontSizeMode", "renderType", "textFormat", "maximumLineCount"};
- const QList<QByteArray> paddingProperties = {"bottomPadding", "topPadding", "leftPadding", "rightPadding"};
- const QList<QByteArray> columnRowProperties = {"layoutDirection"};
- const QList<QByteArray> listViewProperties = {"cacheBuffer", "highlightRangeMode", "highlightMoveDuration",
- "highlightResizeDuration", "preferredHighlightBegin", "layoutDirection",
- "preferredHighlightEnd", "highlightFollowsCurrentItem", "keyNavigationWraps",
- "snapMode", "highlightMoveVelocity", "highlightResizeVelocity"};
- //Animations:
- const QList<QByteArray> animationProperties = {"paused"};
-
- //QtQuick.Controls:
- const QList<QByteArray> controlProperties = {"focusPolicy", "hoverEnabled", "wheelEnabled"};
- const QList<QByteArray> abstractButtonProperties = {"display", "autoExclusive"};
- const QList<QByteArray> buttonProperties = {"flat", "highlighted"};
- const QList<QByteArray> dialProperties = {}; //nothing in propeditor
- const QList<QByteArray> progressBarProperties = {"indeterminate"};
- const QList<QByteArray> radioButton = {}; //nothing in propeditor
- const QList<QByteArray> sliderProperties = {"live", "snapMode", "touchDragThreshold"};
- const QList<QByteArray> swipeViewProperties = {}; //nothing in propeditor
- const QList<QByteArray> switchProperties = {}; //nothing in propeditor
-
- result.append(itemProperties);
- result.append(mouseAreaProperties);
- result.append(flickableProperties);
- result.append(imageProperties);
- result.append(textProperties);
- result.append(paddingProperties);
- result.append(columnRowProperties);
- result.append(listViewProperties);
- result.append(animationProperties);
- result.append(controlProperties);
- result.append(abstractButtonProperties);
- result.append(buttonProperties);
- result.append(dialProperties);
- result.append(progressBarProperties);
- result.append(radioButton);
- result.append(sliderProperties);
- result.append(swipeViewProperties);
- result.append(switchProperties);
-
- return result;
+ return (metaInfo.isSubclassOf(type.toUtf8()));
}
bool PropertyEditorValue::isAvailable() const
@@ -338,31 +276,46 @@ bool PropertyEditorValue::isAvailable() const
if (!m_modelNode.isValid())
return true;
- const QList<QByteArray> nonMcuProperties = prepareNonMcuProperties();
-
- const QByteArray fontPrefix = {"font"};
- const QList<QByteArray> nonMcuFontProperties = {"wordSpacing", "letterSpacing", "hintingPreference",
- "kerning", "preferShaping", "capitalization",
- "strikeout", "underline", "styleName"};
-
- const QList<QByteArray> mcuTransformProperties = {"rotation", "scale", "transformOrigin"};
-
- const QList<QByteArray> list = name().split('.');
- const QByteArray pureName = list.constFirst();
-
- QmlDesigner::DesignDocument *designDocument = QmlDesigner::QmlDesignerPlugin::instance()
- ->documentManager()
- .currentDesignDocument();
-
- if (designDocument && designDocument->isQtForMCUsProject()) {
- if (pureName == fontPrefix) {
- if (nonMcuFontProperties.contains(list.constLast()))
- return false;
+ const QmlDesigner::DesignerMcuManager &mcuManager = QmlDesigner::DesignerMcuManager::instance();
+
+ if (mcuManager.isMCUProject()) {
+ const QSet<QString> nonMcuProperties = mcuManager.bannedProperties();
+ const auto mcuAllowedItemProperties = mcuManager.allowedItemProperties();
+ const auto mcuBannedComplexProperties = mcuManager.bannedComplexProperties();
+
+ const QList<QByteArray> list = name().split('.');
+ const QByteArray pureName = list.constFirst();
+ const QString pureNameStr = QString::fromUtf8(pureName);
+
+ const QByteArray ending = list.constLast();
+ const QString endingStr = QString::fromUtf8(ending);
+
+ //allowed item properties:
+ const auto itemTypes = mcuAllowedItemProperties.keys();
+ for (const auto &itemType : itemTypes) {
+ if (isAllowedSubclassType(itemType, m_modelNode.metaInfo())) {
+ const QmlDesigner::DesignerMcuManager::ItemProperties allowedItemProps =
+ mcuAllowedItemProperties.value(itemType);
+ if (allowedItemProps.properties.contains(pureNameStr)) {
+ if (QmlDesigner::QmlItemNode::isValidQmlItemNode(m_modelNode)) {
+ const bool itemHasChildren = QmlDesigner::QmlItemNode(m_modelNode).hasChildren();
+
+ if (allowedItemProps.allowChildren == itemHasChildren)
+ return true;
+ }
+ }
+ }
}
- if (nonMcuProperties.contains(pureName))
+
+ //banned properties:
+ //with prefixes:
+ if (mcuBannedComplexProperties.value(pureNameStr).contains(endingStr))
return false;
- if (mcuTransformProperties.contains(pureName) && !itemOrImage(m_modelNode.metaInfo()))
+
+ //general group:
+ if (nonMcuProperties.contains(pureNameStr))
return false;
+
}
return true;
diff --git a/src/plugins/qmldesigner/designermcumanager.cpp b/src/plugins/qmldesigner/designermcumanager.cpp
new file mode 100644
index 00000000000..d173ab6766c
--- /dev/null
+++ b/src/plugins/qmldesigner/designermcumanager.cpp
@@ -0,0 +1,267 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "designermcumanager.h"
+#include "qmldesignerconstants.h"
+#include "qmldesignerplugin.h"
+#include "designersettings.h"
+#include "designdocument.h"
+
+#include <qmljs/qmljssimplereader.h>
+
+#include <utils/qtcassert.h>
+
+namespace QmlDesigner {
+
+static QString readProperty(const QString property, const QmlJS::SimpleReaderNode::Ptr &node)
+{
+ const QVariant propertyVar = node->property(property);
+
+ if (!propertyVar.isNull() && propertyVar.isValid())
+ return propertyVar.value<QString>();
+
+ return {};
+}
+
+static QStringList readPropertyList(const QString &property, const QmlJS::SimpleReaderNode::Ptr &node)
+{
+ const QVariant propertyVar = node->property(property);
+
+ if (!propertyVar.isNull() && propertyVar.isValid())
+ return propertyVar.value<QStringList>();
+
+ return {};
+}
+
+DesignerMcuManager &DesignerMcuManager::instance()
+{
+ static DesignerMcuManager instance;
+
+ return instance;
+}
+
+QString DesignerMcuManager::mcuResourcesPath()
+{
+ return Core::ICore::resourcePath() + QStringLiteral("/qmldesigner/qt4mcu");
+}
+
+bool DesignerMcuManager::isMCUProject() const
+{
+ QmlDesigner::DesignDocument *designDocument = QmlDesigner::QmlDesignerPlugin::instance()
+ ->documentManager().currentDesignDocument();
+ if (designDocument)
+ return designDocument->isQtForMCUsProject();
+
+ return false;
+}
+
+void DesignerMcuManager::readMetadata()
+{
+ const QString mainMetadataFileName = "metadata.qml";
+
+ m_defaultVersion = {};
+ m_versionsList.clear();
+
+ QmlJS::SimpleReader reader;
+ const QmlJS::SimpleReaderNode::Ptr metadata =
+ reader.readFile(mcuResourcesPath() + "/" + mainMetadataFileName);
+ if (!metadata) {
+ qWarning() << "Designer MCU metadata:" << reader.errors();
+ return;
+ }
+
+ const QmlJS::SimpleReaderNode::List versions = metadata->children();
+
+ if (versions.isEmpty()) {
+ qWarning() << "Designer MCU metadata: metadata list is empty";
+ return;
+ }
+
+ const QVariant defaultVersion = metadata->property("defaultVersion");
+ if (!defaultVersion.isNull() && defaultVersion.isValid()) {
+ for (const auto& version : versions) {
+ Version newVersion;
+
+ const QVariant vId = version->property("id");
+ if (vId.isNull() || !vId.isValid())
+ continue;
+
+ const QVariant vName = version->property("name");
+ if (!vName.isNull() && vName.isValid())
+ newVersion.name = vName.value<QString>();
+ else
+ continue;
+
+ const QVariant vPath = version->property("path");
+ if (!vPath.isNull() && vPath.isValid())
+ newVersion.fileName = vPath.value<QString>();
+ else
+ continue;
+
+ m_versionsList.push_back(newVersion);
+
+ if (vId == defaultVersion)
+ m_defaultVersion = newVersion;
+ }
+ }
+}
+
+void DesignerMcuManager::readVersionData(const DesignerMcuManager::Version &version)
+{
+ m_currentVersion = {};
+ m_bannedItems.clear();
+ m_allowedImports.clear();
+ m_bannedImports.clear();
+ m_bannedProperties.clear();
+ m_allowedItemProperties.clear();
+ m_bannedComplexProperties.clear();
+
+ QmlJS::SimpleReader reader;
+ const QmlJS::SimpleReaderNode::Ptr versionData =
+ reader.readFile(mcuResourcesPath() + "/" + version.fileName);
+ if (!versionData) {
+ qWarning() << "Designer MCU metadata:" << reader.errors();
+ return;
+ }
+
+ const QmlJS::SimpleReaderNode::List info = versionData->children();
+
+ if (info.isEmpty()) {
+ qWarning() << "Designer MCU metadata: metadata list is empty";
+ return;
+ }
+
+ for (const auto& child : info) {
+ //handling specific item types:
+ if (child->name() == "ComplexProperty") {
+ if (child->propertyNames().contains("prefix")
+ && child->propertyNames().contains("bannedProperties")) {
+ const QString complexPropPrefix(readProperty("prefix", child));
+ const QStringList complexPropBans(readPropertyList("bannedProperties", child));
+
+ if (!complexPropPrefix.isEmpty() && !complexPropBans.isEmpty())
+ m_bannedComplexProperties.insert(complexPropPrefix, complexPropBans);
+ }
+
+ continue;
+ }
+
+ //handling allowed properties:
+ if (child->propertyNames().contains("allowedProperties")) {
+ ItemProperties allowedProperties;
+
+ const QVariant childrenPropertyVar = child->property("allowChildren");
+
+ if (!childrenPropertyVar.isNull() && childrenPropertyVar.isValid())
+ allowedProperties.allowChildren = childrenPropertyVar.toBool();
+
+ allowedProperties.properties = readPropertyList("allowedProperties", child);
+
+ if (!allowedProperties.properties.isEmpty())
+ m_allowedItemProperties.insert(child->name(), allowedProperties);
+ }
+
+ //handling banned properties:
+ const QStringList bannedProperties = readPropertyList("bannedProperties", child);
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
+ m_bannedProperties.unite(QSet<QString>(bannedProperties.begin(), bannedProperties.end()));
+#elif
+ m_bannedProperties.unite(QSet<QString>::fromList(bannedProperties));
+#endif
+
+ }
+
+ const QList<QString> bannedItems = readPropertyList("bannedItems", versionData);
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
+ m_bannedItems = QSet<QString>(bannedItems.begin(), bannedItems.end());
+#elif
+ m_bannedItems = QSet<QString>::fromList(bannedItems);
+#endif
+
+ m_allowedImports = readPropertyList("allowedImports", versionData);
+ m_bannedImports = readPropertyList("bannedImports", versionData);
+ m_currentVersion = version;
+}
+
+DesignerMcuManager::Version DesignerMcuManager::currentVersion() const
+{
+ return m_currentVersion;
+}
+
+DesignerMcuManager::Version DesignerMcuManager::defaultVersion() const
+{
+ return m_defaultVersion;
+}
+
+DesignerMcuManager::VersionsList DesignerMcuManager::versions() const
+{
+ return m_versionsList;
+}
+
+QSet<QString> DesignerMcuManager::bannedItems() const
+{
+ return m_bannedItems;
+}
+
+QSet<QString> DesignerMcuManager::bannedProperties() const
+{
+ return m_bannedProperties;
+}
+
+QStringList DesignerMcuManager::allowedImports() const
+{
+ return m_allowedImports;
+}
+
+QStringList DesignerMcuManager::bannedImports() const
+{
+ return m_bannedImports;
+}
+
+QHash<QString, DesignerMcuManager::ItemProperties> DesignerMcuManager::allowedItemProperties() const
+{
+ return m_allowedItemProperties;
+}
+
+QHash<QString, QStringList> DesignerMcuManager::bannedComplexProperties() const
+{
+ return m_bannedComplexProperties;
+}
+
+DesignerMcuManager::DesignerMcuManager()
+{
+ readMetadata();
+
+ readVersionData(m_defaultVersion);
+}
+
+DesignerMcuManager::~DesignerMcuManager()
+{
+
+}
+
+} // QmlDesigner
diff --git a/src/plugins/qmldesigner/designermcumanager.h b/src/plugins/qmldesigner/designermcumanager.h
new file mode 100644
index 00000000000..74f578afae2
--- /dev/null
+++ b/src/plugins/qmldesigner/designermcumanager.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#pragma once
+
+#include <coreplugin/icore.h>
+
+#include <QString>
+#include <QStringList>
+#include <QSet>
+#include <QHash>
+
+namespace QmlDesigner {
+
+class DesignerMcuManager
+{
+public:
+ struct Version {
+ QString name;
+ QString fileName;
+ };
+ using VersionsList = QList<Version>;
+
+ struct ItemProperties {
+ QStringList properties;
+ bool allowChildren = true;
+ };
+
+ static DesignerMcuManager& instance();
+
+ static QString mcuResourcesPath();
+
+ bool isMCUProject() const;
+
+ void readMetadata();
+ void readVersionData(const DesignerMcuManager::Version &version);
+
+ DesignerMcuManager::Version currentVersion() const;
+ DesignerMcuManager::Version defaultVersion() const;
+ DesignerMcuManager::VersionsList versions() const;
+
+ QSet<QString> bannedItems() const;
+ QSet<QString> bannedProperties() const;
+
+ QStringList allowedImports() const;
+ QStringList bannedImports() const;
+
+ QHash<QString, ItemProperties> allowedItemProperties() const;
+ QHash<QString, QStringList> bannedComplexProperties() const;
+
+ DesignerMcuManager(DesignerMcuManager const&) = delete;
+ void operator=(DesignerMcuManager const&) = delete;
+
+private:
+ DesignerMcuManager();
+ ~DesignerMcuManager();
+
+private:
+ DesignerMcuManager::Version m_currentVersion;
+ DesignerMcuManager::Version m_defaultVersion;
+
+ QSet<QString> m_bannedItems;
+ QSet<QString> m_bannedProperties;
+ QStringList m_allowedImports;
+ QStringList m_bannedImports;
+ QHash<QString, ItemProperties> m_allowedItemProperties;
+ QHash<QString, QStringList> m_bannedComplexProperties;
+
+ DesignerMcuManager::VersionsList m_versionsList;
+
+};
+
+} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pri b/src/plugins/qmldesigner/qmldesignerplugin.pri
index 9eba4c9a811..8c99395c58d 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.pri
+++ b/src/plugins/qmldesigner/qmldesignerplugin.pri
@@ -10,7 +10,8 @@ HEADERS += $$PWD/qmldesignerconstants.h \
$$PWD/documentmanager.h \
$$PWD/documentwarningwidget.h \
$$PWD/qmldesignericons.h \
- $$PWD/openuiqmlfiledialog.h
+ $$PWD/openuiqmlfiledialog.h \
+ $$PWD/designermcumanager.h
SOURCES += $$PWD/qmldesignerplugin.cpp \
$$PWD/shortcutmanager.cpp \
@@ -22,7 +23,8 @@ SOURCES += $$PWD/qmldesignerplugin.cpp \
$$PWD/designmodecontext.cpp \
$$PWD/documentmanager.cpp \
$$PWD/documentwarningwidget.cpp \
- $$PWD/openuiqmlfiledialog.cpp
+ $$PWD/openuiqmlfiledialog.cpp \
+ $$PWD/designermcumanager.cpp
FORMS += $$PWD/settingspage.ui \
$$PWD/openuiqmlfiledialog.ui
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs
index f95f853c7d6..ea57599bd08 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.qbs
+++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs
@@ -928,6 +928,8 @@ Project {
"settingspage.ui",
"shortcutmanager.cpp",
"shortcutmanager.h",
+ "designermcumanager.cpp",
+ "designermcumanager.h",
]
}
}
diff --git a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp
index 616678d8557..75d26a02155 100644
--- a/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp
+++ b/src/plugins/qmldesigner/qmlpreviewplugin/qmlpreviewactions.cpp
@@ -217,6 +217,8 @@ SwitchLanguageComboboxAction::SwitchLanguageComboboxAction(QObject *parent)
QWidget *SwitchLanguageComboboxAction::createWidget(QWidget *parent)
{
QPointer<QComboBox> comboBox = new QComboBox(parent);
+ // FIXME: this combobox does not work at the moment
+ comboBox->setDisabled(true);
const QString toolTip(tr("Switch the language used by preview."));
comboBox->setToolTip(toolTip);
comboBox->addItem(tr("Default"));