Debugger: Fix bug in Inspect Tool
authorSimjees Abraham <simjees.abraham@nokia.com>
Fri, 13 Apr 2012 08:51:06 +0000 (10:51 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 13 Apr 2012 14:29:25 +0000 (16:29 +0200)
Changes made such that the reparenting of SelectionHighlight and
HoverHighlight is not done. Now the overlay remains the parent for
both.
Reparenting of SelectionHighlight and HoverHighlight created
issues when selection was done on QML lists. Even the highlight items
were getting added into the lists. This fixes the issue.

Change-Id: I116780408d62d2b3da0a17a92e11d6c4f63dd3dc
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
src/plugins/qmltooling/qmldbg_qtquick2/highlight.cpp
src/plugins/qmltooling/qmldbg_qtquick2/highlight.h
src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp
src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp
src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h

index 082f8e8..f82a520 100644 (file)
@@ -42,6 +42,7 @@
 #include "highlight.h"
 
 #include <QtGui/QPainter>
+#include <QtQuick/QQuickCanvas>
 
 namespace QmlJSDebugger {
 namespace QtQuick2 {
@@ -66,7 +67,17 @@ void Highlight::setItem(QQuickItem *item)
         connect(item, SIGNAL(transformOriginChanged(TransformOrigin)),
                 SLOT(adjust()));
     }
-
+    QQuickCanvas *view = item->canvas();
+    QQuickItem * rootItem = view->rootItem();
+    if (rootItem) {
+        connect(rootItem, SIGNAL(xChanged()), SLOT(adjust()));
+        connect(rootItem, SIGNAL(yChanged()), SLOT(adjust()));
+        connect(rootItem, SIGNAL(widthChanged()), SLOT(adjust()));
+        connect(rootItem, SIGNAL(heightChanged()), SLOT(adjust()));
+        connect(rootItem, SIGNAL(rotationChanged()), SLOT(adjust()));
+        connect(rootItem, SIGNAL(transformOriginChanged(TransformOrigin)),
+                SLOT(adjust()));
+    }
     m_item = item;
     adjust();
 }
@@ -74,34 +85,64 @@ void Highlight::setItem(QQuickItem *item)
 void Highlight::adjust()
 {
     const QQuickItem *item = m_item.data();
+    if (!item)
+        return;
+
+    bool success = false;
+    m_transform = item->itemTransform(0, &success);
+    if (!success)
+        m_transform = QTransform();
+
     setSize(QSizeF(item->width(), item->height()));
-    setPos(parentItem()->mapFromItem(item->parentItem(), item->pos()));
-    setRotation(item->rotation());
-    setTransformOrigin(item->transformOrigin());
+    qreal scaleFactor = 1;
+    QPointF originOffset = QPointF(0,0);
+    QQuickCanvas *view = item->canvas();
+    if (view->rootItem()) {
+        scaleFactor = view->rootItem()->scale();
+        originOffset -= view->rootItem()->pos();
+    }
+    // The scale transform for the overlay needs to be cancelled
+    // as the Item's transform which will be applied to the painter
+    // takes care of it.
+    parentItem()->setScale(1/scaleFactor);
+    setPos(originOffset);
+    setContentsSize(view->size());
+    update();
 }
 
 
 void HoverHighlight::paint(QPainter *painter)
 {
+    if (!item())
+        return;
+
+    painter->save();
+    painter->setTransform(transform());
     painter->setPen(QColor(108, 141, 221));
-    painter->drawRect(QRect(0, 0, width() - 1, height() - 1));
+    painter->drawRect(QRect(0, 0, item()->width() - 1, item()->height() - 1));
+    painter->restore();
 }
 
 
 void SelectionHighlight::paint(QPainter *painter)
 {
-    if (height() >= 10 && width() >= 10) {
-        QColor colorHighlight = Qt::green;
+    if (!item())
+        return;
 
-        painter->fillRect(QRectF(0, 0, width(), 5), colorHighlight);
-        painter->fillRect(QRectF(0, height()-5, width(), 5), colorHighlight);
-        painter->fillRect(QRectF(0, 5, 5, height() - 10), colorHighlight);
-        painter->fillRect(QRectF(width()-5, 5, 5, height() - 10), colorHighlight);
+    painter->save();
+    painter->setTransform(transform());
+    if (item()->height() >= 10 && item()->width() >= 10) {
+        QColor colorHighlight = Qt::green;
+        painter->fillRect(QRectF(0, 0, item()->width(), 5), colorHighlight);
+        painter->fillRect(QRectF(0, item()->height()-5, item()->width(), 5), colorHighlight);
+        painter->fillRect(QRectF(0, 5, 5, item()->height() - 10), colorHighlight);
+        painter->fillRect(QRectF(item()->width()-5, 5, 5, item()->height() - 10), colorHighlight);
     }
     painter->setPen(QPen(QColor(0, 22, 159)));
-    painter->drawRect(QRect(1, 1, width() - 3, height() - 3));
+    painter->drawRect(QRect(1, 1, item()->width() - 3, item()->height() - 3));
     painter->setPen(QColor(158, 199, 255));
-    painter->drawRect(QRect(0, 0, width() - 1, height() - 1));
+    painter->drawRect(QRect(0, 0, item()->width() - 1, item()->height() - 1));
+    painter->restore();
 }
 
 } // namespace QtQuick2
index 1b1f10c..1eb9757 100644 (file)
 #define HIGHLIGHT_H
 
 #include <QtCore/QWeakPointer>
+#include <QtGui/QTransform>
 #include <QtQuick/QQuickPaintedItem>
 
+
 namespace QmlJSDebugger {
 namespace QtQuick2 {
 
@@ -57,12 +59,17 @@ public:
     Highlight(QQuickItem *item, QQuickItem *parent);
 
     void setItem(QQuickItem *item);
+    QQuickItem *item() {return m_item.data();}
+
+protected:
+    QTransform transform() {return m_transform;}
 
 private slots:
     void adjust();
 
 private:
     QWeakPointer<QQuickItem> m_item;
+    QTransform m_transform;
 };
 
 /**
index d39cf16..a09d0ce 100644 (file)
@@ -83,7 +83,6 @@ 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()
@@ -159,10 +158,6 @@ 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 756a63f..9fd5954 100644 (file)
@@ -59,10 +59,9 @@ namespace QtQuick2 {
  * Collects all the items at the given position, from top to bottom.
  */
 static void collectItemsAt(QQuickItem *item, const QPointF &pos,
-                           const QList<QQuickItem *> &unselectableItems,
-                           QList<QQuickItem *> &resultList)
+                           QQuickItem *overlay, QList<QQuickItem *> &resultList)
 {
-    if (unselectableItems.contains(item))
+    if (item == overlay)
         return;
 
     if (item->flags() & QQuickItem::ItemClipsChildrenToShape) {
@@ -73,7 +72,7 @@ static void collectItemsAt(QQuickItem *item, const QPointF &pos,
     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), unselectableItems, resultList);
+        collectItemsAt(child, item->mapToItem(child, pos), overlay, resultList);
     }
 
     if (!QRectF(0, 0, item->width(), item->height()).contains(pos))
@@ -87,9 +86,9 @@ static void collectItemsAt(QQuickItem *item, const QPointF &pos,
  * child exists.
  */
 static QQuickItem *itemAt(QQuickItem *item, const QPointF &pos,
-                          const QList<QQuickItem *> &unselectableItems)
+                          QQuickItem *overlay)
 {
-    if (unselectableItems.contains(item))
+    if (item == overlay)
         return 0;
 
     if (!item->isVisible() || item->opacity() == 0.0)
@@ -104,7 +103,7 @@ static QQuickItem *itemAt(QQuickItem *item, const QPointF &pos,
     for (int i = children.count() - 1; i >= 0; --i) {
         QQuickItem *child = children.at(i);
         if (QQuickItem *betterCandidate = itemAt(child, item->mapToItem(child, pos),
-                                                 unselectableItems))
+                                                 overlay))
             return betterCandidate;
     }
 
@@ -131,7 +130,6 @@ 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);
 }
