forked from qt-creator/qt-creator
QmlDesigner: Fix applying a bundle material to a multi-selection
Fixes: QDS-7830 Change-Id: Ic939b1e3b86e6931c369b1b06887284d0b23fa79 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Samuel Ghinet <samuel.ghinet@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
@@ -39,6 +39,7 @@
|
|||||||
#include <nodeinstanceview.h>
|
#include <nodeinstanceview.h>
|
||||||
#include <nodelistproperty.h>
|
#include <nodelistproperty.h>
|
||||||
#include <qmldesignerconstants.h>
|
#include <qmldesignerconstants.h>
|
||||||
|
#include <utils/algorithm.h>
|
||||||
|
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
@@ -145,10 +146,10 @@ WidgetInfo MaterialBrowserView::widgetInfo()
|
|||||||
|
|
||||||
connect(matBrowserBundleModel, &MaterialBrowserBundleModel::applyToSelectedTriggered, this,
|
connect(matBrowserBundleModel, &MaterialBrowserBundleModel::applyToSelectedTriggered, this,
|
||||||
[&] (BundleMaterial *bundleMat, bool add) {
|
[&] (BundleMaterial *bundleMat, bool add) {
|
||||||
if (!m_selectedModel.isValid())
|
if (m_selectedModels.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_bundleMaterialDropTarget = m_selectedModel;
|
m_bundleMaterialTargets = m_selectedModels;
|
||||||
m_bundleMaterialAddToSelected = add;
|
m_bundleMaterialAddToSelected = add;
|
||||||
|
|
||||||
ModelNode defaultMat = getBundleMaterialDefaultInstance(bundleMat->type());
|
ModelNode defaultMat = getBundleMaterialDefaultInstance(bundleMat->type());
|
||||||
@@ -201,40 +202,42 @@ void MaterialBrowserView::applyBundleMaterialToDropTarget(const ModelNode &bundl
|
|||||||
newMatNode = bundleMat;
|
newMatNode = bundleMat;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_bundleMaterialDropTarget.isValid()
|
// TODO: unify this logic as it exist elsewhere also
|
||||||
&& m_bundleMaterialDropTarget.isSubclassOf("QtQuick3D.Model")) {
|
auto expToList = [](const QString &exp) {
|
||||||
QmlObjectNode qmlObjNode(m_bundleMaterialDropTarget);
|
QString copy = exp;
|
||||||
if (m_bundleMaterialAddToSelected) {
|
copy = copy.remove("[").remove("]");
|
||||||
// TODO: unify this logic as it exist elsewhere also
|
|
||||||
auto expToList = [](const QString &exp) {
|
|
||||||
QString copy = exp;
|
|
||||||
copy = copy.remove("[").remove("]");
|
|
||||||
|
|
||||||
QStringList tmp = copy.split(',', Qt::SkipEmptyParts);
|
QStringList tmp = copy.split(',', Qt::SkipEmptyParts);
|
||||||
for (QString &str : tmp)
|
for (QString &str : tmp)
|
||||||
str = str.trimmed();
|
str = str.trimmed();
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto listToExp = [](QStringList &stringList) {
|
auto listToExp = [](QStringList &stringList) {
|
||||||
if (stringList.size() > 1)
|
if (stringList.size() > 1)
|
||||||
return QString("[" + stringList.join(",") + "]");
|
return QString("[" + stringList.join(",") + "]");
|
||||||
|
|
||||||
if (stringList.size() == 1)
|
if (stringList.size() == 1)
|
||||||
return stringList.first();
|
return stringList.first();
|
||||||
|
|
||||||
return QString();
|
return QString();
|
||||||
};
|
};
|
||||||
QStringList matList = expToList(qmlObjNode.expression("materials"));
|
|
||||||
matList.append(newMatNode.id());
|
for (const ModelNode &target : std::as_const(m_bundleMaterialTargets)) {
|
||||||
QString updatedExp = listToExp(matList);
|
if (target.isValid() && target.isSubclassOf("QtQuick3D.Model")) {
|
||||||
qmlObjNode.setBindingProperty("materials", updatedExp);
|
QmlObjectNode qmlObjNode(target);
|
||||||
} else {
|
if (m_bundleMaterialAddToSelected) {
|
||||||
qmlObjNode.setBindingProperty("materials", newMatNode.id());
|
QStringList matList = expToList(qmlObjNode.expression("materials"));
|
||||||
|
matList.append(newMatNode.id());
|
||||||
|
QString updatedExp = listToExp(matList);
|
||||||
|
qmlObjNode.setBindingProperty("materials", updatedExp);
|
||||||
|
} else {
|
||||||
|
qmlObjNode.setBindingProperty("materials", newMatNode.id());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_bundleMaterialDropTarget = {};
|
m_bundleMaterialTargets = {};
|
||||||
m_bundleMaterialAddToSelected = false;
|
m_bundleMaterialAddToSelected = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -301,24 +304,20 @@ void MaterialBrowserView::selectedNodesChanged(const QList<ModelNode> &selectedN
|
|||||||
{
|
{
|
||||||
Q_UNUSED(lastSelectedNodeList)
|
Q_UNUSED(lastSelectedNodeList)
|
||||||
|
|
||||||
m_selectedModel = {};
|
m_selectedModels = Utils::filtered(selectedNodeList, [](const ModelNode &node) {
|
||||||
|
return node.isSubclassOf("QtQuick3D.Model");
|
||||||
|
});
|
||||||
|
|
||||||
for (const ModelNode &node : selectedNodeList) {
|
m_widget->materialBrowserModel()->setHasModelSelection(!m_selectedModels.isEmpty());
|
||||||
if (node.isSubclassOf("QtQuick3D.Model")) {
|
|
||||||
m_selectedModel = node;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_widget->materialBrowserModel()->setHasModelSelection(m_selectedModel.isValid());
|
|
||||||
|
|
||||||
|
// the logic below selects the material of the first selected model if auto selection is on
|
||||||
if (!m_autoSelectModelMaterial)
|
if (!m_autoSelectModelMaterial)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (selectedNodeList.size() > 1 || !m_selectedModel.isValid())
|
if (selectedNodeList.size() > 1 || m_selectedModels.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QmlObjectNode qmlObjNode(m_selectedModel);
|
QmlObjectNode qmlObjNode(m_selectedModels.at(0));
|
||||||
QString matExp = qmlObjNode.expression("materials");
|
QString matExp = qmlObjNode.expression("materials");
|
||||||
if (matExp.isEmpty())
|
if (matExp.isEmpty())
|
||||||
return;
|
return;
|
||||||
@@ -478,7 +477,7 @@ void MaterialBrowserView::customNotification(const AbstractView *view, const QSt
|
|||||||
} else if (identifier == "delete_selected_material") {
|
} else if (identifier == "delete_selected_material") {
|
||||||
m_widget->materialBrowserModel()->deleteSelectedMaterial();
|
m_widget->materialBrowserModel()->deleteSelectedMaterial();
|
||||||
} else if (identifier == "drop_bundle_material") {
|
} else if (identifier == "drop_bundle_material") {
|
||||||
m_bundleMaterialDropTarget = nodeList.first();
|
m_bundleMaterialTargets = nodeList;
|
||||||
|
|
||||||
ModelNode defaultMat = getBundleMaterialDefaultInstance(m_draggedBundleMaterial->type());
|
ModelNode defaultMat = getBundleMaterialDefaultInstance(m_draggedBundleMaterial->type());
|
||||||
if (defaultMat.isValid())
|
if (defaultMat.isValid())
|
||||||
|
@@ -72,8 +72,8 @@ private:
|
|||||||
ModelNode getBundleMaterialDefaultInstance(const TypeName &type);
|
ModelNode getBundleMaterialDefaultInstance(const TypeName &type);
|
||||||
|
|
||||||
QPointer<MaterialBrowserWidget> m_widget;
|
QPointer<MaterialBrowserWidget> m_widget;
|
||||||
ModelNode m_bundleMaterialDropTarget;
|
QList<ModelNode> m_bundleMaterialTargets;
|
||||||
ModelNode m_selectedModel; // first selected 3D model node
|
QList<ModelNode> m_selectedModels; // selected 3D model nodes
|
||||||
BundleMaterial *m_draggedBundleMaterial = nullptr;
|
BundleMaterial *m_draggedBundleMaterial = nullptr;
|
||||||
bool m_bundleMaterialAddToSelected = false;
|
bool m_bundleMaterialAddToSelected = false;
|
||||||
bool m_hasQuick3DImport = false;
|
bool m_hasQuick3DImport = false;
|
||||||
|
Reference in New Issue
Block a user