diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h index 03b891dfb2f..76b4b835426 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h @@ -90,6 +90,7 @@ public: bool isReferenceNodesVisible() const override; bool canBeReference(const ModelNode &modelNode) const override; + bool isReference(const QModelIndex &index) const; signals: void toolTipPixmapUpdated(const QString &id, const QPixmap &pixmap); @@ -118,7 +119,6 @@ private: QList referenceList(const QList &bindingProperties, const QList &unwanted = {}) const; QModelIndex createReferenceIndex(int row, int column, const ReferenceData &referenceData) const; void resetReferences(); - bool isReference(const QModelIndex &index) const; ModelNode referenceExtractCurrent(const QModelIndex &index) const; ModelNode referenceExtractOwner(const QModelIndex &index) const; diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp index 698ab88b800..53e597af44e 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.cpp @@ -5,6 +5,7 @@ #include +#include "modelnode.h" #include "navigatorview.h" #include "navigatortreemodel.h" #include "qproxystyle.h" @@ -259,20 +260,43 @@ bool NavigatorTreeView::viewportEvent(QEvent *event) void NavigatorTreeView::mousePressEvent(QMouseEvent *event) { - const QModelIndex modelIndex = indexAt(event->pos()); - if (static_cast(modelIndex.internalId()) < 0) { - m_dragAllowed = false; - return; // Ignore mousePressEvent when item is reference node. + m_clickedIndex = indexAt(event->pos()); + if (auto navModel = qobject_cast(model())) { + if (navModel->isReference(m_clickedIndex)) { + m_dragAllowed = false; + event->accept(); + return; + } } // Block drag from starting if press was on an item that is not draggable. // This is necessary as it is the selected items that are dragged and the pressed item may not // be a selected item, e.g. when pressing on locked item, leading to unexpected drags. - m_dragAllowed = model()->flags(modelIndex) & Qt::ItemIsDragEnabled; + m_dragAllowed = model()->flags(m_clickedIndex) & Qt::ItemIsDragEnabled; QTreeView::mousePressEvent(event); } +void NavigatorTreeView::mouseReleaseEvent(QMouseEvent *event) +{ + const QModelIndex modelIndex = indexAt(event->pos()); + if (m_clickedIndex == modelIndex) { + if (auto navModel = qobject_cast(model())) { + if (navModel->isReference(modelIndex)) { + ModelNode referencedNode = navModel->modelNodeForIndex(modelIndex); + if (referencedNode && !referencedNode.locked()) { + referencedNode.selectNode(); + event->accept(); + return; + } + } + } + } + m_clickedIndex = {}; + + QTreeView::mouseReleaseEvent(event); +} + void NavigatorTreeView::startDrag(Qt::DropActions supportedActions) { if (m_dragAllowed) { diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreeview.h b/src/plugins/qmldesigner/components/navigator/navigatortreeview.h index dfd2ad8f13e..034ee552a88 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreeview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatortreeview.h @@ -20,11 +20,13 @@ public: protected: void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; void startDrag(Qt::DropActions supportedActions) override; private: PreviewToolTip *m_previewToolTip = nullptr; qint32 m_previewToolTipNodeId = -1; bool m_dragAllowed = true; + QModelIndex m_clickedIndex; }; }