summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMahmoud Badri <mahmoud.badri@qt.io>2022-06-27 14:31:59 +0300
committerMahmoud Badri <mahmoud.badri@qt.io>2022-06-29 10:32:03 +0000
commit234958a47a6edcd17bae255411a5b0f0bbaea6c7 (patch)
tree0a0a92ea46125545e032437267d7d7700918a71b
parentee40ed19e55a47dd109d1b7f4faf9a44ed97fc0f (diff)
downloadqt-creator-234958a47a6edcd17bae255411a5b0f0bbaea6c7.tar.gz
QmlDesigner: Enable drag-n-drop a material to a model in Navigator
Fixes: QDS-6694 Change-Id: I2fb32052559b1d459cc8025e9f30368b0189e8ab Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml7
-rw-r--r--src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp28
-rw-r--r--src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h4
-rw-r--r--src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp5
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp30
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatortreemodel.h1
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.cpp9
-rw-r--r--src/plugins/qmldesigner/qmldesignerconstants.h1
8 files changed, 83 insertions, 2 deletions
diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml
index 4eeb120b27..640383d4e1 100644
--- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml
+++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialItem.qml
@@ -72,9 +72,12 @@ Rectangle {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
- onClicked: (mouse) => {
+ onPressed: (mouse) => {
materialBrowserModel.selectMaterial(index)
- if (mouse.button === Qt.RightButton)
+
+ if (mouse.button === Qt.LeftButton)
+ rootView.startDragMaterial(index, mapToGlobal(mouse.x, mouse.y))
+ else if (mouse.button === Qt.RightButton)
root.showContextMenu()
}
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp
index 156add5d2d..3982d53454 100644
--- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp
+++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp
@@ -32,6 +32,7 @@
#include <designermcumanager.h>
#include <documentmanager.h>
#include <qmldesignerconstants.h>
+#include <qmldesignerplugin.h>
#include <utils/algorithm.h>
#include <utils/stylehelper.h>
@@ -103,6 +104,27 @@ bool MaterialBrowserWidget::eventFilter(QObject *obj, QEvent *event)
if (event->type() == QEvent::FocusOut) {
if (obj == m_quickWidget.data())
QMetaObject::invokeMethod(m_quickWidget->rootObject(), "closeContextMenu");
+ } else if (event->type() == QMouseEvent::MouseMove) {
+ DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument();
+ QTC_ASSERT(document, return false);
+ Model *model = document->currentModel();
+ QTC_ASSERT(model, return false);
+
+ if (m_materialToDrag.isValid()) {
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+ if ((me->globalPos() - m_dragStartPoint).manhattanLength() > 10) {
+ QByteArray data;
+ QMimeData *mimeData = new QMimeData;
+ QDataStream stream(&data, QIODevice::WriteOnly);
+ stream << m_materialToDrag.internalId();
+ mimeData->setData(Constants::MIME_TYPE_MATERIAL, data);
+ mimeData->removeFormat("text/plain");
+
+ model->startDrag(mimeData, m_previewImageProvider->requestPixmap(
+ QString::number(m_materialToDrag.internalId()), nullptr, {128, 128}));
+ m_materialToDrag = {};
+ }
+ }
}
return QObject::eventFilter(obj, event);
@@ -166,6 +188,12 @@ void MaterialBrowserWidget::handleSearchfilterChanged(const QString &filterText)
}
}
+void MaterialBrowserWidget::startDragMaterial(int index, const QPointF &mousePos)
+{
+ m_materialToDrag = m_materialBrowserModel->materialAt(index);
+ m_dragStartPoint = mousePos.toPoint();
+}
+
QString MaterialBrowserWidget::qmlSourcesPath()
{
#ifdef SHARE_QML_PATH
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h
index f5f737007e..30f9d05b50 100644
--- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h
+++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.h
@@ -69,6 +69,7 @@ public:
void updateMaterialPreview(const ModelNode &node, const QPixmap &pixmap);
Q_INVOKABLE void handleSearchfilterChanged(const QString &filterText);
+ Q_INVOKABLE void startDragMaterial(int index, const QPointF &mousePos);
QQuickWidget *quickWidget() const;
@@ -86,6 +87,9 @@ private:
PreviewImageProvider *m_previewImageProvider = nullptr;
QString m_filterText;
+
+ ModelNode m_materialToDrag;
+ QPoint m_dragStartPoint;
};
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp
index 00987711c5..178f79e18a 100644
--- a/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp
+++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp
@@ -56,6 +56,8 @@ ChooseFromPropertyListFilter::ChooseFromPropertyListFilter(const NodeMetaInfo &i
// ParticleAbstractShape3D
// -> ParticleEmitter3D
// -> Attractor3D
+ // Material
+ // -> Model
const TypeName textureType = "QtQuick3D.Texture";
if (insertInfo.isSubclassOf(textureType)) {
@@ -104,6 +106,9 @@ ChooseFromPropertyListFilter::ChooseFromPropertyListFilter(const NodeMetaInfo &i
if (parentInfo.isSubclassOf("QtQuick3D.Particles3D.ParticleEmitter3D")
|| parentInfo.isSubclassOf("QtQuick3D.Particles3D.Attractor3D"))
propertyList.append("shape");
+ } else if (insertInfo.isSubclassOf("QtQuick3D.Material")) {
+ if (parentInfo.isSubclassOf("QtQuick3D.Particles3D.Model"))
+ propertyList.append("materials");
}
}
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
index 38c32f65cd..d347854f00 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
@@ -464,6 +464,7 @@ QStringList NavigatorTreeModel::mimeTypes() const
{
const static QStringList types({Constants::MIME_TYPE_MODELNODE_LIST,
Constants::MIME_TYPE_ITEM_LIBRARY_INFO,
+ Constants::MIME_TYPE_MATERIAL,
Constants::MIME_TYPE_ASSETS});
return types;
@@ -559,6 +560,8 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *mimeData,
if (dropModelIndex.model() == this) {
if (mimeData->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO)) {
handleItemLibraryItemDrop(mimeData, rowNumber, dropModelIndex);
+ } else if (mimeData->hasFormat(Constants::MIME_TYPE_MATERIAL)) {
+ handleMaterialDrop(mimeData, rowNumber, dropModelIndex);
} else if (mimeData->hasFormat(Constants::MIME_TYPE_ASSETS)) {
const QStringList assetsPaths = QString::fromUtf8(mimeData->data(Constants::MIME_TYPE_ASSETS)).split(',');
NodeAbstractProperty targetProperty;
@@ -779,6 +782,33 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in
}
}
+void NavigatorTreeModel::handleMaterialDrop(const QMimeData *mimeData, int rowNumber, const QModelIndex &dropModelIndex)
+{
+ QTC_ASSERT(m_view, return);
+
+ const QModelIndex rowModelIndex = dropModelIndex.sibling(dropModelIndex.row(), 0);
+ int targetRowNumber = rowNumber;
+ NodeAbstractProperty targetProperty;
+
+ bool foundTarget = findTargetProperty(rowModelIndex, this, &targetProperty, &targetRowNumber, "materials");
+ if (!foundTarget)
+ return;
+
+ ModelNode targetNode = targetProperty.parentModelNode();
+ if (!targetNode.isSubclassOf("QtQuick3D.Model"))
+ return;
+
+ QByteArray data = mimeData->data(Constants::MIME_TYPE_MATERIAL);
+ QDataStream stream(data);
+ qint32 internalId;
+ stream >> internalId;
+ ModelNode matNode = m_view->modelNodeForInternalId(internalId);
+
+ m_view->executeInTransaction(__FUNCTION__, [&] {
+ m_view->assignMaterialTo3dModel(targetNode, matNode);
+ });
+}
+
ModelNode NavigatorTreeModel::handleItemLibraryImageDrop(const QString &imagePath,
NodeAbstractProperty targetProperty,
const QModelIndex &rowModelIndex,
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
index 9652981607..153491bfc1 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
@@ -115,6 +115,7 @@ private:
int targetIndex, bool executeInTransaction = true);
void handleInternalDrop(const QMimeData *mimeData, int rowNumber, const QModelIndex &dropModelIndex);
void handleItemLibraryItemDrop(const QMimeData *mimeData, int rowNumber, const QModelIndex &dropModelIndex);
+ void handleMaterialDrop(const QMimeData *mimeData, int rowNumber, const QModelIndex &dropModelIndex);
ModelNode handleItemLibraryImageDrop(const QString &imagePath, NodeAbstractProperty targetProperty,
const QModelIndex &rowModelIndex, bool &outMoveNodesAfter);
ModelNode handleItemLibraryFontDrop(const QString &fontFamily, NodeAbstractProperty targetProperty,
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
index 495982c6fc..f8d5c884fb 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
@@ -276,6 +276,15 @@ void NavigatorView::dragStarted(QMimeData *mimeData)
m_widget->setDragType(itemLibraryEntry.typeName());
m_widget->update();
+ } else if (mimeData->hasFormat(Constants::MIME_TYPE_MATERIAL)) {
+ QByteArray data = mimeData->data(Constants::MIME_TYPE_MATERIAL);
+ QDataStream stream(data);
+ qint32 internalId;
+ stream >> internalId;
+ ModelNode matNode = modelNodeForInternalId(internalId);
+
+ m_widget->setDragType(matNode.metaInfo().typeName());
+ m_widget->update();
}
}
diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h
index b2ed51cd87..486faeaa26 100644
--- a/src/plugins/qmldesigner/qmldesignerconstants.h
+++ b/src/plugins/qmldesigner/qmldesignerconstants.h
@@ -92,6 +92,7 @@ const char MATERIAL_LIB_ID[] = "__materialLibrary__";
const char MIME_TYPE_ITEM_LIBRARY_INFO[] = "application/vnd.qtdesignstudio.itemlibraryinfo";
const char MIME_TYPE_ASSETS[] = "application/vnd.qtdesignstudio.assets";
+const char MIME_TYPE_MATERIAL[] = "application/vnd.qtdesignstudio.material";
const char MIME_TYPE_ASSET_IMAGE[] = "application/vnd.qtdesignstudio.asset.image";
const char MIME_TYPE_ASSET_FONT[] = "application/vnd.qtdesignstudio.asset.font";
const char MIME_TYPE_ASSET_SHADER[] = "application/vnd.qtdesignstudio.asset.shader";