From e078b11ecf20c5a4bb30fda4fadf5ce94572000c Mon Sep 17 00:00:00 2001 From: Simjees Abraham Date: Fri, 13 Apr 2012 10:51:06 +0200 Subject: [PATCH] Debugger: Fix bug in Inspect Tool 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 --- .../qmltooling/qmldbg_qtquick2/highlight.cpp | 67 +++++++++++++++++----- src/plugins/qmltooling/qmldbg_qtquick2/highlight.h | 7 +++ .../qmltooling/qmldbg_qtquick2/inspecttool.cpp | 5 -- .../qmldbg_qtquick2/qquickviewinspector.cpp | 37 ++++-------- .../qmldbg_qtquick2/qquickviewinspector.h | 3 - 5 files changed, 72 insertions(+), 47 deletions(-) diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/highlight.cpp b/src/plugins/qmltooling/qmldbg_qtquick2/highlight.cpp index 082f8e8..f82a520 100644 --- a/src/plugins/qmltooling/qmldbg_qtquick2/highlight.cpp +++ b/src/plugins/qmltooling/qmldbg_qtquick2/highlight.cpp @@ -42,6 +42,7 @@ #include "highlight.h" #include +#include 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 diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/highlight.h b/src/plugins/qmltooling/qmldbg_qtquick2/highlight.h index 1b1f10c..1eb9757 100644 --- a/src/plugins/qmltooling/qmldbg_qtquick2/highlight.h +++ b/src/plugins/qmltooling/qmldbg_qtquick2/highlight.h @@ -43,8 +43,10 @@ #define HIGHLIGHT_H #include +#include #include + 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 m_item; + QTransform m_transform; }; /** diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp b/src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp index d39cf16..a09d0ce 100644 --- a/src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp +++ b/src/plugins/qmltooling/qmldbg_qtquick2/inspecttool.cpp @@ -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); } diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp b/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp index 756a63f..9fd5954 100644 --- a/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp +++ b/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.cpp @@ -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 &unselectableItems, - QList &resultList) + QQuickItem *overlay, QList &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 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 &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 QQuickViewInspector::itemsAt(const QPointF &pos) const { QQuickItem *root = m_view->rootItem(); QList 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 &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 &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 &items) void QQuickViewInspector::removeFromSelectedItems(QObject *object) { if (QQuickItem *item = qobject_cast(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 diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h b/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h index cc842d1..0fd2948 100644 --- a/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h +++ b/src/plugins/qmltooling/qmldbg_qtquick2/qquickviewinspector.h @@ -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 m_unselectableItems; InspectTool *m_inspectTool; -- 2.7.4