diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml index d7f3d80698d..e72ffd9471d 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibrary.qml @@ -75,6 +75,13 @@ Item { root.numColumns = numColumns } + Connections { + target: ContentLibraryBackend.rootView + function onRequestTab(tabIndex) { + tabBar.currIndex = tabIndex + } + } + Column { id: col anchors.fill: parent diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 317b844cca3..3bd8b468407 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -662,6 +663,7 @@ void AssetsLibraryWidget::addResources(const QStringList &files, bool showDialog void AssetsLibraryWidget::addAssetsToContentLibrary(const QStringList &assetPaths) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); m_assetsView->emitCustomNotification("add_assets_to_content_lib", {}, {assetPaths}); } diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 301940e39ff..8537afb1927 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -8,6 +8,7 @@ #include "designeractionmanagerview.h" #include "designericons.h" #include "designermcumanager.h" +#include "designmodewidget.h" #include "formatoperation.h" #include "groupitemaction.h" #include "modelnodecontextmenu_helper.h" @@ -730,6 +731,7 @@ public: (propertyName + "OpenEditorId").toLatin1(), QString(QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Edit the Connection")), [=](const SelectionContext &) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ConnectionView"); signalHandler.view() ->emitCustomNotification(EditConnectionNotification, {signalHandler.parentModelNode()}, @@ -811,6 +813,7 @@ public: (signalStr + "OpenEditorId").toLatin1(), QString(QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Add new Connection")), [=](const SelectionContext &) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ConnectionView"); currentNode.view()->emitCustomNotification(AddConnectionNotification, {currentNode}, {signalStr}); diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index d2b94e47b44..1832ca9fdea 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -801,17 +801,20 @@ void moveToComponent(const SelectionContext &selectionContext) void add3DAssetToContentLibrary(const SelectionContext &selectionContext) { ModelNode node = selectionContext.currentSingleSelectedNode(); + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); selectionContext.view()->emitCustomNotification("add_3d_to_content_lib", {node}); } void importComponent(const SelectionContext &selectionContext) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); selectionContext.view()->emitCustomNotification("import_bundle_to_project"); } void exportComponent(const SelectionContext &selectionContext) { ModelNode node = selectionContext.currentSingleSelectedNode(); + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); selectionContext.view()->emitCustomNotification("export_item_as_bundle", {node}); } @@ -857,7 +860,8 @@ void editMaterial(const SelectionContext &selectionContext) } if (material.isValid()) { - QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor"); + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor", true); // to MaterialBrowser... view->emitCustomNotification("select_material", {material}); @@ -1676,6 +1680,7 @@ void openSignalDialog(const SelectionContext &selectionContext) void updateImported3DAsset(const SelectionContext &selectionContext) { if (selectionContext.view()) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("Components"); selectionContext.view()->emitCustomNotification( "UpdateImported3DAsset", {selectionContext.currentSingleSelectedNode()}); } @@ -2016,6 +2021,7 @@ bool dropAsImage3dTexture(const ModelNode &targetNode, QTimer::singleShot(0, view, [targetNode, imagePath, view]() { if (view && targetNode.isValid()) { // To MaterialBrowserView. Done async to avoid custom notification in transaction + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); view->emitCustomNotification("apply_asset_to_model3D", {targetNode}, {DocumentManager::currentFilePath() @@ -2069,6 +2075,7 @@ void handleTextureDrop(const QMimeData *mimeData, const ModelNode &targetModelNo QTC_ASSERT(texNode.isValid(), return ); if (targetNode.modelNode().metaInfo().isQtQuick3DModel()) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); view->emitCustomNotification("apply_texture_to_model3D", {targetNode, texNode}); } else { auto *dialog = ChooseFromPropertyListDialog::createIfNeeded(targetNode, diff --git a/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp b/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp index 94b7b7e6acd..77a82be6892 100644 --- a/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/viewmanager.cpp @@ -119,10 +119,9 @@ ViewManager::ViewManager(AsynchronousImageCache &imageCache, : d(std::make_unique(imageCache, externalDependencies)) { d->formEditorView.setGotoErrorCallback([this](int line, int column) { + if (Internal::DesignModeWidget *w = QmlDesignerPlugin::instance()->mainWidget()) + w->showDockWidget("TextEditor"); d->textEditorView.gotoCursorPosition(line, column); - if (Internal::DesignModeWidget *designModeWidget = QmlDesignerPlugin::instance() - ->mainWidget()) - designModeWidget->showDockWidget("TextEditor"); }); registerViewActions(); diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp index b0f1108ae19..f39535a43e8 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp @@ -386,13 +386,16 @@ void ContentLibraryView::customNotification(const AbstractView *view, QTC_ASSERT(nodeList.size() == 1 && data.size() == 1, return); addLibItem(nodeList.first(), data.first().value()); + m_widget->showTab(ContentLibraryWidget::TabIndex::UserAssetsTab); } else if (identifier == "add_assets_to_content_lib") { addLibAssets(data.first().toStringList()); + m_widget->showTab(ContentLibraryWidget::TabIndex::UserAssetsTab); } else if (identifier == "add_3d_to_content_lib") { if (nodeList.first().isComponent()) addLib3DComponent(nodeList.first()); else addLibItem(nodeList.first()); + m_widget->showTab(ContentLibraryWidget::TabIndex::UserAssetsTab); } else if (identifier == "export_item_as_bundle") { // TODO: support exporting 2D items if (nodeList.first().isComponent()) diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp index 52672b5c56d..3a7de7001d0 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp @@ -221,6 +221,11 @@ ContentLibraryIconProvider *ContentLibraryWidget::iconProvider() const return m_iconProvider.get(); } +void ContentLibraryWidget::showTab(TabIndex tabIndex) +{ + emit requestTab(int(tabIndex)); +} + void ContentLibraryWidget::updateImportedState(const QString &bundleId) { if (!m_importer) diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h index cec47c8917f..545923316fc 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h @@ -47,6 +47,16 @@ class ContentLibraryWidget : public QFrame Q_PROPERTY(bool isDragging MEMBER m_isDragging NOTIFY isDraggingChanged) public: + + enum class TabIndex { + MaterialsTab, + TexturesTab, + EnvironmentsTab, + EffectsTab, + UserAssetsTab + }; + Q_ENUM(TabIndex) + ContentLibraryWidget(); ~ContentLibraryWidget(); @@ -97,6 +107,8 @@ public: ContentLibraryBundleImporter *importer() const; ContentLibraryIconProvider *iconProvider() const; + void showTab(TabIndex tabIndex); + signals: void bundleItemDragStarted(QmlDesigner::ContentLibraryItem *item); void bundleMaterialDragStarted(QmlDesigner::ContentLibraryMaterial *bundleMat); @@ -111,6 +123,7 @@ signals: void importerRunningChanged(); void hasModelSelectionChanged(); void importBundle(); + void requestTab(int tabIndex); protected: bool eventFilter(QObject *obj, QEvent *event) override; diff --git a/src/plugins/qmldesigner/components/createtexture.cpp b/src/plugins/qmldesigner/components/createtexture.cpp index c6cbe64e5df..0e0882d0a50 100644 --- a/src/plugins/qmldesigner/components/createtexture.cpp +++ b/src/plugins/qmldesigner/components/createtexture.cpp @@ -3,15 +3,17 @@ #include "createtexture.h" -#include "abstractview.h" -#include "asset.h" -#include "documentmanager.h" -#include "modelnode.h" -#include "modelnodeoperations.h" -#include "nodelistproperty.h" -#include "nodemetainfo.h" -#include "qmlobjectnode.h" -#include "variantproperty.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -109,8 +111,10 @@ ModelNode CreateTexture::execute(const QString &filePath, AddTextureMode mode, i assignTextureAsLightProbe(texture, sceneId); QTimer::singleShot(0, m_view, [this, texture]() { - if (m_view->model()) + if (m_view->model()) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); m_view->emitCustomNotification("select_texture", {texture}, {true}); + } }); return texture; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dmaterialsaction.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dmaterialsaction.cpp index 970791b2db6..143282c77f7 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dmaterialsaction.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dmaterialsaction.cpp @@ -180,6 +180,7 @@ QAction *Edit3DMaterialsAction::createMaterialAction(const ModelNode &material, QAction *editMaterialAction = new QAction(tr("Edit"), menu); connect(editMaterialAction, &QAction::triggered, menu, [material] { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor", true); if (auto materialView = material.view()) materialView->emitCustomNotification("select_material", {material}); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index ef6620ba54d..b971d828c50 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -6,29 +6,30 @@ #include "backgroundcolorselection.h" #include "bakelights.h" #include "cameraspeedconfiguration.h" -#include "designeractionmanager.h" -#include "designericons.h" -#include "designersettings.h" -#include "designmodecontext.h" #include "edit3dcanvas.h" #include "edit3dviewconfig.h" #include "edit3dwidget.h" -#include "materialutils.h" -#include "metainfo.h" -#include "nodeabstractproperty.h" -#include "nodehints.h" -#include "nodeinstanceview.h" -#include "qmldesignerconstants.h" -#include "qmldesignerplugin.h" -#include "qmlitemnode.h" -#include "qmlvisualnode.h" -#include "seekerslider.h" #include "snapconfiguration.h" -#include "variantproperty.h" #include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include #include @@ -435,9 +436,7 @@ void Edit3DView::customNotification([[maybe_unused]] const AbstractView *view, [[maybe_unused]] const QList &nodeList, [[maybe_unused]] const QList &data) { - if (identifier == "asset_import_update") { - resetPuppet(); - } else if (identifier == "pick_3d_node_from_2d_scene" && data.size() == 1 && nodeList.size() == 1) { + if (identifier == "pick_3d_node_from_2d_scene" && data.size() == 1 && nodeList.size() == 1) { // Pick via 2D view, data has pick coordinates in main scene coordinates QTimer::singleShot(0, this, [=, self = QPointer{this}]() { if (!self) @@ -491,11 +490,14 @@ void Edit3DView::nodeAtPosReady(const ModelNode &modelNode, const QVector3D &pos } else if (m_nodeAtPosReqType == NodeAtPosReqType::BundleEffectDrop) { emitCustomNotification("drop_bundle_item", {modelNode}, {pos3d}); // To ContentLibraryView } else if (m_nodeAtPosReqType == NodeAtPosReqType::TextureDrop) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); emitCustomNotification("apply_texture_to_model3D", {modelNode, m_droppedModelNode}); } else if (m_nodeAtPosReqType == NodeAtPosReqType::AssetDrop) { bool isModel = modelNode.metaInfo().isQtQuick3DModel(); - if (!m_droppedFile.isEmpty() && isModel) + if (!m_droppedFile.isEmpty() && isModel) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); emitCustomNotification("apply_asset_to_model3D", {modelNode}, {m_droppedFile}); // To MaterialBrowserView + } } else if (m_nodeAtPosReqType == NodeAtPosReqType::MainScenePick) { if (modelNode.isValid()) setSelectedModelNode(modelNode); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index ad9b8d6b125..c4a8de2a962 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -363,18 +364,21 @@ void Edit3DWidget::createContextMenu() m_addToContentLibAction = m_contextMenu->addAction( contextIcon(DesignerIcons::CreateIcon), // TODO: placeholder icon tr("Add to Content Library"), [&] { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); view()->emitCustomNotification("add_3d_to_content_lib", {m_contextMenuTarget}); // To ContentLibrary }); m_importBundleAction = m_contextMenu->addAction( contextIcon(DesignerIcons::CreateIcon), // TODO: placeholder icon tr("Import Component"), [&] { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); view()->emitCustomNotification("import_bundle_to_project"); // To ContentLibrary }); m_exportBundleAction = m_contextMenu->addAction( contextIcon(DesignerIcons::CreateIcon), // TODO: placeholder icon tr("Export Component"), [&] { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); view()->emitCustomNotification("export_item_as_bundle", {m_contextMenuTarget}); // To ContentLibrary }); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index 5c14c46d183..44d451b94e7 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -747,6 +747,7 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport() } else if (counter >= 50) { for (const ParseData &pd : std::as_const(m_parseData)) { if (!pd.overwrittenImports.isEmpty()) { + model->rewriterView()->resetPuppet(); model->rewriterView()->emitCustomNotification("asset_import_update"); break; } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index fa3a385fb12..4f62a2c8026 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -3,19 +3,22 @@ #include "materialbrowserview.h" -#include "bindingproperty.h" -#include "createtexture.h" -#include "designmodecontext.h" -#include "externaldependenciesinterface.h" #include "materialbrowsermodel.h" #include "materialbrowsertexturesmodel.h" #include "materialbrowserwidget.h" -#include "nodeabstractproperty.h" -#include "nodeinstanceview.h" -#include "nodemetainfo.h" -#include "qmldesignerconstants.h" -#include "qmlobjectnode.h" -#include "variantproperty.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -75,20 +78,24 @@ WidgetInfo MaterialBrowserView::widgetInfo() connect(matBrowserModel, &MaterialBrowserModel::applyToSelectedTriggered, this, [&] (const ModelNode &material, bool add) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor"); emitCustomNotification("apply_to_selected_triggered", {material}, {add}); }); connect(matBrowserModel, &MaterialBrowserModel::renameMaterialTriggered, this, [&] (const ModelNode &material, const QString &newName) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor"); emitCustomNotification("rename_material", {material}, {newName}); }); connect(matBrowserModel, &MaterialBrowserModel::addNewMaterialTriggered, this, [&] { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor"); emitCustomNotification("add_new_material"); }); connect(matBrowserModel, &MaterialBrowserModel::duplicateMaterialTriggered, this, [&] (const ModelNode &material) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor"); emitCustomNotification("duplicate_material", {material}); }); @@ -170,6 +177,7 @@ WidgetInfo MaterialBrowserView::widgetInfo() }); connect(texturesModel, &MaterialBrowserTexturesModel::duplicateTextureTriggered, this, [&] (const ModelNode &texture) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("TextureEditor"); emitCustomNotification("duplicate_texture", {texture}); }); @@ -189,6 +197,7 @@ WidgetInfo MaterialBrowserView::widgetInfo() }); connect(texturesModel, &MaterialBrowserTexturesModel::addNewTextureTriggered, this, [&] { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("TextureEditor"); emitCustomNotification("add_new_texture"); }); @@ -235,6 +244,7 @@ void MaterialBrowserView::modelAttached(Model *model) { AbstractView::modelAttached(model); + m_pendingTextureSelection = {}; m_widget->clearSearchFilter(); m_widget->materialBrowserModel()->setHasMaterialLibrary(false); m_hasQuick3DImport = model->hasImport("QtQuick3D"); @@ -245,6 +255,10 @@ void MaterialBrowserView::modelAttached(Model *model) QTimer::singleShot(1000, model, [this] { refreshModel(true); loadPropertyGroups(); // Needs the delay because it uses metaInfo + + if (m_pendingTextureSelection.isValid()) + emitCustomNotification("select_texture", {m_pendingTextureSelection}, {true}); + m_pendingTextureSelection = {}; }); m_sceneId = Utils3D::active3DSceneId(model); @@ -559,6 +573,8 @@ void MaterialBrowserView::customNotification(const AbstractView *view, m_widget->materialBrowserTexturesModel()->refreshSearch(); if (!data.isEmpty() && data[0].toBool()) m_widget->focusMaterialSection(false); + } else { + m_pendingTextureSelection = nodeList.first(); } } else if (identifier == "refresh_material_browser") { QTimer::singleShot(0, model(), [this] { @@ -571,8 +587,6 @@ void MaterialBrowserView::customNotification(const AbstractView *view, applyTextureToModel3D(nodeList.at(0)); } else if (identifier == "apply_texture_to_model3D") { applyTextureToModel3D(nodeList.at(0), nodeList.at(1)); - } else if (identifier == "apply_texture_to_material") { - applyTextureToMaterial({nodeList.at(0)}, nodeList.at(1)); } else if (identifier == "focus_material_section") { m_widget->focusMaterialSection(true); } diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h index b6470ee1617..a2582fe0ac7 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h @@ -101,6 +101,7 @@ private: QString m_appliedTextureId; QString m_appliedTexturePath; // defers texture creation until dialog apply int m_sceneId = -1; + ModelNode m_pendingTextureSelection; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index dd442e3ccc2..f9f5636a295 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -3,23 +3,24 @@ #include "materialbrowserwidget.h" -#include "asset.h" -#include "assetimageprovider.h" -#include "createtexture.h" -#include "documentmanager.h" -#include "hdrimage.h" #include "materialbrowsermodel.h" #include "materialbrowsertexturesmodel.h" #include "materialbrowserview.h" -#include "qmldesignerconstants.h" -#include "qmldesignerplugin.h" -#include "theme.h" -#include "variantproperty.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include - #include #include #include @@ -371,6 +372,7 @@ void MaterialBrowserWidget::focusMaterialSection(bool focusMatSec) void MaterialBrowserWidget::addMaterialToContentLibrary() { ModelNode mat = m_materialBrowserModel->selectedMaterial(); + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); m_materialBrowserView->emitCustomNotification("add_material_to_content_lib", {mat}, {m_previewImageProvider->getPixmap(mat)}); // to ContentLibrary } @@ -378,11 +380,13 @@ void MaterialBrowserWidget::addMaterialToContentLibrary() void MaterialBrowserWidget::importMaterial() { ModelNode mat = m_materialBrowserModel->selectedMaterial(); + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); m_materialBrowserView->emitCustomNotification("import_bundle_to_project"); // to ContentLibrary } void MaterialBrowserWidget::exportMaterial() { ModelNode mat = m_materialBrowserModel->selectedMaterial(); + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("ContentLibrary"); m_materialBrowserView->emitCustomNotification("export_material_as_bundle", {mat}, {m_previewImageProvider->getPixmap(mat)}); // to ContentLibrary } diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index d3df9bdece1..e05acb7646d 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -715,6 +715,8 @@ void MaterialEditorView::modelAttached(Model *model) } resetView(); + selectedNodesChanged(selectedModelNodes(), {}); + m_locked = false; } @@ -1056,17 +1058,22 @@ void MaterialEditorView::customNotification([[maybe_unused]] const AbstractView const QList &nodeList, const QList &data) { - if (identifier == "selected_material_changed") { - if (!m_hasMaterialRoot) { + auto changeSelected = [&]() { + if (!m_hasMaterialRoot && m_selectedMaterial != nodeList.first()) { m_selectedMaterial = nodeList.first(); m_dynamicPropertiesModel->setSelectedNode(m_selectedMaterial); QTimer::singleShot(0, this, &MaterialEditorView::resetView); } + }; + + if (identifier == "selected_material_changed") { + changeSelected(); } else if (identifier == "apply_to_selected_triggered") { + changeSelected(); applyMaterialToSelectedModels(nodeList.first(), data.first().toBool()); } else if (identifier == "rename_material") { - if (m_selectedMaterial == nodeList.first()) - renameMaterial(m_selectedMaterial, data.first().toString()); + changeSelected(); + renameMaterial(m_selectedMaterial, data.first().toString()); } else if (identifier == "add_new_material") { handleToolBarAction(MaterialEditorContextObject::AddNewMaterial); } else if (identifier == "duplicate_material") { diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 9ed9f24e42d..658ba0c50a2 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -565,8 +566,10 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *mimeData, ModelNodeOperations::handleMaterialDrop(mimeData, targetNode); } else if (mimeData->hasFormat(Constants::MIME_TYPE_BUNDLE_TEXTURE)) { QByteArray filePath = mimeData->data(Constants::MIME_TYPE_BUNDLE_TEXTURE); - if (targetNode.metaInfo().isQtQuick3DModel()) + if (targetNode.metaInfo().isQtQuick3DModel()) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); m_view->emitCustomNotification("apply_asset_to_model3D", {targetNode}, {filePath}); // To MaterialBrowserView + } } else if (mimeData->hasFormat(Constants::MIME_TYPE_BUNDLE_MATERIAL)) { if (targetNode.isValid()) m_view->emitCustomNotification("drop_bundle_material", {targetNode}); // To ContentLibraryView diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index 252f8c2a9ff..3c2fa6a32e9 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -535,6 +535,7 @@ void PropertyEditorValue::commitDrop(const QString &dropData) void PropertyEditorValue::openMaterialEditor(int idx) { + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialEditor", true); m_modelNode.view()->emitCustomNotification("select_material", {}, {idx}); } diff --git a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp index eae0a7ff56c..c3e84a5fea8 100644 --- a/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp +++ b/src/plugins/qmldesigner/components/textureeditor/textureeditorview.cpp @@ -364,6 +364,7 @@ void TextureEditorView::applyTextureToSelectedModel(const ModelNode &texture) QTC_ASSERT(texture.isValid(), return); + QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("MaterialBrowser"); emitCustomNotification("apply_texture_to_model3D", {m_selectedModel, m_selectedTexture}); } @@ -837,8 +838,6 @@ void TextureEditorView::customNotification([[maybe_unused]] const AbstractView * m_dynamicPropertiesModel->setSelectedNode(m_selectedTexture); QTimer::singleShot(0, this, &TextureEditorView::resetView); } - } else if (identifier == "apply_texture_to_selected_model") { - applyTextureToSelectedModel(nodeList.first()); } else if (identifier == "add_new_texture") { handleToolBarAction(TextureEditorContextObject::AddNewTexture); } else if (identifier == "duplicate_texture") { diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 46e67116634..fdc61916ce8 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -77,9 +77,6 @@ public: void nodeOrderChanged(const NodeListProperty &listProperty) override; void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) override; void nodeTypeChanged(const ModelNode& node, const TypeName &type, int majorVersion, int minorVersion) override; - void customNotification(const AbstractView *view, const QString &identifier, - const QList &nodeList, - const QList &data) override; void rewriterBeginTransaction() override; void rewriterEndTransaction() override; diff --git a/src/plugins/qmldesigner/designercore/rewriter/rewriterview.cpp b/src/plugins/qmldesigner/designercore/rewriter/rewriterview.cpp index 6565208385c..48d8e9fb15f 100644 --- a/src/plugins/qmldesigner/designercore/rewriter/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/rewriter/rewriterview.cpp @@ -385,15 +385,6 @@ void RewriterView::nodeTypeChanged(const ModelNode &node, applyChanges(); } -void RewriterView::customNotification(const AbstractView * /*view*/, - const QString &identifier, - const QList & /* nodeList */, - const QList & /*data */) -{ - if (identifier == StartRewriterAmend || identifier == EndRewriterAmend) - return; // we emitted this ourselves, so just ignore these notifications. -} - void RewriterView::rewriterBeginTransaction() { transactionLevel++;