QmlDesigner: Allow dropping hdr/ktx assets to material editor

Also some tweaks in the same class and fixing few warnings.

Fixes: QDS-9430
Change-Id: Ife19fb5f9ad67292882c339f1aa3255e91461cd1
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2023-03-15 14:26:20 +02:00
parent 5631c81a98
commit 05a1a81092
2 changed files with 48 additions and 60 deletions

View File

@@ -3,49 +3,39 @@
#include "materialeditorview.h" #include "materialeditorview.h"
#include "asset.h"
#include "bindingproperty.h"
#include "auxiliarydataproperties.h"
#include "designdocument.h"
#include "designmodewidget.h"
#include "dynamicpropertiesmodel.h"
#include "itemlibraryinfo.h"
#include "materialeditorqmlbackend.h" #include "materialeditorqmlbackend.h"
#include "materialeditorcontextobject.h" #include "materialeditorcontextobject.h"
#include "materialeditordynamicpropertiesproxymodel.h" #include "materialeditordynamicpropertiesproxymodel.h"
#include "propertyeditorvalue.h"
#include "materialeditortransaction.h" #include "materialeditortransaction.h"
#include "assetslibrarywidget.h" #include "metainfo.h"
#include "nodeinstanceview.h"
#include <auxiliarydataproperties.h> #include "nodelistproperty.h"
#include <bindingproperty.h> #include "nodemetainfo.h"
#include <designdocument.h> #include "propertyeditorqmlbackend.h"
#include <dynamicpropertiesmodel.h> #include "propertyeditorvalue.h"
#include <metainfo.h> #include "qmldesignerconstants.h"
#include <nodeinstanceview.h> #include "qmldesignerplugin.h"
#include <nodelistproperty.h> #include "qmltimeline.h"
#include <nodemetainfo.h> #include "variantproperty.h"
#include <nodeproperty.h>
#include <rewritingexception.h>
#include <variantproperty.h>
#include <qmldesignerconstants.h>
#include <qmldesignerplugin.h>
#include <qmltimeline.h>
#include <theme.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/messagebox.h> #include <coreplugin/messagebox.h>
#include <designmodewidget.h>
#include <propertyeditorqmlbackend.h>
#include <utils/environment.h>
#include <utils/fileutils.h>
#include <utils/qtcassert.h>
#include <qmldesignerplugin.h>
#include <QApplication> #include <utils/environment.h>
#include <QDebug> #include <utils/qtcassert.h>
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include <QQuickWidget>
#include <QQuickItem> #include <QQuickItem>
#include <QScopedPointer>
#include <QStackedWidget> #include <QStackedWidget>
#include <QShortcut> #include <QShortcut>
#include <QTimer>
#include <QColorDialog> #include <QColorDialog>
namespace QmlDesigner { namespace QmlDesigner {
@@ -74,8 +64,6 @@ MaterialEditorView::MaterialEditorView(ExternalDependenciesInterface &externalDe
m_typeUpdateTimer.setInterval(500); m_typeUpdateTimer.setInterval(500);
connect(&m_typeUpdateTimer, &QTimer::timeout, this, &MaterialEditorView::updatePossibleTypes); connect(&m_typeUpdateTimer, &QTimer::timeout, this, &MaterialEditorView::updatePossibleTypes);
m_stackedWidget->setStyleSheet(Theme::replaceCssColors(
QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css"))));
m_stackedWidget->setMinimumWidth(250); m_stackedWidget->setMinimumWidth(250);
QmlDesignerPlugin::trackWidgetFocusTime(m_stackedWidget, Constants::EVENT_MATERIALEDITOR_TIME); QmlDesignerPlugin::trackWidgetFocusTime(m_stackedWidget, Constants::EVENT_MATERIALEDITOR_TIME);
@@ -183,7 +171,7 @@ void MaterialEditorView::changeExpression(const QString &propertyName)
if (name.isNull() || locked() || noValidSelection()) if (name.isNull() || locked() || noValidSelection())
return; return;
executeInTransaction("MaterialEditorView::changeExpression", [this, name] { executeInTransaction(__FUNCTION__, [this, name] {
PropertyName underscoreName(name); PropertyName underscoreName(name);
underscoreName.replace('.', '_'); underscoreName.replace('.', '_');
@@ -257,7 +245,7 @@ void MaterialEditorView::exportPropertyAsAlias(const QString &name)
if (name.isNull() || locked() || noValidSelection()) if (name.isNull() || locked() || noValidSelection())
return; return;
executeInTransaction("MaterialEditorView::exportPopertyAsAlias", [this, name] { executeInTransaction(__FUNCTION__, [this, name] {
const QString id = m_selectedMaterial.validId(); const QString id = m_selectedMaterial.validId();
QString upperCasePropertyName = name; QString upperCasePropertyName = name;
upperCasePropertyName.replace(0, 1, upperCasePropertyName.at(0).toUpper()); upperCasePropertyName.replace(0, 1, upperCasePropertyName.at(0).toUpper());
@@ -279,7 +267,7 @@ void MaterialEditorView::removeAliasExport(const QString &name)
if (name.isNull() || locked() || noValidSelection()) if (name.isNull() || locked() || noValidSelection())
return; return;
executeInTransaction("MaterialEditorView::removeAliasExport", [this, name] { executeInTransaction(__FUNCTION__, [this, name] {
const QString id = m_selectedMaterial.validId(); const QString id = m_selectedMaterial.validId();
const QList<BindingProperty> bindingProps = rootModelNode().bindingProperties(); const QList<BindingProperty> bindingProps = rootModelNode().bindingProperties();
@@ -392,7 +380,7 @@ void MaterialEditorView::applyMaterialToSelectedModels(const ModelNode &material
return QString(); return QString();
}; };
executeInTransaction("MaterialEditorView::applyMaterialToSelectedModels", [&] { executeInTransaction(__FUNCTION__, [&] {
for (const ModelNode &node : std::as_const(m_selectedModels)) { for (const ModelNode &node : std::as_const(m_selectedModels)) {
QmlObjectNode qmlObjNode(node); QmlObjectNode qmlObjNode(node);
if (add) { if (add) {
@@ -425,7 +413,7 @@ void MaterialEditorView::handleToolBarAction(int action)
case MaterialEditorContextObject::AddNewMaterial: { case MaterialEditorContextObject::AddNewMaterial: {
if (!model()) if (!model())
break; break;
executeInTransaction("MaterialEditorView:handleToolBarAction", [&] { executeInTransaction(__FUNCTION__, [&] {
ModelNode matLib = materialLibraryNode(); ModelNode matLib = materialLibraryNode();
if (!matLib.isValid()) if (!matLib.isValid())
return; return;
@@ -455,7 +443,6 @@ void MaterialEditorView::handleToolBarAction(int action)
void MaterialEditorView::handlePreviewEnvChanged(const QString &envAndValue) void MaterialEditorView::handlePreviewEnvChanged(const QString &envAndValue)
{ {
Q_UNUSED(envAndValue);
if (envAndValue.isEmpty() || m_initializingPreviewData) if (envAndValue.isEmpty() || m_initializingPreviewData)
return; return;
@@ -518,7 +505,6 @@ void MaterialEditorView::handlePreviewEnvChanged(const QString &envAndValue)
void MaterialEditorView::handlePreviewModelChanged(const QString &modelStr) void MaterialEditorView::handlePreviewModelChanged(const QString &modelStr)
{ {
Q_UNUSED(modelStr);
if (modelStr.isEmpty() || m_initializingPreviewData) if (modelStr.isEmpty() || m_initializingPreviewData)
return; return;
@@ -613,7 +599,7 @@ void MaterialEditorView::setupQmlBackend()
void MaterialEditorView::commitVariantValueToModel(const PropertyName &propertyName, const QVariant &value) void MaterialEditorView::commitVariantValueToModel(const PropertyName &propertyName, const QVariant &value)
{ {
m_locked = true; m_locked = true;
executeInTransaction("MaterialEditorView:commitVariantValueToModel", [&] { executeInTransaction(__FUNCTION__, [&] {
QmlObjectNode(m_selectedMaterial).setVariantProperty(propertyName, value); QmlObjectNode(m_selectedMaterial).setVariantProperty(propertyName, value);
}); });
m_locked = false; m_locked = false;
@@ -641,7 +627,7 @@ void MaterialEditorView::commitAuxValueToModel(const PropertyName &propertyName,
void MaterialEditorView::removePropertyFromModel(const PropertyName &propertyName) void MaterialEditorView::removePropertyFromModel(const PropertyName &propertyName)
{ {
m_locked = true; m_locked = true;
executeInTransaction("MaterialEditorView:removePropertyFromModel", [&] { executeInTransaction(__FUNCTION__, [&] {
QmlObjectNode(m_selectedMaterial).removeProperty(propertyName); QmlObjectNode(m_selectedMaterial).removeProperty(propertyName);
}); });
m_locked = false; m_locked = false;
@@ -696,6 +682,7 @@ static Import entryToImport(const ItemLibraryEntry &entry)
{ {
if (entry.majorVersion() == -1 && entry.minorVersion() == -1) if (entry.majorVersion() == -1 && entry.minorVersion() == -1)
return Import::createFileImport(entry.requiredImport()); return Import::createFileImport(entry.requiredImport());
return Import::createLibraryImport(entry.requiredImport(), return Import::createLibraryImport(entry.requiredImport(),
QString::number(entry.majorVersion()) + QLatin1Char('.') + QString::number(entry.majorVersion()) + QLatin1Char('.') +
QString::number(entry.minorVersion())); QString::number(entry.minorVersion()));
@@ -933,6 +920,7 @@ void MaterialEditorView::currentStateChanged(const ModelNode &node)
{ {
QmlModelState newQmlModelState(node); QmlModelState newQmlModelState(node);
Q_ASSERT(newQmlModelState.isValid()); Q_ASSERT(newQmlModelState.isValid());
resetView(); resetView();
} }
@@ -1006,7 +994,7 @@ void MaterialEditorView::renameMaterial(ModelNode &material, const QString &newN
if (objName.isValid() && objName.toString() == newName) if (objName.isValid() && objName.toString() == newName)
return; return;
executeInTransaction("MaterialEditorView:renameMaterial", [&] { executeInTransaction(__FUNCTION__, [&] {
material.setIdWithRefactoring(model()->generateIdFromName(newName, "material")); material.setIdWithRefactoring(model()->generateIdFromName(newName, "material"));
VariantProperty objNameProp = material.variantProperty("objectName"); VariantProperty objNameProp = material.variantProperty("objectName");
@@ -1039,7 +1027,8 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material)
// set name and id // set name and id
QString newName = sourceMat.modelNode().variantProperty("objectName").value().toString() + " copy"; QString newName = sourceMat.modelNode().variantProperty("objectName").value().toString() + " copy";
duplicateMatNode.variantProperty("objectName").setValue(newName); VariantProperty objNameProp = duplicateMatNode.variantProperty("objectName");
objNameProp.setValue(newName);
duplicateMatNode.setIdWithoutRefactoring(model()->generateIdFromName(newName, "material")); duplicateMatNode.setIdWithoutRefactoring(model()->generateIdFromName(newName, "material"));
// sync properties. Only the base state is duplicated. // sync properties. Only the base state is duplicated.
@@ -1052,15 +1041,15 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material)
if (prop.isDynamic()) { if (prop.isDynamic()) {
dynamicProps.append(prop); dynamicProps.append(prop);
} else { } else {
duplicateMatNode.variantProperty(prop.name()) VariantProperty variantProp = duplicateMatNode.variantProperty(prop.name());
.setValue(prop.toVariantProperty().value()); variantProp.setValue(prop.toVariantProperty().value());
} }
} else if (prop.isBindingProperty()) { } else if (prop.isBindingProperty()) {
if (prop.isDynamic()) { if (prop.isDynamic()) {
dynamicProps.append(prop); dynamicProps.append(prop);
} else { } else {
duplicateMatNode.bindingProperty(prop.name()) BindingProperty bindingProp = duplicateMatNode.bindingProperty(prop.name());
.setExpression(prop.toBindingProperty().expression()); bindingProp.setExpression(prop.toBindingProperty().expression());
} }
} }
} }
@@ -1075,12 +1064,12 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material)
executeInTransaction(__FUNCTION__, [&] { executeInTransaction(__FUNCTION__, [&] {
for (const AbstractProperty &prop : std::as_const(dynamicProps)) { for (const AbstractProperty &prop : std::as_const(dynamicProps)) {
if (prop.isVariantProperty()) { if (prop.isVariantProperty()) {
duplicateMatNode.variantProperty(prop.name()) VariantProperty variantProp = duplicateMatNode.variantProperty(prop.name());
.setDynamicTypeNameAndValue(prop.dynamicTypeName(), variantProp.setDynamicTypeNameAndValue(prop.dynamicTypeName(),
prop.toVariantProperty().value()); prop.toVariantProperty().value());
} else if (prop.isBindingProperty()) { } else if (prop.isBindingProperty()) {
duplicateMatNode.bindingProperty(prop.name()) BindingProperty bindingProp = duplicateMatNode.bindingProperty(prop.name());
.setDynamicTypeNameAndExpression(prop.dynamicTypeName(), bindingProp.setDynamicTypeNameAndExpression(prop.dynamicTypeName(),
prop.toBindingProperty().expression()); prop.toBindingProperty().expression());
} }
} }
@@ -1149,9 +1138,9 @@ void MaterialEditorView::dragStarted(QMimeData *mimeData)
{ {
if (mimeData->hasFormat(Constants::MIME_TYPE_ASSETS)) { if (mimeData->hasFormat(Constants::MIME_TYPE_ASSETS)) {
const QString assetPath = QString::fromUtf8(mimeData->data(Constants::MIME_TYPE_ASSETS)).split(',')[0]; const QString assetPath = QString::fromUtf8(mimeData->data(Constants::MIME_TYPE_ASSETS)).split(',')[0];
QString assetType = AssetsLibraryWidget::getAssetTypeAndData(assetPath).first; Asset asset(assetPath);
if (assetType != Constants::MIME_TYPE_ASSET_IMAGE) // currently only image assets have dnd-supported properties if (!asset.isValidTextureSource()) // currently only image assets have dnd-supported properties
return; return;
highlightSupportedProperties(); highlightSupportedProperties();

View File

@@ -3,23 +3,22 @@
#pragma once #pragma once
#include <abstractview.h> #include "abstractview.h"
#include <itemlibraryinfo.h> #include "modelnode.h"
#include <QHash> #include <QHash>
#include <QPointer> #include <QPointer>
#include <QTimer> #include <QTimer>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QColorDialog;
class QShortcut; class QShortcut;
class QStackedWidget; class QStackedWidget;
class QTimer;
class QColorDialog;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace QmlDesigner { namespace QmlDesigner {
class ModelNode; class ItemLibraryInfo;
class MaterialEditorQmlBackend; class MaterialEditorQmlBackend;
namespace Internal { namespace Internal {