@@ -212,14 +210,14 @@ QQmlEngine *QQuickViewInspector::declarativeEngine() const
 QQuickItem *QQuickViewInspector::topVisibleItemAt(const QPointF &pos) const
 {
     QQuickItem *root = m_view->rootItem();
-    return itemAt(root, root->mapFromScene(pos), m_unselectableItems);
+    return itemAt(root, root->mapFromScene(pos), m_overlay);
 }
 
 QList<QQuickItem *> QQuickViewInspector::itemsAt(const QPointF &pos) const
 {
     QQuickItem *root = m_view->rootItem();
     QList<QQuickItem *> resultList;
-    collectItemsAt(root, root->mapFromScene(pos), m_unselectableItems,
+    collectItemsAt(root, root->mapFromScene(pos), m_overlay,
                    resultList);
     return resultList;
 }
@@ -260,7 +258,6 @@ 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());
     }
 
@@ -273,11 +270,7 @@ bool QQuickViewInspector::syncSelectedItems(const QList<QQuickItem *> &items)
         connect(item, SIGNAL(destroyed(QObject*)), this, SLOT(removeFromSelectedItems(QObject*)));
         m_selectedItems.append(item);
         SelectionHighlight *selectionHighlightItem;
-        if (item->parentItem())
-            selectionHighlightItem = new SelectionHighlight(item, item->parentItem());
-        else
-            selectionHighlightItem = new SelectionHighlight(item, m_overlay);
-        m_unselectableItems.append(selectionHighlightItem);
+        selectionHighlightItem = new SelectionHighlight(item, m_overlay);
         m_highlightItems.insert(item, selectionHighlightItem);
     }
 
@@ -287,11 +280,8 @@ bool QQuickViewInspector::syncSelectedItems(const QList<QQuickItem *> &items)
 void QQuickViewInspector::removeFromSelectedItems(QObject *object)
 {
     if (QQuickItem *item = qobject_cast<QQuickItem*>(object)) {
-        if (m_selectedItems.removeOne(item)) {
-            QQuickItem *highlightItem = m_highlightItems.take(item);
-            m_unselectableItems.removeOne(highlightItem);
-            delete highlightItem;
-        }
+        if (m_selectedItems.removeOne(item))
+            delete m_highlightItems.take(item);
     }
 }
 
@@ -337,10 +327,5 @@ QString QQuickViewInspector::titleForItem(QQuickItem *item) const
     return constructedName;
 }
 
-void QQuickViewInspector::addToUnselectableItems(QQuickItem *item)
-{
-    m_unselectableItems.append(item);
-}
-
 } // namespace QtQuick2
 } // namespace QmlJSDebugger
index cc842d1..0fd2948 100644 (file)
@@ -84,8 +84,6 @@ public:
 
     QString titleForItem(QQuickItem *item) const;
 
-    void addToUnselectableItems(QQuickItem *item);
-
 protected:
     bool eventFilter(QObject *obj, QEvent *event);
 
@@ -99,7 +97,6 @@ private:
 
     QQuickView *m_view;
     QQuickItem *m_overlay;
-    QList<QQuickItem *> m_unselectableItems;
 
     InspectTool *m_inspectTool;