Debugger: Fix bugs in inspection tool
authorSimjees Abraham <simjees.abraham@nokia.com>
Wed, 11 Apr 2012 09:21:28 +0000 (11:21 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 11 Apr 2012 23:39:43 +0000 (01:39 +0200)
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 <kai.koehne@nokia.com>
Reviewed-by: Aurindam Jana <aurindam.jana@nokia.com>
src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp
src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp
src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h

index 67b1282..d39cf16 100644 (file)
@@ -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);
     }
index 95ce866..756a63f 100644 (file)
@@ -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<QQuickItem *> &unselectableItems,
                            QList<QQuickItem *> &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<QQuickItem *> 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<QQuickItem *> &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<QQuickItem *> 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<QQuickItem *> QQuickViewInspector::itemsAt(const QPointF &pos) const
 {
     QQuickItem *root = m_view->rootItem();
     QList<QQuickItem *> 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<QQuickItem *> &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<QQuickItem *> &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<QQuickItem *> &items)
 void QQuickViewInspector::removeFromSelectedItems(QObject *object)
 {
     if (QQuickItem *item = qobject_cast<QQuickItem*>(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
index 0fd2948..cc842d1 100644 (file)
@@ -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<QQuickItem *> m_unselectableItems;
 
     InspectTool *m_inspectTool;