diff options
author | Mahmoud Badri <mahmoud.badri@qt.io> | 2022-05-10 01:10:22 +0300 |
---|---|---|
committer | Mahmoud Badri <mahmoud.badri@qt.io> | 2022-05-11 07:32:42 +0000 |
commit | d4aa9eb0b7a89479673c35558e5d0d5fa1bc2620 (patch) | |
tree | 1c969315bb29a6139405799671f9ebe1631c748e | |
parent | 57a69d9d0bc6b930faf4955944ab4aaf11d459fd (diff) | |
download | qt-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>
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(); |