From fb685307f9d902131626abad1a1e710ff3906fcd Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 2 Mar 2023 13:21:40 +0100 Subject: [PATCH] QmlDesigner: Use StudioQuickWidget in content library The event filter has to be installed on the actual QQuickWidget. Using registerPropertyMap instead of global context properties. Task-number: QDS-9124 Change-Id: I148ecc6b489f6d72d80a345aa195f74676a92d51 Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Mahmoud Badri --- .../ContentLibrary.qml | 9 +++++---- .../ContentLibraryMaterial.qml | 7 ++++--- .../ContentLibraryMaterialsView.qml | 8 +++++--- .../ContentLibraryTexture.qml | 11 +++++----- .../ContentLibraryTextureContextMenu.qml | 11 +++++----- .../ContentLibraryTexturesView.qml | 3 ++- .../UnimportBundleMaterialDialog.qml | 3 ++- .../contentlibrary/contentlibrarywidget.cpp | 20 +++++++++---------- .../contentlibrary/contentlibrarywidget.h | 5 +++-- 9 files changed, 43 insertions(+), 34 deletions(-) diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml index fc2343009df..8717c741e5c 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml @@ -8,6 +8,7 @@ import QtQuickDesignerTheme import HelperWidgets 2.0 as HelperWidgets import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme +import ContentLibraryBackend Item { id: root @@ -50,16 +51,16 @@ Item { style: StudioTheme.Values.searchControlStyle enabled: { if (tabBar.currIndex === 0) { // Materials tab - materialsModel.matBundleExists - && rootView.hasMaterialLibrary - && materialsModel.hasRequiredQuick3DImport + ContentLibraryBackend.materialsModel.matBundleExists + && ContentLibraryBackend.rootView.hasMaterialLibrary + && ContentLibraryBackend.materialsModel.hasRequiredQuick3DImport } else { // Textures / Environments tabs texturesModel.texBundleExists } } onSearchChanged: (searchText) => { - rootView.handleSearchFilterChanged(searchText) + ContentLibraryBackend.rootView.handleSearchFilterChanged(searchText) // make sure categories with matches are expanded materialsView.expandVisibleSections() diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterial.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterial.qml index 23a8c5891e7..980001933a6 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterial.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterial.qml @@ -8,6 +8,7 @@ import HelperWidgets 2.0 import QtQuick.Controls import StudioTheme 1.0 as StudioTheme +import ContentLibraryBackend Item { id: root @@ -25,7 +26,7 @@ Item { onPressed: (mouse) => { if (mouse.button === Qt.LeftButton && !materialsModel.importerRunning) - rootView.startDragMaterial(modelData, mapToGlobal(mouse.x, mouse.y)) + ContentLibraryBackend.rootView.startDragMaterial(modelData, mapToGlobal(mouse.x, mouse.y)) else if (mouse.button === Qt.RightButton) root.showContextMenu() } @@ -81,11 +82,11 @@ Item { pressColor: Qt.hsla(c.hslHue, c.hslSaturation, c.hslLightness, .4) anchors.right: img.right anchors.bottom: img.bottom - enabled: !materialsModel.importerRunning + enabled: !ContentLibraryBackend.materialsModel.importerRunning visible: containsMouse || mouseArea.containsMouse onClicked: { - materialsModel.addToProject(modelData) + ContentLibraryBackend.materialsModel.addToProject(modelData) } } } diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterialsView.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterialsView.qml index bb0bca6d11a..30ef4057415 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterialsView.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryMaterialsView.qml @@ -5,18 +5,20 @@ import QtQuick import HelperWidgets as HelperWidgets import StudioControls as StudioControls import StudioTheme as StudioTheme +import ContentLibraryBackend HelperWidgets.ScrollView { id: root clip: true - interactive: !ctxMenu.opened && !rootView.isDragging + interactive: !ctxMenu.opened && !ContentLibraryBackend.rootView.isDragging readonly property int cellWidth: 100 readonly property int cellHeight: 120 property var currMaterialItem: null property var rootItem: null + property var materialsModel: ContentLibraryBackend.materialsModel required property var searchBox @@ -94,11 +96,11 @@ HelperWidgets.ScrollView { text: { if (!materialsModel.matBundleExists) qsTr("Content Library materials are not installed.") - else if (!rootView.hasQuick3DImport) + else if (!ContentLibraryBackend.rootView.hasQuick3DImport) qsTr("To use Content Library, first add the QtQuick3D module in the Components view.") else if (!materialsModel.hasRequiredQuick3DImport) qsTr("To use Content Library, version 6.3 or later of the QtQuick3D module is required.") - else if (!rootView.hasMaterialLibrary) + else if (!ContentLibraryBackend.rootView.hasMaterialLibrary) qsTr("Content Library is disabled inside a non-visual component.") else if (!searchBox.isEmpty()) qsTr("No match found.") diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexture.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexture.qml index 1890158aad2..533924a8328 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexture.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexture.qml @@ -10,6 +10,7 @@ import QtQuick.Controls import StudioTheme 1.0 as StudioTheme import WebFetcher 1.0 +import ContentLibraryBackend Item { id: root @@ -161,7 +162,7 @@ Item { onPressed: (mouse) => { if (mouse.button === Qt.LeftButton) { if (root.downloadState === "downloaded") - rootView.startDragTexture(modelData, mapToGlobal(mouse.x, mouse.y)) + ContentLibraryBackend.rootView.startDragTexture(modelData, mapToGlobal(mouse.x, mouse.y)) } else if (mouse.button === Qt.RightButton && root.downloadState === "downloaded") { root.showContextMenu() } @@ -174,7 +175,7 @@ Item { if (root.downloadState !== "" && root.downloadState !== "failed") return - if (!rootView.markTextureDownloading()) + if (!ContentLibraryBackend.rootView.markTextureDownloading()) return progressBar.visible = true @@ -216,7 +217,7 @@ Item { root.downloadStateChanged() mouseArea.enabled = true - rootView.markNoTextureDownloading() + ContentLibraryBackend.rootView.markNoTextureDownloading() } onDownloadFailed: { @@ -224,7 +225,7 @@ Item { root.downloadStateChanged() mouseArea.enabled = true - rootView.markNoTextureDownloading() + ContentLibraryBackend.rootView.markNoTextureDownloading() } } @@ -241,7 +242,7 @@ Item { root.downloadState = modelData.isDownloaded() ? "downloaded" : "failed" root.downloadStateChanged() - rootView.markNoTextureDownloading() + ContentLibraryBackend.rootView.markNoTextureDownloading() } } } diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml index b1617578ce1..fb1cbdba989 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml @@ -5,6 +5,7 @@ import QtQuick 2.15 import HelperWidgets 2.0 import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme +import ContentLibraryBackend StudioControls.Menu { id: root @@ -12,12 +13,12 @@ StudioControls.Menu { property var targetTexture: null property bool hasSceneEnv: false - property bool canUse3D: targetTexture && rootView.hasQuick3DImport && rootView.hasMaterialLibrary + property bool canUse3D: targetTexture && ContentLibraryBackend.rootView.hasQuick3DImport && ContentLibraryBackend.rootView.hasMaterialLibrary function popupMenu(targetTexture = null) { this.targetTexture = targetTexture - rootView.updateSceneEnvState(); + ContentLibraryBackend.rootView.updateSceneEnvState(); popup() } @@ -26,18 +27,18 @@ StudioControls.Menu { StudioControls.MenuItem { text: qsTr("Add image") enabled: root.targetTexture - onTriggered: rootView.addImage(root.targetTexture) + onTriggered: ContentLibraryBackend.rootView.addImage(root.targetTexture) } StudioControls.MenuItem { text: qsTr("Add texture") enabled: canUse3D - onTriggered: rootView.addTexture(root.targetTexture) + onTriggered: ContentLibraryBackend.rootView.addTexture(root.targetTexture) } StudioControls.MenuItem { text: qsTr("Add light probe") enabled: root.hasSceneEnv && canUse3D - onTriggered: rootView.addLightProbe(root.targetTexture) + onTriggered: ContentLibraryBackend.rootView.addLightProbe(root.targetTexture) } } diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexturesView.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexturesView.qml index aea8c8943ed..85b73a99f19 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexturesView.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTexturesView.qml @@ -5,12 +5,13 @@ import QtQuick import HelperWidgets as HelperWidgets import StudioControls as StudioControls import StudioTheme as StudioTheme +import ContentLibraryBackend HelperWidgets.ScrollView { id: root clip: true - interactive: !ctxMenu.opened && !rootView.isDragging + interactive: !ctxMenu.opened && !ContentLibraryBackend.rootView.isDragging readonly property int cellWidth: 100 readonly property int cellHeight: 100 diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/UnimportBundleMaterialDialog.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/UnimportBundleMaterialDialog.qml index 1c887ca317f..fa9a6dc03af 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/UnimportBundleMaterialDialog.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/UnimportBundleMaterialDialog.qml @@ -8,6 +8,7 @@ import QtQuickDesignerTheme import HelperWidgets import StudioControls as StudioControls import StudioTheme as StudioTheme +import ContentLibraryBackend Dialog { id: root @@ -47,7 +48,7 @@ Dialog { text: qsTr("Remove") onClicked: { - materialsModel.removeFromProject(root.targetBundleMaterial) + ContentLibraryBackend.materialsModel.removeFromProject(root.targetBundleMaterial) root.accept() } } diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp index cacff6bf06e..a1f97a6f977 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -91,7 +92,7 @@ bool ContentLibraryWidget::eventFilter(QObject *obj, QEvent *event) } ContentLibraryWidget::ContentLibraryWidget() - : m_quickWidget(new QQuickWidget(this)) + : m_quickWidget(new StudioQuickWidget(this)) , m_materialsModel(new ContentLibraryMaterialsModel(this)) , m_texturesModel(new ContentLibraryTexturesModel("Textures", this)) , m_environmentsModel(new ContentLibraryTexturesModel("Environments", this)) @@ -119,15 +120,8 @@ ContentLibraryWidget::ContentLibraryWidget() m_environmentsModel->loadTextureBundle(textureBundlePath + "/Environments", baseUrl + "/Environments", metaData); - m_quickWidget->rootContext()->setContextProperties({ - {"rootView", QVariant::fromValue(this)}, - {"materialsModel", QVariant::fromValue(m_materialsModel.data())}, - {"texturesModel", QVariant::fromValue(m_texturesModel.data())}, - {"environmentsModel", QVariant::fromValue(m_environmentsModel.data())}, - }); - Theme::setupTheme(m_quickWidget->engine()); - m_quickWidget->installEventFilter(this); + m_quickWidget->quickWidget()->installEventFilter(this); auto layout = new QVBoxLayout(this); layout->setContentsMargins({}); @@ -144,6 +138,13 @@ ContentLibraryWidget::ContentLibraryWidget() QmlDesignerPlugin::trackWidgetFocusTime(this, Constants::EVENT_CONTENTLIBRARY_TIME); + auto map = m_quickWidget->registerPropertyMap("ContentLibraryBackend"); + + map->setProperties({{"rootView", QVariant::fromValue(this)}, + {"materialsModel", QVariant::fromValue(m_materialsModel.data())}, + {"texturesModel", QVariant::fromValue(m_texturesModel.data())}, + {"environmentsModel", QVariant::fromValue(m_environmentsModel.data())}}); + reloadQmlSource(); } @@ -218,7 +219,6 @@ void ContentLibraryWidget::reloadQmlSource() QTC_ASSERT(QFileInfo::exists(materialBrowserQmlPath), return); - m_quickWidget->engine()->clearComponentCache(); m_quickWidget->setSource(QUrl::fromLocalFile(materialBrowserQmlPath)); } diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h index 28ac67a330e..52128cd8a65 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h @@ -11,9 +11,10 @@ QT_BEGIN_NAMESPACE class QShortcut; class QToolButton; -class QQuickWidget; QT_END_NAMESPACE +class StudioQuickWidget; + namespace QmlDesigner { class ContentLibraryTexture; @@ -80,7 +81,7 @@ private: void setIsDragging(bool val); QString findTextureBundlePath(); - QScopedPointer m_quickWidget; + QScopedPointer m_quickWidget; QPointer m_materialsModel; QPointer m_texturesModel; QPointer m_environmentsModel;