forked from qt-creator/qt-creator
QmlDesigner: Enable setting a material's diffuseMap by drag and drop
Dragging and dropping an image from the assets on a default material creates a texture and sets its source the the image and the applies the texture to the diffuseMap property of the material making it pretty straight forward to set a texture on a marerial. Additionally dropping an image on a texture updates the texture's source property instead of creating an image object. Task-number: QDS-1844 Change-Id: I6906851ad070e06a17b1ef7d4321e302bb305d29 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -551,20 +551,46 @@ void NavigatorTreeModel::handleItemLibraryImageDrop(const QMimeData *mimeData, i
|
|||||||
NodeAbstractProperty targetProperty;
|
NodeAbstractProperty targetProperty;
|
||||||
|
|
||||||
bool foundTarget = findTargetProperty(rowModelIndex, this, &targetProperty, &targetRowNumber);
|
bool foundTarget = findTargetProperty(rowModelIndex, this, &targetProperty, &targetRowNumber);
|
||||||
|
|
||||||
if (foundTarget) {
|
if (foundTarget) {
|
||||||
const QString imageFileName = QString::fromUtf8(mimeData->data("application/vnd.bauhaus.libraryresource"));
|
ModelNode targetNode(modelNodeForIndex(rowModelIndex));
|
||||||
const QmlItemNode newQmlItemNode = QmlItemNode::createQmlItemNodeFromImage(m_view, imageFileName, QPointF(), targetProperty);
|
|
||||||
|
|
||||||
if (newQmlItemNode.isValid()) {
|
const QString imageSource = QString::fromUtf8(mimeData->data("application/vnd.bauhaus.libraryresource")); // absolute path
|
||||||
QList<ModelNode> newModelNodeList;
|
const QString imageFileName = imageSource.mid(imageSource.lastIndexOf('/') + 1);
|
||||||
newModelNodeList.append(newQmlItemNode);
|
ModelNode newModelNode;
|
||||||
|
|
||||||
moveNodesInteractive(targetProperty, newModelNodeList, targetRowNumber);
|
if (targetNode.isSubclassOf("QtQuick3D.DefaultMaterial")) {
|
||||||
|
// if dropping an image on a default material, create a texture instead of image
|
||||||
|
m_view->executeInTransaction("QmlItemNode::createQmlItemNode", [&] {
|
||||||
|
// create a texture item lib
|
||||||
|
ItemLibraryEntry itemLibraryEntry;
|
||||||
|
itemLibraryEntry.setName("Texture");
|
||||||
|
itemLibraryEntry.setType("QtQuick3D.Texture", 1, 0);
|
||||||
|
|
||||||
|
// set texture source
|
||||||
|
PropertyName prop = "source";
|
||||||
|
QString type = "QUrl";
|
||||||
|
QVariant val = imageFileName;
|
||||||
|
itemLibraryEntry.addProperty(prop, type, val);
|
||||||
|
|
||||||
|
// create a texture
|
||||||
|
newModelNode = QmlItemNode::createQmlObjectNode(m_view, itemLibraryEntry, {}, targetProperty, false);
|
||||||
|
|
||||||
|
// set the texture to parent material's diffuseMap property
|
||||||
|
// TODO: allow the user to choose which map property to set the texture for
|
||||||
|
targetNode.bindingProperty("diffuseMap").setExpression(newModelNode.validId());
|
||||||
|
});
|
||||||
|
} else if (targetNode.isSubclassOf("QtQuick3D.Texture")) {
|
||||||
|
// if dropping an image on a texture, set the texture source
|
||||||
|
targetNode.variantProperty("source").setValue(imageFileName);
|
||||||
|
} else {
|
||||||
|
// create an image
|
||||||
|
newModelNode = QmlItemNode::createQmlItemNodeFromImage(m_view, imageSource , QPointF(), targetProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newQmlItemNode.isValid())
|
if (newModelNode.isValid()) {
|
||||||
m_view->selectModelNode(newQmlItemNode.modelNode());
|
moveNodesInteractive(targetProperty, {newModelNode}, targetRowNumber);
|
||||||
|
m_view->setSelectedModelNode(newModelNode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -94,13 +94,11 @@ public:
|
|||||||
const Position &position,
|
const Position &position,
|
||||||
QmlVisualNode parentQmlItemNode);
|
QmlVisualNode parentQmlItemNode);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
static QmlObjectNode createQmlObjectNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
const Position &position,
|
const Position &position,
|
||||||
NodeAbstractProperty parentproperty);
|
NodeAbstractProperty parentProperty,
|
||||||
|
bool createInTransaction = true);
|
||||||
|
|
||||||
static QmlVisualNode createQml3DNode(AbstractView *view,
|
static QmlVisualNode createQml3DNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
|
@@ -243,11 +243,12 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view,
|
|||||||
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
||||||
const ItemLibraryEntry &itemLibraryEntry,
|
const ItemLibraryEntry &itemLibraryEntry,
|
||||||
const Position &position,
|
const Position &position,
|
||||||
NodeAbstractProperty parentproperty)
|
NodeAbstractProperty parentProperty,
|
||||||
|
bool createInTransaction)
|
||||||
{
|
{
|
||||||
QmlObjectNode newQmlObjectNode;
|
QmlObjectNode newQmlObjectNode;
|
||||||
|
|
||||||
view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){
|
auto createNodeFunc = [=, &newQmlObjectNode, &parentProperty]() {
|
||||||
NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName());
|
NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName());
|
||||||
|
|
||||||
int minorVersion = metaInfo.minorVersion();
|
int minorVersion = metaInfo.minorVersion();
|
||||||
@@ -274,8 +275,8 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
|||||||
newQmlObjectNode = createQmlObjectNodeFromSource(view, itemLibraryEntry.qmlSource(), position);
|
newQmlObjectNode = createQmlObjectNodeFromSource(view, itemLibraryEntry.qmlSource(), position);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parentproperty.isValid())
|
if (parentProperty.isValid())
|
||||||
parentproperty.reparentHere(newQmlObjectNode);
|
parentProperty.reparentHere(newQmlObjectNode);
|
||||||
|
|
||||||
if (!newQmlObjectNode.isValid())
|
if (!newQmlObjectNode.isValid())
|
||||||
return;
|
return;
|
||||||
@@ -289,7 +290,12 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view,
|
|||||||
newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8());
|
newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8());
|
||||||
|
|
||||||
Q_ASSERT(newQmlObjectNode.isValid());
|
Q_ASSERT(newQmlObjectNode.isValid());
|
||||||
});
|
};
|
||||||
|
|
||||||
|
if (createInTransaction)
|
||||||
|
view->executeInTransaction("QmlItemNode::createQmlItemNode", createNodeFunc);
|
||||||
|
else
|
||||||
|
createNodeFunc();
|
||||||
|
|
||||||
Q_ASSERT(newQmlObjectNode.isValid());
|
Q_ASSERT(newQmlObjectNode.isValid());
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user