forked from qt-creator/qt-creator
QmlDesigner: Fix custom notifications to hidden views
Hidden views are detached, so custom notifications to those views don't get handled, which in many cases leads to desired outcome not happening. Fixing most cases by simply forcing the handling view visible before emitting custom notification. Fixes: QDS-13349 Change-Id: I65842ac429bcdb1caa4b1f60d4f4fdb4a48f8742 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
@@ -75,6 +75,13 @@ Item {
|
||||
root.numColumns = numColumns
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: ContentLibraryBackend.rootView
|
||||
function onRequestTab(tabIndex) {
|
||||
tabBar.currIndex = tabIndex
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
id: col
|
||||
anchors.fill: parent
|
||||
|
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <designeractionmanager.h>
|
||||
#include <designerpaths.h>
|
||||
#include <designmodewidget.h>
|
||||
#include <hdrimage.h>
|
||||
#include <import.h>
|
||||
#include <modelnodeoperations.h>
|
||||
@@ -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});
|
||||
}
|
||||
|
||||
|
@@ -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});
|
||||
|
@@ -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,
|
||||
|
@@ -119,10 +119,9 @@ ViewManager::ViewManager(AsynchronousImageCache &imageCache,
|
||||
: d(std::make_unique<ViewManagerData>(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();
|
||||
|
@@ -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<QPixmap>());
|
||||
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())
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -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 <abstractview.h>
|
||||
#include <asset.h>
|
||||
#include <designmodewidget.h>
|
||||
#include <documentmanager.h>
|
||||
#include <modelnode.h>
|
||||
#include <modelnodeoperations.h>
|
||||
#include <nodelistproperty.h>
|
||||
#include <nodemetainfo.h>
|
||||
#include <qmldesignerplugin.h>
|
||||
#include <qmlobjectnode.h>
|
||||
#include <variantproperty.h>
|
||||
#include <utils3d.h>
|
||||
|
||||
#include <coreplugin/messagebox.h>
|
||||
@@ -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;
|
||||
|
@@ -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});
|
||||
|
@@ -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 <auxiliarydataproperties.h>
|
||||
#include <designeractionmanager.h>
|
||||
#include <designericons.h>
|
||||
#include <designersettings.h>
|
||||
#include <designmodecontext.h>
|
||||
#include <designmodewidget.h>
|
||||
#include <materialutils.h>
|
||||
#include <metainfo.h>
|
||||
#include <modelutils.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 <utils3d.h>
|
||||
#include <variantproperty.h>
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/messagebox.h>
|
||||
@@ -435,9 +436,7 @@ void Edit3DView::customNotification([[maybe_unused]] const AbstractView *view,
|
||||
[[maybe_unused]] const QList<ModelNode> &nodeList,
|
||||
[[maybe_unused]] const QList<QVariant> &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);
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#include <designdocument.h>
|
||||
#include <designericons.h>
|
||||
#include <designermcumanager.h>
|
||||
#include <designmodewidget.h>
|
||||
#include <externaldependenciesinterface.h>
|
||||
#include <generatedcomponentutils.h>
|
||||
#include <import.h>
|
||||
@@ -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
|
||||
});
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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 <bindingproperty.h>
|
||||
#include <createtexture.h>
|
||||
#include <designmodecontext.h>
|
||||
#include <designmodewidget.h>
|
||||
#include <externaldependenciesinterface.h>
|
||||
#include <nodeabstractproperty.h>
|
||||
#include <nodeinstanceview.h>
|
||||
#include <nodemetainfo.h>
|
||||
#include <qmldesignerconstants.h>
|
||||
#include <qmldesignerplugin.h>
|
||||
#include <qmlobjectnode.h>
|
||||
#include <variantproperty.h>
|
||||
#include <utils3d.h>
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
@@ -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);
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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 <asset.h>
|
||||
#include <assetimageprovider.h>
|
||||
#include <createtexture.h>
|
||||
#include <designmodewidget.h>
|
||||
#include <documentmanager.h>
|
||||
#include <hdrimage.h>
|
||||
#include <qmldesignerconstants.h>
|
||||
#include <qmldesignerplugin.h>
|
||||
#include <studioquickwidget.h>
|
||||
#include <theme.h>
|
||||
#include <variantproperty.h>
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
|
||||
#include <studioquickwidget.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/environment.h>
|
||||
#include <utils/qtcassert.h>
|
||||
@@ -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
|
||||
}
|
||||
|
@@ -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<ModelNode> &nodeList,
|
||||
const QList<QVariant> &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") {
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#include <coreplugin/icore.h>
|
||||
#include <designeractionmanager.h>
|
||||
#include <designersettings.h>
|
||||
#include <designmodewidget.h>
|
||||
#include <import.h>
|
||||
#include <invalididexception.h>
|
||||
#include <itemlibraryentry.h>
|
||||
@@ -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
|
||||
|
@@ -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});
|
||||
}
|
||||
|
@@ -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") {
|
||||
|
@@ -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<ModelNode> &nodeList,
|
||||
const QList<QVariant> &data) override;
|
||||
|
||||
void rewriterBeginTransaction() override;
|
||||
void rewriterEndTransaction() override;
|
||||
|
@@ -385,15 +385,6 @@ void RewriterView::nodeTypeChanged(const ModelNode &node,
|
||||
applyChanges();
|
||||
}
|
||||
|
||||
void RewriterView::customNotification(const AbstractView * /*view*/,
|
||||
const QString &identifier,
|
||||
const QList<ModelNode> & /* nodeList */,
|
||||
const QList<QVariant> & /*data */)
|
||||
{
|
||||
if (identifier == StartRewriterAmend || identifier == EndRewriterAmend)
|
||||
return; // we emitted this ourselves, so just ignore these notifications.
|
||||
}
|
||||
|
||||
void RewriterView::rewriterBeginTransaction()
|
||||
{
|
||||
transactionLevel++;
|
||||
|
Reference in New Issue
Block a user