summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMahmoud Badri <mahmoud.badri@qt.io>2022-05-10 01:10:22 +0300
committerMahmoud Badri <mahmoud.badri@qt.io>2022-05-11 07:32:42 +0000
commitd4aa9eb0b7a89479673c35558e5d0d5fa1bc2620 (patch)
tree1c969315bb29a6139405799671f9ebe1631c748e
parent57a69d9d0bc6b930faf4955944ab4aaf11d459fd (diff)
downloadqt-creator-d4aa9eb0b7a89479673c35558e5d0d5fa1bc2620.tar.gz
QmlDesigner: Integrate drag and drop into the model/views system
so that any view can easily gets notified when a drag in another view is started/ended. This allows a view to show a highlight when a valid drag is started in another view without coupling the 2 views. Change-Id: I030d3dfe23ee06e2afdc0e4bbffc0b8d0c59f2f8 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Samuel Ghinet <samuel.ghinet@qt.io>
-rw-r--r--src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp30
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.cpp23
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.h3
-rw-r--r--src/plugins/qmldesigner/designercore/include/abstractview.h3
-rw-r--r--src/plugins/qmldesigner/designercore/include/model.h3
-rw-r--r--src/plugins/qmldesigner/designercore/model/abstractview.cpp3
-rw-r--r--src/plugins/qmldesigner/designercore/model/model.cpp27
-rw-r--r--src/plugins/qmldesigner/designercore/model/model_p.h3
8 files changed, 73 insertions, 22 deletions
diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
index 5f18557d88..9f6d33e934 100644
--- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
+++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp
@@ -40,7 +40,6 @@
#include "modelnodeoperations.h"
#include <metainfo.h>
#include <model.h>
-#include <navigatorwidget.h>
#include <rewritingexception.h>
#include <qmldesignerconstants.h>
#include <qmldesignerplugin.h>
@@ -89,6 +88,9 @@ static QString propertyEditorResourcesPath()
bool ItemLibraryWidget::eventFilter(QObject *obj, QEvent *event)
{
+ auto document = QmlDesignerPlugin::instance()->currentDesignDocument();
+ Model *model = document ? document->documentModel() : nullptr;
+
if (event->type() == QEvent::FocusOut) {
if (obj == m_itemsWidget.data())
QMetaObject::invokeMethod(m_itemsWidget->rootObject(), "closeContextMenu");
@@ -115,33 +117,19 @@ bool ItemLibraryWidget::eventFilter(QObject *obj, QEvent *event)
}
}
}
- QWidget *view = QmlDesignerPlugin::instance()->viewManager().widget("Navigator");
- if (view) {
- NavigatorWidget *navView = qobject_cast<NavigatorWidget *>(view);
- if (navView) {
- navView->setDragType(entry.typeName());
- navView->update();
- }
+
+ if (model) {
+ model->startDrag(m_itemLibraryModel->getMimeData(entry),
+ Utils::StyleHelper::dpiSpecificImageFile(entry.libraryEntryIconPath()));
}
- auto drag = new QDrag(this);
- drag->setPixmap(Utils::StyleHelper::dpiSpecificImageFile(entry.libraryEntryIconPath()));
- drag->setMimeData(m_itemLibraryModel->getMimeData(entry));
- drag->exec();
- drag->deleteLater();
m_itemToDrag = {};
}
}
} else if (event->type() == QMouseEvent::MouseButtonRelease) {
m_itemToDrag = {};
- QWidget *view = QmlDesignerPlugin::instance()->viewManager().widget("Navigator");
- if (view) {
- NavigatorWidget *navView = qobject_cast<NavigatorWidget *>(view);
- if (navView) {
- navView->setDragType("");
- navView->update();
- }
- }
+ if (model)
+ model->endDrag();
}
return QObject::eventFilter(obj, event);
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
index d9d713b5eb..8a368c3d2a 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
@@ -36,6 +36,7 @@
#include <bindingproperty.h>
#include <designmodecontext.h>
#include <designersettings.h>
+#include <itemlibraryinfo.h>
#include <nodeproperty.h>
#include <nodelistproperty.h>
#include <variantproperty.h>
@@ -57,8 +58,9 @@
#include <utils/stylehelper.h>
#include <QHeaderView>
-#include <QTimer>
+#include <QMimeData>
#include <QPixmap>
+#include <QTimer>
static inline void setScenePos(const QmlDesigner::ModelNode &modelNode,const QPointF &pos)
{
@@ -264,6 +266,25 @@ void NavigatorView::bindingPropertiesChanged(const QList<BindingProperty> & prop
}
}
+void NavigatorView::dragStarted(QMimeData *mimeData)
+{
+ if (mimeData->hasFormat("application/vnd.bauhaus.itemlibraryinfo")) {
+ QByteArray data = mimeData->data("application/vnd.bauhaus.itemlibraryinfo");
+ QDataStream stream(data);
+ ItemLibraryEntry itemLibraryEntry;
+ stream >> itemLibraryEntry;
+
+ m_widget->setDragType(itemLibraryEntry.typeName());
+ m_widget->update();
+ }
+}
+
+void NavigatorView::dragEnded()
+{
+ m_widget->setDragType("");
+ m_widget->update();
+}
+
void NavigatorView::customNotification(const AbstractView *view, const QString &identifier,
const QList<ModelNode> &nodeList, const QList<QVariant> &data)
{
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h
index a8a87c0082..ee29e7691a 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h
@@ -92,6 +92,9 @@ public:
void bindingPropertiesChanged(const QList<BindingProperty> &propertyList, PropertyChangeFlags) override;
+ void dragStarted(QMimeData *mimeData) override;
+ void dragEnded() override;
+
void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data) override;
void handleChangedExport(const ModelNode &modelNode, bool exported);
diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h
index b303a4fdef..e37ed0fb4b 100644
--- a/src/plugins/qmldesigner/designercore/include/abstractview.h
+++ b/src/plugins/qmldesigner/designercore/include/abstractview.h
@@ -254,6 +254,9 @@ public:
virtual void updateImport3DSupport(const QVariantMap &supportMap);
virtual void modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap);
+ virtual void dragStarted(QMimeData *mimeData);
+ virtual void dragEnded();
+
void changeRootNodeType(const TypeName &type, int majorVersion, int minorVersion);
NodeInstanceView *nodeInstanceView() const;
diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h
index 48700376b9..d46fbfe493 100644
--- a/src/plugins/qmldesigner/designercore/include/model.h
+++ b/src/plugins/qmldesigner/designercore/include/model.h
@@ -129,6 +129,9 @@ public:
QString generateNewId(const QString &prefixName) const;
QString generateNewId(const QString &prefixName, const QString &fallbackPrefix) const;
+ void startDrag(QMimeData *mimeData, const QString iconPath = {});
+ void endDrag();
+
protected:
Model();
diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
index 790b6ad5a5..3be9ae3a38 100644
--- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
@@ -398,6 +398,9 @@ void AbstractView::modelNodePreviewPixmapChanged(const ModelNode & /*node*/, con
{
}
+void AbstractView::dragStarted(QMimeData *mimeData) {}
+void AbstractView::dragEnded() {}
+
QList<ModelNode> AbstractView::toModelNodeList(const QList<Internal::InternalNode::Pointer> &nodeList) const
{
return QmlDesigner::toModelNodeList(nodeList, const_cast<AbstractView*>(this));
diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp
index 64a45e0a89..f4ca504cc5 100644
--- a/src/plugins/qmldesigner/designercore/model/model.cpp
+++ b/src/plugins/qmldesigner/designercore/model/model.cpp
@@ -67,6 +67,7 @@
#include <utils/algorithm.h>
+#include <QDrag>
#include <QRegularExpression>
/*!
@@ -588,6 +589,16 @@ void ModelPrivate::notifyImport3DSupportChanged(const QVariantMap &supportMap)
notifyInstanceChanges([&](AbstractView *view) { view->updateImport3DSupport(supportMap); });
}
+void ModelPrivate::notifyDragStarted(QMimeData *mimeData)
+{
+ notifyInstanceChanges([&](AbstractView *view) { view->dragStarted(mimeData); });
+}
+
+void ModelPrivate::notifyDragEnded()
+{
+ notifyInstanceChanges([&](AbstractView *view) { view->dragEnded(); });
+}
+
void ModelPrivate::notifyRewriterBeginTransaction()
{
notifyNodeInstanceViewLast([&](AbstractView *view) { view->rewriterBeginTransaction(); });
@@ -1492,6 +1503,22 @@ QString Model::generateNewId(const QString &prefixName, const QString &fallbackP
return newId;
}
+void Model::startDrag(QMimeData *mimeData, const QString iconPath)
+{
+ d->notifyDragStarted(mimeData);
+
+ auto drag = new QDrag(this);
+ drag->setPixmap(iconPath);
+ drag->setMimeData(mimeData);
+ drag->exec();
+ drag->deleteLater();
+}
+
+void Model::endDrag()
+{
+ d->notifyDragEnded();
+}
+
QString Model::generateNewId(const QString &prefixName) const
{
return generateNewId(prefixName, QStringLiteral("element"));
diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h
index 43a8585809..0959567053 100644
--- a/src/plugins/qmldesigner/designercore/model/model_p.h
+++ b/src/plugins/qmldesigner/designercore/model/model_p.h
@@ -183,6 +183,9 @@ public:
void notifyModelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap);
void notifyImport3DSupportChanged(const QVariantMap &supportMap);
+ void notifyDragStarted(QMimeData *mimeData);
+ void notifyDragEnded();
+
void setDocumentMessages(const QList<DocumentMessage> &errors, const QList<DocumentMessage> &warnings);
void notifyRewriterBeginTransaction();