From ed89cc730dd26009c1c0a2d609abc995c32cc585 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 8 Sep 2022 17:10:34 +0300 Subject: [PATCH] QmlDesigner: Fix material preview env and model aux handling Converted old auxiliary properties usage in material preview to the new API. Since most properties need to be both persisted to the document and used by puppet, those properties had to be duplicated. Fixes: QTCREATORBUG-28085 Fixes: QDS-7624 Change-Id: Idf51c773a2d49d44413bfaf69d4a683692ea8a0d Reviewed-by: Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../qt5informationnodeinstanceserver.cpp | 1 - .../materialeditor/materialeditorview.cpp | 158 ++++++++++-------- .../include/auxiliarydataproperties.h | 17 ++ 3 files changed, 101 insertions(+), 75 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index da906b62c6d..1ac414185d3 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -324,7 +324,6 @@ void Qt5InformationNodeInstanceServer::resolveImportSupport() void Qt5InformationNodeInstanceServer::updateMaterialPreviewData( const QVector &valueChanges) { - const PropertyName matPrevPrefix("matPrev"); for (const auto &container : valueChanges) { if (container.instanceId() == 0) { if (container.name() == "matPrevEnv") diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index f16f20f88c0..7191e040dc1 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -9,6 +9,7 @@ #include "materialeditortransaction.h" #include "assetslibrarywidget.h" +#include #include #include #include @@ -433,79 +434,81 @@ void MaterialEditorView::handleToolBarAction(int action) void MaterialEditorView::handlePreviewEnvChanged(const QString &envAndValue) { Q_UNUSED(envAndValue); - // if (envAndValue.isEmpty() || m_initializingPreviewData) - // return; + if (envAndValue.isEmpty() || m_initializingPreviewData) + return; - // QTC_ASSERT(m_hasQuick3DImport, return); - // QTC_ASSERT(model(), return); - // QTC_ASSERT(model()->nodeInstanceView(), return); + QTC_ASSERT(m_hasQuick3DImport, return); + QTC_ASSERT(model(), return); + QTC_ASSERT(model()->nodeInstanceView(), return); - // QStringList parts = envAndValue.split('='); - // QString env = parts[0]; - // QString value; - // if (parts.size() > 1) - // value = parts[1]; + QStringList parts = envAndValue.split('='); + QString env = parts[0]; + QString value; + if (parts.size() > 1) + value = parts[1]; - // PropertyName matPrevEnvAuxProp("matPrevEnv"); - // PropertyName matPrevEnvValueAuxProp("matPrevEnvValue"); + auto renderPreviews = [=](const QString &auxEnv, const QString &auxValue) { + rootModelNode().setAuxiliaryData(materialPreviewEnvDocProperty, auxEnv); + rootModelNode().setAuxiliaryData(materialPreviewEnvProperty, auxEnv); + rootModelNode().setAuxiliaryData(materialPreviewEnvValueDocProperty, auxValue); + rootModelNode().setAuxiliaryData(materialPreviewEnvValueProperty, auxValue); + QTimer::singleShot(0, this, &MaterialEditorView::requestPreviewRender); + emitCustomNotification("refresh_material_browser", {}); + }; - // auto renderPreviews = [=](const QString &auxEnv, const QString &auxValue) { - // rootModelNode().setAuxiliaryData(matPrevEnvAuxProp, auxEnv); - // rootModelNode().setAuxiliaryData(matPrevEnvValueAuxProp, auxValue); - // QTimer::singleShot(0, this, &MaterialEditorView::requestPreviewRender); - // emitCustomNotification("refresh_material_browser", {}); - // }; + if (env == "Color") { + m_colorDialog.clear(); - // if (env == "Color") { - // m_colorDialog.clear(); + // Store color to separate property to persist selection over non-color env changes + auto oldColorPropVal = rootModelNode().auxiliaryData(materialPreviewColorDocProperty); + auto oldEnvPropVal = rootModelNode().auxiliaryData(materialPreviewEnvDocProperty); + auto oldValuePropVal = rootModelNode().auxiliaryData(materialPreviewEnvValueDocProperty); + QString oldColor = oldColorPropVal ? oldColorPropVal->toString() : ""; + QString oldEnv = oldEnvPropVal ? oldEnvPropVal->toString() : ""; + QString oldValue = oldValuePropVal ? oldValuePropVal->toString() : ""; - // // Store color to separate property to persist selection over non-color env changes - // PropertyName colorAuxProp("matPrevColor"); - // QString oldColor = rootModelNode().auxiliaryData(colorAuxProp).toString(); - // QString oldEnv = rootModelNode().auxiliaryData(matPrevEnvAuxProp).toString(); - // QString oldValue = rootModelNode().auxiliaryData(matPrevEnvValueAuxProp).toString(); + m_colorDialog = new QColorDialog(Core::ICore::dialogParent()); + m_colorDialog->setModal(true); + m_colorDialog->setAttribute(Qt::WA_DeleteOnClose); + m_colorDialog->setCurrentColor(QColor(oldColor)); + m_colorDialog->show(); - // m_colorDialog = new QColorDialog(Core::ICore::dialogParent()); - // m_colorDialog->setModal(true); - // m_colorDialog->setAttribute(Qt::WA_DeleteOnClose); - // m_colorDialog->setCurrentColor(QColor(oldColor)); - // m_colorDialog->show(); + QObject::connect(m_colorDialog, &QColorDialog::currentColorChanged, + m_colorDialog, [=](const QColor &color) { + renderPreviews(env, color.name()); + }); - // QObject::connect(m_colorDialog, &QColorDialog::currentColorChanged, - // m_colorDialog, [=](const QColor &color) { - // renderPreviews(env, color.name()); - // }); + QObject::connect(m_colorDialog, &QColorDialog::colorSelected, + m_colorDialog, [=](const QColor &color) { + renderPreviews(env, color.name()); + rootModelNode().setAuxiliaryData(materialPreviewColorDocProperty, color.name()); + }); - // QObject::connect(m_colorDialog, &QColorDialog::colorSelected, - // m_colorDialog, [=](const QColor &color) { - // renderPreviews(env, color.name()); - // rootModelNode().setAuxiliaryData(colorAuxProp, color.name()); - // }); - - // QObject::connect(m_colorDialog, &QColorDialog::rejected, - // m_colorDialog, [=]() { - // renderPreviews(oldEnv, oldValue); - // initPreviewData(); - // }); - // return; - // } - // renderPreviews(env, value); + QObject::connect(m_colorDialog, &QColorDialog::rejected, + m_colorDialog, [=]() { + renderPreviews(oldEnv, oldValue); + initPreviewData(); + }); + return; + } + renderPreviews(env, value); } void MaterialEditorView::handlePreviewModelChanged(const QString &modelStr) { Q_UNUSED(modelStr); - // if (modelStr.isEmpty() || m_initializingPreviewData) - // return; + if (modelStr.isEmpty() || m_initializingPreviewData) + return; - // QTC_ASSERT(m_hasQuick3DImport, return); - // QTC_ASSERT(model(), return); - // QTC_ASSERT(model()->nodeInstanceView(), return); + QTC_ASSERT(m_hasQuick3DImport, return); + QTC_ASSERT(model(), return); + QTC_ASSERT(model()->nodeInstanceView(), return); - // rootModelNode().setAuxiliaryData("matPrevModel", modelStr); + rootModelNode().setAuxiliaryData(materialPreviewModelDocProperty, modelStr); + rootModelNode().setAuxiliaryData(materialPreviewModelProperty, modelStr); - // QTimer::singleShot(0, this, &MaterialEditorView::requestPreviewRender); - // emitCustomNotification("refresh_material_browser", {}); + QTimer::singleShot(0, this, &MaterialEditorView::requestPreviewRender); + emitCustomNotification("refresh_material_browser", {}); } void MaterialEditorView::setupQmlBackend() @@ -623,24 +626,31 @@ bool MaterialEditorView::noValidSelection() const void MaterialEditorView::initPreviewData() { - // if (model() && m_qmlBackEnd) { - // QString env = rootModelNode().auxiliaryData("matPrevEnv").toString(); - // QString envValue = rootModelNode().auxiliaryData("matPrevEnvValue").toString(); - // QString modelStr = rootModelNode().auxiliaryData("matPrevModel").toString(); - // if (!envValue.isEmpty() && env != "Color" && env != "Basic") { - // env += '='; - // env += envValue; - // } - // if (env.isEmpty()) - // env = "SkyBox=preview_studio"; - // if (modelStr.isEmpty()) - // modelStr = "#Sphere"; - // m_initializingPreviewData = true; - // QMetaObject::invokeMethod(m_qmlBackEnd->widget()->rootObject(), - // "initPreviewData", - // Q_ARG(QVariant, env), Q_ARG(QVariant, modelStr)); - // m_initializingPreviewData = false; - // } + if (model() && m_qmlBackEnd) { + auto envPropVal = rootModelNode().auxiliaryData(materialPreviewEnvDocProperty); + auto envValuePropVal = rootModelNode().auxiliaryData(materialPreviewEnvValueDocProperty); + auto modelStrPropVal = rootModelNode().auxiliaryData(materialPreviewModelDocProperty); + QString env = envPropVal ? envPropVal->toString() : ""; + QString envValue = envValuePropVal ? envValuePropVal->toString() : ""; + QString modelStr = modelStrPropVal ? modelStrPropVal->toString() : ""; + // Initialize corresponding instance aux values used by puppet + rootModelNode().setAuxiliaryData(materialPreviewEnvProperty, env); + rootModelNode().setAuxiliaryData(materialPreviewEnvValueProperty, envValue); + rootModelNode().setAuxiliaryData(materialPreviewModelProperty, modelStr); + if (!envValue.isEmpty() && env != "Color" && env != "Basic") { + env += '='; + env += envValue; + } + if (env.isEmpty()) + env = "SkyBox=preview_studio"; + if (modelStr.isEmpty()) + modelStr = "#Sphere"; + m_initializingPreviewData = true; + QMetaObject::invokeMethod(m_qmlBackEnd->widget()->rootObject(), + "initPreviewData", + Q_ARG(QVariant, env), Q_ARG(QVariant, modelStr)); + m_initializingPreviewData = false; + } } void MaterialEditorView::delayedTypeUpdate() diff --git a/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h b/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h index f714e21c992..7008858d066 100644 --- a/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h +++ b/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h @@ -123,6 +123,23 @@ inline constexpr AuxiliaryDataKeyView rotBlockProperty{AuxiliaryDataType::NodeIn "rotBlock"}; inline constexpr AuxiliaryDataKeyView languageProperty{AuxiliaryDataType::Temporary, "language"}; +// Most material preview aux properties are duplicated as document and instance types, as they +// are both required to be persistent and used at runtime to control material preview rendering +inline constexpr AuxiliaryDataKeyView materialPreviewEnvDocProperty{ + AuxiliaryDataType::Document, "matPrevEnvDoc"}; +inline constexpr AuxiliaryDataKeyView materialPreviewEnvValueDocProperty{ + AuxiliaryDataType::Document, "matPrevEnvValueDoc"}; +inline constexpr AuxiliaryDataKeyView materialPreviewModelDocProperty{ + AuxiliaryDataType::Document, "matPrevModelDoc"}; +inline constexpr AuxiliaryDataKeyView materialPreviewColorDocProperty{ + AuxiliaryDataType::Document, "matPrevColorDoc"}; // Only needed on doc side +inline constexpr AuxiliaryDataKeyView materialPreviewEnvProperty{ + AuxiliaryDataType::NodeInstanceAuxiliary, "matPrevEnv"}; +inline constexpr AuxiliaryDataKeyView materialPreviewEnvValueProperty{ + AuxiliaryDataType::NodeInstanceAuxiliary, "matPrevEnvValue"}; +inline constexpr AuxiliaryDataKeyView materialPreviewModelProperty{ + AuxiliaryDataType::NodeInstanceAuxiliary, "matPrevModel"}; + template QVariant getDefaultValueAsQVariant(const Type &key) {