diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp index dd21622b5dc..74c2eb270ef 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp @@ -826,8 +826,15 @@ bool GeneralHelper::getBounds(QQuick3DViewport *view3D, QQuick3DNode *node, QVec auto renderNode = static_cast(nodePriv->spatialNode); if (recursive && renderNode) { +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) if (renderNode->flags.testFlag(QSSGRenderNode::Flag::TransformDirty)) renderNode->calculateLocalTransform(); +#else + if (renderNode->isDirty(QSSGRenderNode::DirtyFlag::TransformDirty)) { + renderNode->localTransform = QSSGRenderNode::calculateTransformMatrix( + node->position(), node->scale(), node->pivot(), node->rotation()); + } +#endif localTransform = renderNode->localTransform; } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp index 8296c9155d7..dc4484de9d9 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/selectionboxgeometry.cpp @@ -192,7 +192,11 @@ void SelectionBoxGeometry::doUpdateGeometry() m = targetRN->parent->globalTransform; } rootRN->localTransform = m; +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) rootRN->markDirty(QSSGRenderNode::TransformDirtyFlag::TransformNotDirty); +#else + rootRN->markDirty(QSSGRenderNode::DirtyFlag::TransformDirty); +#endif rootRN->calculateGlobalVariables(); } else if (!m_spatialNodeUpdatePending) { // Necessary spatial nodes do not yet exist. Defer selection box creation one frame. @@ -236,8 +240,15 @@ void SelectionBoxGeometry::getBounds( if (node != m_targetNode) { if (renderNode) { +#if QT_VERSION < QT_VERSION_CHECK(6, 4, 0) if (renderNode->flags.testFlag(QSSGRenderNode::Flag::TransformDirty)) renderNode->calculateLocalTransform(); +#else + if (renderNode->isDirty(QSSGRenderNode::DirtyFlag::TransformDirty)) { + renderNode->localTransform = QSSGRenderNode::calculateTransformMatrix( + node->position(), node->scale(), node->pivot(), node->rotation()); + } +#endif localTransform = renderNode->localTransform; } trackNodeChanges(node); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/import3d/import3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/import3d/import3d.cpp index 1f24aaca8f8..2bc6135ce9b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/import3d/import3d.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/import3d/import3d.cpp @@ -52,7 +52,12 @@ void import3D(const QString &sourceAsset, const QString &outDir, const QString & if (!optDoc.isNull() && optDoc.isObject()) { QJsonObject optObj = optDoc.object(); - if (importer->importFile(sourceAsset, outDir, optObj.toVariantMap(), &errorStr) +#if (QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)) + const auto &optionsMap = optObj; +#else + const auto optionsMap = optObj.toVariantMap(); +#endif // QT_VERSION >= 6.4.0 + if (importer->importFile(sourceAsset, outDir, optionsMap, &errorStr) != QSSGAssetImportManager::ImportState::Success) { } } else { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index c6acc5e5f9d..5183b5cd8fc 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -118,6 +118,7 @@ #endif #ifdef IMPORT_QUICK3D_ASSETS +#include #include #endif @@ -303,7 +304,15 @@ void Qt5InformationNodeInstanceServer::resolveImportSupport() #ifdef IMPORT_QUICK3D_ASSETS QSSGAssetImportManager importManager; const QHash supportedExtensions = importManager.getSupportedExtensions(); - const QHash supportedOptions = importManager.getAllOptions(); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)) +#define AS_VARIANT_MAP(IT) IT.value().toVariantMap() + using PluginOptionMaps = QSSGAssetImportManager::PluginOptionMaps; +#else +#define AS_VARIANT_MAP(IT) IT.value() + using PluginOptionMaps = QHash; +#endif // QT_VERSION >= 6.4.0 + + const PluginOptionMaps supportedOptions = importManager.getAllOptions(); QVariantMap supportMap; @@ -317,7 +326,7 @@ void Qt5InformationNodeInstanceServer::resolveImportSupport() QVariantMap optMap; auto itOpt = supportedOptions.constBegin(); while (itOpt != supportedOptions.constEnd()) { - optMap.insert(itOpt.key(), itOpt.value()); + optMap.insert(itOpt.key(), AS_VARIANT_MAP(itOpt)); ++itOpt; } diff --git a/share/qtcreator/qmldesigner/qt4mcu/metadata.qml b/share/qtcreator/qmldesigner/qt4mcu/metadata.qml index 5e5c515199d..97f058f2c70 100644 --- a/share/qtcreator/qmldesigner/qt4mcu/metadata.qml +++ b/share/qtcreator/qmldesigner/qt4mcu/metadata.qml @@ -27,7 +27,7 @@ Metadata { id: metadataFile - defaultVersion: v21 + defaultVersion: v22 VersionData { id: v14 @@ -64,4 +64,10 @@ Metadata { name: "Qt for MCUs 2.1" path: "qul-21.qml" } + + VersionData { + id: v22 + name: "Qt for MCUs 2.2" + path: "qul-22.qml" + } } diff --git a/share/qtcreator/qmldesigner/qt4mcu/qul-22.qml b/share/qtcreator/qmldesigner/qt4mcu/qul-22.qml new file mode 100644 index 00000000000..a539a0aeb25 --- /dev/null +++ b/share/qtcreator/qmldesigner/qt4mcu/qul-22.qml @@ -0,0 +1,225 @@ +/**************************************************************************** +** +** Copyright (C) 2022 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. +** +****************************************************************************/ + +//differences from 2.0: +//2.1: + text.elide +//2.2: + text.wrapMode + +VersionData { + name: "Qt for MCUs 2.2" + + bannedItems: ["QtQuick.AnimatedImage", + "QtQuick.FocusScope", + "QtQuick.TextInput", + "QtQuick.TextEdit", + "QtQuick.Flow", + "QtQuick.Grid", + "QtQuick.GridView", + "QtQuick.PathView", + "QtQuick.Loader", + "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", + "QtQuick.Shapes.ConicalGradient", + "QtQuick.Shapes.LinearGradient", + "QtQuick.Shapes.RadialGradient", + "QtQuick.Shapes.ShapeGradient"] + + allowedImports: ["QtQuick", + "QtQuick.Shapes", + "QtQuick.Controls", + "QtQuick.Timeline", + "QtQuickUltralite.Extras", + "QtQuickUltralite.Layers"] + + bannedImports: ["FlowView"] + + //ComplexProperty is not a type, it's just a way to handle bigger props + ComplexProperty { + prefix: "font" + bannedProperties: ["wordSpacing", "letterSpacing", "hintingPreference", + "kerning", "preferShaping", "capitalization", + "strikeout", "underline", "styleName"] + } + + QtQuick.Item { + bannedProperties: ["layer", "opacity", "smooth", "antialiasing", + "baselineOffset", "focus", "activeFocusOnTab", + "rotation", "scale", "transformOrigin"] + } + + QtQuick.Rectangle { + bannedProperties: ["gradient", "border"] + } + + QtQuick.Flickable { + bannedProperties: ["boundsBehavior", "boundsMovement", "flickDeceleration", + "flickableDirection", "leftMargin", "rightMargin", "bottomMargin", "topMargin", + "originX", "originY", "pixelAligned", "pressDelay", "synchronousDrag"] + } + + QtQuick.MouseArea { + bannedProperties: ["propagateComposedEvents", "preventStealing", "cursorShape", + "scrollGestureEnabled", "drag", "acceptedButtons", "hoverEnabled"] + } + + QtQuick.Image { + allowChildren: false + allowedProperties: ["rotation", "scale", "transformOrigin"] + bannedProperties: ["mirror", "mipmap", "cache", "autoTransform", "asynchronous", + "sourceSize", "smooth"] + } + + QtQuick.BorderImage { + bannedProperties: ["asynchronous", "cache", "currentFrame", "frameCount", + "horizontalTileMode", "mirror", "progress", "smooth", "sourceSize", + "status", "verticalTileMode"] + } + + QtQuick.Text { + allowChildren: false + allowedProperties: ["rotation", "scale", "transformOrigin"] + bannedProperties: ["lineHeight", "lineHeightMode", "style", + "styleColor", "minimumPointSize", "minimumPixelSize", + "fontSizeMode", "renderType", "renderTypeQuality", "textFormat", "maximumLineCount"] + } + + //Padding is not an actual item, but rather set of properties in Text + Padding { + bannedProperties: ["bottomPadding", "topPadding", "leftPadding", "rightPadding"] + } + + QtQuick.Column { + bannedProperties: ["bottomPadding", "leftPadding", "rightPadding", "topPadding"] + } + + QtQuick.Row { + bannedProperties: ["bottomPadding", "leftPadding", "rightPadding", "topPadding", + "effectiveLayoutDirection", "layoutDirection"] + } + + QtQuick.ListView { + bannedProperties: ["cacheBuffer", "highlightRangeMode", "highlightMoveDuration", + "highlightResizeDuration", "preferredHighlightBegin", "layoutDirection", + "preferredHighlightEnd", "highlightFollowsCurrentItem", "keyNavigationWraps", + "snapMode", "highlightMoveVelocity", "highlightResizeVelocity"] + } + + QtQuick.Animation { + bannedProperties: ["paused"] + } + + //Quick Controls2 Items and properties: + + QtQuick.Controls.Control { + bannedProperties: ["focusPolicy", "hoverEnabled", "wheelEnabled"] + } + + QtQuick.Controls.AbstractButton { + bannedProperties: ["display", "autoExclusive"] + } + + QtQuick.Controls.ProgressBar { + bannedProperties: ["indeterminate"] + } + + QtQuick.Controls.Slider { + bannedProperties: ["live", "snapMode", "touchDragThreshold"] + } + + //Path and Shapes related: + + QtQuick.Path { + bannedProperties: ["scale", "pathElements"] + } + + QtQuick.PathArc { + bannedProperties: ["relativeX", "relativeY"] + } + + QtQuick.PathLine { + bannedProperties: ["relativeX", "relativeY"] + } + + QtQuick.PathMove { + bannedProperties: ["relativeX", "relativeY"] + } + + QtQuick.PathQuad { + bannedProperties: ["relativeX", "relativeY", + "relativeControlX", "relativeControlY"] + } + + QtQuick.PathCubic { + bannedProperties: ["relativeX", "relativeY", + "relativeControl1X", "relativeControl1Y", + "relativeControl2X", "relativeControl2Y"] + } + + QtQuick.PathElement { + //nothing + } + + QtQuick.PathSvg { + //nothing + } + + QtQuick.Shapes.Shape { + bannedProperties: ["asynchronous", "containsMode", "data", + "renderType", "status", "vendorExtensionsEnabled"] + } + + QtQuick.Shapes.ShapePath { + bannedProperties: ["dashOffset", "dashPattern", + "fillGradient", "strokeStyle"] + } +} diff --git a/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/Screen01.ui.qml.tpl b/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/Screen01.ui.qml.tpl index 1da5c8844ba..338621b72e0 100644 --- a/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/Screen01.ui.qml.tpl +++ b/share/qtcreator/qmldesigner/studio_templates/projects/application-3d/Screen01.ui.qml.tpl @@ -49,13 +49,18 @@ Rectangle { id: cubeModel eulerRotation.y: 45 eulerRotation.x: 30 - materials: cubeMaterial + materials: defaultMaterial source: "#Cube" - DefaultMaterial { - id: cubeMaterial - diffuseColor: "#4aee45" - } } } } + + Item { + id: __materialLibrary__ + DefaultMaterial { + id: defaultMaterial + objectName: "Default Material" + diffuseColor: "#4aee45" + } + } } diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 654da4d43a4..dc19983f66c 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -323,6 +323,7 @@ extend_qtc_plugin(QmlDesigner materialeditorqmlbackend.cpp materialeditorqmlbackend.h materialeditortransaction.cpp materialeditortransaction.h materialeditorview.cpp materialeditorview.h + materialeditor.qrc ) extend_qtc_plugin(QmlDesigner diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index eca26840aa4..30f909f1598 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -344,13 +344,13 @@ void Edit3DView::createEdit3DActions() m_backgroundColorSelectionAction = new Edit3DAction( QmlDesigner::Constants::EDIT3D_EDIT_SELECT_BACKGROUND_COLOR, View3DActionCommand::SelectBackgroundColor, - QCoreApplication::translate("SelectBackgroundColorAction", "Select Background color"), + QCoreApplication::translate("SelectBackgroundColorAction", "Select Background Color"), {}, false, false, {}, {}, showBackgroundColorSelection, - QCoreApplication::translate("SelectBackgroundColorAction", "Choose a color for the background.")); + QCoreApplication::translate("SelectBackgroundColorAction", "Select a color for the background of the 3D Editor.")); m_resetBackgroundColorAction = new Edit3DAction( QmlDesigner::Constants::EDIT3D_EDIT_RESET_BACKGROUND_COLOR, View3DActionCommand::ResetBackgroundColor, - QCoreApplication::translate("ResetBackgroundColorAction", "Reset Background color"), + QCoreApplication::translate("ResetBackgroundColorAction", "Reset Background Color"), {}, false, false, {}, {}, [](const SelectionContext &) { QList colors = {QRgb(0x222222), QRgb(0x999999)}; auto view = QmlDesignerPlugin::instance()->viewManager().nodeInstanceView(); @@ -362,7 +362,7 @@ void Edit3DView::createEdit3DActions() QmlDesigner::DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR, QVariant::fromValue(colorsToSave)); }, - QCoreApplication::translate("ResetBackgroundColorAction", "Reset Background color to the default value.")); + QCoreApplication::translate("ResetBackgroundColorAction", "Reset background color of the 3D Editor to the default value.")); m_showSelectionBoxAction = new Edit3DAction( QmlDesigner::Constants::EDIT3D_EDIT_SHOW_SELECTION_BOX, View3DActionCommand::ShowSelectionBox, diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 6f685123cfd..afa05dd67e2 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -141,7 +141,9 @@ Edit3DWidget::Edit3DWidget(Edit3DView *view) : m_visibilityTogglesMenu = new Edit3DVisibilityTogglesMenu(this); handleActions(view->visibilityToggleActions(), m_visibilityTogglesMenu, false); - m_backgroundColorMenu = new Edit3DVisibilityTogglesMenu(this); + m_backgroundColorMenu = new QMenu(this); + m_backgroundColorMenu->setToolTipsVisible(true); + handleActions(view->backgroundColorActions(), m_backgroundColorMenu, false); view->setSeeker(seeker); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp index 4962f5d6b4c..6ca0ddbc749 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarycategoriesmodel.cpp @@ -207,10 +207,11 @@ void ItemLibraryCategoriesModel::clearSelectedCategory(int categoryIndex) QPointer ItemLibraryCategoriesModel::selectCategory(int categoryIndex) { - if (categoryIndex == -1 || m_categoryList.isEmpty()) + if (m_categoryList.isEmpty() || categoryIndex < 0 || categoryIndex >= m_categoryList.size()) return nullptr; const QPointer category = m_categoryList.at(categoryIndex); + if (!category->categorySelected()) { category->setCategorySelected(true); emit dataChanged(index(categoryIndex),index(categoryIndex), {m_roleNames.key("categorySelected")}); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index e94c5108b13..2149049b004 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -72,6 +72,7 @@ void ItemLibraryView::modelAttached(Model *model) AbstractView::modelAttached(model); m_widget->clearSearchFilter(); + m_widget->switchToComponentsView(); m_widget->setModel(model); updateImports(); if (model) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 75a564d7384..e6f2b2825e5 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -278,7 +278,7 @@ void ItemLibraryWidget::handleAddImport(int index) imports.append(import); model->changeImports(imports, {}); - QMetaObject::invokeMethod(m_itemsWidget->rootObject(), "switchToComponentsView"); + switchToComponentsView(); updateSearch(); } @@ -310,7 +310,7 @@ void ItemLibraryWidget::setModel(Model *model) m_subCompEditMode = subCompEditMode; // Switch out of add module view if it's active if (m_subCompEditMode) - QMetaObject::invokeMethod(m_itemsWidget->rootObject(), "switchToComponentsView"); + switchToComponentsView(); emit subCompEditModeChanged(); } } @@ -330,6 +330,11 @@ void ItemLibraryWidget::clearSearchFilter() QMetaObject::invokeMethod(m_itemsWidget->rootObject(), "clearSearchFilter"); } +void ItemLibraryWidget::switchToComponentsView() +{ + QMetaObject::invokeMethod(m_itemsWidget->rootObject(), "switchToComponentsView"); +} + void ItemLibraryWidget::reloadQmlSource() { const QString itemLibraryQmlPath = qmlSourcesPath() + "/ItemsView.qml"; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h index be905f181ae..1b63c2fc660 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h @@ -73,8 +73,9 @@ public: QList createToolBarWidgets(); static QString qmlSourcesPath(); - void clearSearchFilter(); + void clearSearchFilter(); + void switchToComponentsView(); void delayedUpdateModel(); void updateModel(); void updatePossibleImports(const QList &possibleImports); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 896ec7818c5..d8c7286411f 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -252,7 +252,6 @@ void MaterialBrowserView::importsChanged(const QList &addedImports, cons m_hasQuick3DImport = hasQuick3DImport; refreshModel(); - } void MaterialBrowserView::customNotification(const AbstractView *view, const QString &identifier, diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index 4ca84cdfb9d..156add5d2da 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -81,11 +81,15 @@ public: { Q_UNUSED(requestedSize) + static QPixmap defaultPreview = QPixmap::fromImage(QImage(":/materialeditor/images/defaultmaterialpreview.png")); + QPixmap pixmap{150, 150}; qint32 internalId = id.toInt(); if (m_pixmaps.contains(internalId)) pixmap = m_pixmaps.value(internalId); + else + pixmap = defaultPreview; if (size) *size = pixmap.size(); diff --git a/src/plugins/qmldesigner/components/materialeditor/images/defaultmaterialpreview.png b/src/plugins/qmldesigner/components/materialeditor/images/defaultmaterialpreview.png new file mode 100644 index 00000000000..93073719f55 Binary files /dev/null and b/src/plugins/qmldesigner/components/materialeditor/images/defaultmaterialpreview.png differ diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditor.qrc b/src/plugins/qmldesigner/components/materialeditor/materialeditor.qrc new file mode 100644 index 00000000000..4ed3c769175 --- /dev/null +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditor.qrc @@ -0,0 +1,5 @@ + + + images/defaultmaterialpreview.png + + diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp index 828e5fab006..7c5d8436226 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp @@ -77,16 +77,21 @@ public: { Q_UNUSED(requestedSize) + static QPixmap defaultPreview = QPixmap::fromImage(QImage(":/materialeditor/images/defaultmaterialpreview.png")); + QPixmap pixmap{150, 150}; if (id == "preview") { if (!m_previewPixmap.isNull()) pixmap = m_previewPixmap; + else + pixmap = defaultPreview; } else { - QString path = Core::ICore::resourcePath("qmldesigner/materialEditorQmlSources/images/" + id).toString(); - pixmap = QPixmap{path}; + qWarning() << __FUNCTION__ << "Unsupported image id:" << id; + pixmap.fill(Qt::red); } + if (size) *size = pixmap.size(); diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index e2736068053..aad0ea660ad 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -87,28 +87,35 @@ void MaterialEditorView::ensureMaterialLibraryNode() if (m_materialLibrary.isValid()) return; - const QList materials = rootModelNode().subModelNodesOfType("QtQuick3D.Material"); - if (materials.isEmpty()) - return; - // create material library node - TypeName nodeType = rootModelNode().isSubclassOf("QtQuick3D.Node") ? "Quick3D.Node" : "QtQuick.Item"; + TypeName nodeType = rootModelNode().isSubclassOf("QtQuick3D.Node") ? "QtQuick3D.Node" : "QtQuick.Item"; NodeMetaInfo metaInfo = model()->metaInfo(nodeType); m_materialLibrary = createModelNode(nodeType, metaInfo.majorVersion(), metaInfo.minorVersion()); m_materialLibrary.setIdWithoutRefactoring(Constants::MATERIAL_LIB_ID); rootModelNode().defaultNodeListProperty().reparentHere(m_materialLibrary); - // move all materials to under material library node - for (const ModelNode &node : materials) { - // if material has no name, set name to id - QString matName = node.variantProperty("objectName").value().toString(); - if (matName.isEmpty()) { - VariantProperty objNameProp = node.variantProperty("objectName"); - objNameProp.setValue(node.id()); - } + const QList materials = rootModelNode().subModelNodesOfType("QtQuick3D.Material"); + if (materials.isEmpty()) + return; - m_materialLibrary.defaultNodeListProperty().reparentHere(node); + RewriterTransaction transaction = beginRewriterTransaction( + "MaterialEditorView::ensureMaterialLibraryNode"); + + try { + // move all materials to under material library node + for (const ModelNode &node : materials) { + // if material has no name, set name to id + QString matName = node.variantProperty("objectName").value().toString(); + if (matName.isEmpty()) { + VariantProperty objNameProp = node.variantProperty("objectName"); + objNameProp.setValue(node.id()); + } + + m_materialLibrary.defaultNodeListProperty().reparentHere(node); + } + } catch (Exception &e) { + e.showException(); } } @@ -560,8 +567,6 @@ void MaterialEditorView::modelAttached(Model *model) m_hasQuick3DImport = model->hasImport("QtQuick3D"); - ensureMaterialLibraryNode(); - if (!m_setupCompleted) { reloadQml(); m_setupCompleted = true; @@ -739,7 +744,6 @@ void MaterialEditorView::importsChanged(const QList &addedImports, const m_hasQuick3DImport = model()->hasImport("QtQuick3D"); m_qmlBackEnd->contextObject()->setHasQuick3DImport(m_hasQuick3DImport); - ensureMaterialLibraryNode(); // create the material lib if Quick3D import is added resetView(); } diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp b/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp index 7890086bd5f..429ca328afd 100644 --- a/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp +++ b/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp @@ -97,8 +97,8 @@ void ImageCacheCollector::start(Utils::SmallStringView name, model->setRewriterView(&rewriterView); bool is3DRoot = !rewriterView.inErrorState() - && (rewriterView.rootModelNode().isSubclassOf("Quick3D.Node") - || rewriterView.rootModelNode().isSubclassOf("Quick3D.Material")); + && (rewriterView.rootModelNode().isSubclassOf("QtQuick3D.Node") + || rewriterView.rootModelNode().isSubclassOf("QtQuick3D.Material")); if (rewriterView.inErrorState() || (!rewriterView.rootModelNode().metaInfo().isGraphicalItem() && !is3DRoot)) { diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 5eef5550da7..1db2bc3cb6a 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -1150,12 +1150,12 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() if (stateNode.isValid() && stateNode.metaInfo().isSubclassOf("QtQuick.State", 1, 0)) stateInstanceId = stateNode.internalId(); - auto value + QVariant value #ifndef QMLDESIGNER_TEST = QmlDesigner::DesignerSettings::getValue( QmlDesigner::DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR); #else - = QColor(); + = {}; #endif QList edit3dBackgroundColor; if (value.isValid()) diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 9c1aec1b364..20083068c16 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -80,7 +80,8 @@ void DesignerSettings::fromSettings(QSettings *settings) restoreValue(settings, DesignerSettingsKey::ALWAYS_DESIGN_MODE, true); restoreValue(settings, DesignerSettingsKey::DISABLE_ITEM_LIBRARY_UPDATE_TIMER, false); restoreValue(settings, DesignerSettingsKey::ASK_BEFORE_DELETING_ASSET, true); - restoreValue(settings, DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR, QList{"#222222", "#999999"}); + const QStringList defaultValue = QStringList() << "#222222" << "#999999"; + restoreValue(settings, DesignerSettingsKey::EDIT3DVIEW_BACKGROUND_COLOR, defaultValue); settings->endGroup(); settings->endGroup(); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 375f9e82233..0ea3b5008a1 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -693,6 +693,7 @@ Project { "materialeditor/materialeditortransaction.h", "materialeditor/materialeditorview.cpp", "materialeditor/materialeditorview.h", + "materialeditor/materialeditor.qrc", "navigator/iconcheckboxitemdelegate.cpp", "navigator/iconcheckboxitemdelegate.h", "navigator/nameitemdelegate.cpp", diff --git a/tests/system/shared/suites_qtta.py b/tests/system/shared/suites_qtta.py old mode 100755 new mode 100644 diff --git a/tests/system/suite_CCOM/tst_CCOM01/test.py b/tests/system/suite_CCOM/tst_CCOM01/test.py old mode 100755 new mode 100644 diff --git a/tests/system/suite_CCOM/tst_CCOM02/test.py b/tests/system/suite_CCOM/tst_CCOM02/test.py old mode 100755 new mode 100644 diff --git a/tests/system/suite_HELP/tst_HELP02/test.py b/tests/system/suite_HELP/tst_HELP02/test.py old mode 100755 new mode 100644 diff --git a/tests/system/suite_HELP/tst_HELP05/test.py b/tests/system/suite_HELP/tst_HELP05/test.py old mode 100755 new mode 100644 diff --git a/tests/system/suite_HELP/tst_HELP06/test.py b/tests/system/suite_HELP/tst_HELP06/test.py old mode 100755 new mode 100644 diff --git a/tests/system/suite_WELP/tst_WELP01/test.py b/tests/system/suite_WELP/tst_WELP01/test.py old mode 100755 new mode 100644 diff --git a/tests/system/tools/objectsToTable.py b/tests/system/tools/objectsToTable.py old mode 100755 new mode 100644