From 0f1696ffb27b1a4326ee2a86104e289ce776318d Mon Sep 17 00:00:00 2001 From: Simjees Abraham Date: Wed, 11 Apr 2012 11:21:28 +0200 Subject: [PATCH] Debugger: Fix bugs in inspection tool Incorrect display of hover and selection highlight for child items having rotation and a different transform origin corrected. Change-Id: Id25c5bf52b5c1abc3f98ac6bc90d89262cc4f2cd Reviewed-by: Kai Koehne Reviewed-by: Aurindam Jana --- .../qmltooling/qmldbg_qtquick2/inspecttool.cpp | 13 +++++- .../qmldbg_qtquick2/qquickviewinspector.cpp | 44 +++++++++++++++----- .../qmldbg_qtquick2/qquickviewinspector.h | 3 + 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp b/src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp index 67b1282..d39cf16 100644 --- a/src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp +++ b/src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp @@ -83,6 +83,7 @@ InspectTool::InspectTool(QQuickViewInspector *inspector, QQuickView *view) : m_pressAndHoldTimer.setInterval(Constants::PressAndHoldTimeout); connect(&m_pressAndHoldTimer, SIGNAL(timeout()), SLOT(zoomTo100())); enable(true); + inspector->addToUnselectableItems(m_hoverHighlight); } InspectTool::~InspectTool() @@ -128,16 +129,20 @@ void InspectTool::mouseReleaseEvent(QMouseEvent *event) { m_mousePosition = event->posF(); m_pressAndHoldTimer.stop(); - if (event->button() == Qt::LeftButton) + if (event->button() == Qt::LeftButton && !m_dragStarted) { selectItem(); + m_hoverHighlight->setVisible(false); + } } void InspectTool::mouseDoubleClickEvent(QMouseEvent *event) { m_mousePosition = event->posF(); m_pressAndHoldTimer.stop(); - if (event->button() == Qt::LeftButton) + if (event->button() == Qt::LeftButton) { selectNextItem(); + m_hoverHighlight->setVisible(false); + } } void InspectTool::mouseMoveEvent(QMouseEvent *event) @@ -154,6 +159,10 @@ void InspectTool::hoverMoveEvent(QMouseEvent *event) if (!item || item == m_lastClickedItem) { m_hoverHighlight->setVisible(false); } else { + if (item->parentItem()) + m_hoverHighlight->setParentItem(item->parentItem()); + else + m_hoverHighlight->setParentItem(inspector()->overlay()); m_hoverHighlight->setItem(item); m_hoverHighlight->setVisible(true); } diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp b/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp index 95ce866..756a63f 100644 --- a/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp +++ b/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp @@ -58,10 +58,11 @@ namespace QtQuick2 { /* * Collects all the items at the given position, from top to bottom. */ -static void collectItemsAt(QQuickItem *item, const QPointF &pos, QQuickItem *overlay, +static void collectItemsAt(QQuickItem *item, const QPointF &pos, + const QList &unselectableItems, QList &resultList) { - if (item == overlay) + if (unselectableItems.contains(item)) return; if (item->flags() & QQuickItem::ItemClipsChildrenToShape) { @@ -72,7 +73,7 @@ static void collectItemsAt(QQuickItem *item, const QPointF &pos, QQuickItem *ove QList children = QQuickItemPrivate::get(item)->paintOrderChildItems(); for (int i = children.count() - 1; i >= 0; --i) { QQuickItem *child = children.at(i); - collectItemsAt(child, item->mapToItem(child, pos), overlay, resultList); + collectItemsAt(child, item->mapToItem(child, pos), unselectableItems, resultList); } if (!QRectF(0, 0, item->width(), item->height()).contains(pos)) @@ -85,9 +86,10 @@ static void collectItemsAt(QQuickItem *item, const QPointF &pos, QQuickItem *ove * Returns the first visible item at the given position, or 0 when no such * child exists. */ -static QQuickItem *itemAt(QQuickItem *item, const QPointF &pos, QQuickItem *overlay) +static QQuickItem *itemAt(QQuickItem *item, const QPointF &pos, + const QList &unselectableItems) { - if (item == overlay) + if (unselectableItems.contains(item)) return 0; if (!item->isVisible() || item->opacity() == 0.0) @@ -101,7 +103,8 @@ static QQuickItem *itemAt(QQuickItem *item, const QPointF &pos, QQuickItem *over QList children = QQuickItemPrivate::get(item)->paintOrderChildItems(); for (int i = children.count() - 1; i >= 0; --i) { QQuickItem *child = children.at(i); - if (QQuickItem *betterCandidate = itemAt(child, item->mapToItem(child, pos), overlay)) + if (QQuickItem *betterCandidate = itemAt(child, item->mapToItem(child, pos), + unselectableItems)) return betterCandidate; } @@ -128,6 +131,7 @@ QQuickViewInspector::QQuickViewInspector(QQuickView *view, QObject *parent) : if (QQuickItem *root = view->rootItem()) m_overlay->setParentItem(root); + m_unselectableItems.append(m_overlay); view->installEventFilter(this); setCurrentTool(m_inspectTool); } @@ -171,6 +175,8 @@ void QQuickViewInspector::changeTool(InspectorProtocol::Tool tool) setCurrentTool(m_inspectTool); emit inspectToolActivated(); break; + default: + break; } } @@ -206,14 +212,15 @@ QQmlEngine *QQuickViewInspector::declarativeEngine() const QQuickItem *QQuickViewInspector::topVisibleItemAt(const QPointF &pos) const { QQuickItem *root = m_view->rootItem(); - return itemAt(root, root->mapFromScene(pos), m_overlay); + return itemAt(root, root->mapFromScene(pos), m_unselectableItems); } QList QQuickViewInspector::itemsAt(const QPointF &pos) const { QQuickItem *root = m_view->rootItem(); QList resultList; - collectItemsAt(root, root->mapFromScene(pos), m_overlay, resultList); + collectItemsAt(root, root->mapFromScene(pos), m_unselectableItems, + resultList); return resultList; } @@ -253,6 +260,7 @@ bool QQuickViewInspector::syncSelectedItems(const QList &items) selectionChanged = true; item.data()->disconnect(this); m_selectedItems.removeOne(item); + m_unselectableItems.removeOne(m_highlightItems.value(item.data())); delete m_highlightItems.take(item.data()); } @@ -264,7 +272,13 @@ bool QQuickViewInspector::syncSelectedItems(const QList &items) selectionChanged = true; connect(item, SIGNAL(destroyed(QObject*)), this, SLOT(removeFromSelectedItems(QObject*))); m_selectedItems.append(item); - m_highlightItems.insert(item, new SelectionHighlight(item, m_overlay)); + SelectionHighlight *selectionHighlightItem; + if (item->parentItem()) + selectionHighlightItem = new SelectionHighlight(item, item->parentItem()); + else + selectionHighlightItem = new SelectionHighlight(item, m_overlay); + m_unselectableItems.append(selectionHighlightItem); + m_highlightItems.insert(item, selectionHighlightItem); } return selectionChanged; @@ -273,8 +287,11 @@ bool QQuickViewInspector::syncSelectedItems(const QList &items) void QQuickViewInspector::removeFromSelectedItems(QObject *object) { if (QQuickItem *item = qobject_cast(object)) { - if (m_selectedItems.removeOne(item)) - delete m_highlightItems.take(item); + if (m_selectedItems.removeOne(item)) { + QQuickItem *highlightItem = m_highlightItems.take(item); + m_unselectableItems.removeOne(highlightItem); + delete highlightItem; + } } } @@ -320,5 +337,10 @@ QString QQuickViewInspector::titleForItem(QQuickItem *item) const return constructedName; } +void QQuickViewInspector::addToUnselectableItems(QQuickItem *item) +{ + m_unselectableItems.append(item); +} + } // namespace QtQuick2 } // namespace QmlJSDebugger diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h b/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h index 0fd2948..cc842d1 100644 --- a/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h +++ b/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h @@ -84,6 +84,8 @@ public: QString titleForItem(QQuickItem *item) const; + void addToUnselectableItems(QQuickItem *item); + protected: bool eventFilter(QObject *obj, QEvent *event); @@ -97,6 +99,7 @@ private: QQuickView *m_view; QQuickItem *m_overlay; + QList m_unselectableItems; InspectTool *m_inspectTool; -- 1.7.2.5