diff options
author | Eike Ziller <eike.ziller@qt.io> | 2020-10-08 12:04:06 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-10-08 12:04:06 +0200 |
commit | 9828e6887ed4e31c206505ce8f5b0a452b44ae74 (patch) | |
tree | 624dfc74416d90fea0bfd927055336aea2355416 /src/plugins/qmldesigner | |
parent | c68f49fefaab4251c70c4ccaece0dd52993b653a (diff) | |
parent | e61152bf56fba1da4e6457dc801b7ac4b4216edb (diff) |
Merge remote-tracking branch 'origin/4.14' into master
Change-Id: Ie53b4c2516d80a653d51bc6b666040c586ce44ab
Diffstat (limited to 'src/plugins/qmldesigner')
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")); |