From e078b11ecf20c5a4bb30fda4fadf5ce94572000c Mon Sep 17 00:00:00 2001 From: Simjees Abraham Date: Fri, 13 Apr 2012 10:51:06 +0200 Subject: 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(-) (limited to 'src/plugins') diff --git a/src/plugins/qmltooling/qmldbg_qtquick2/highlight.cpp b/src/plugins/qmltooling/qmldbg_qtquick2/highlight.cpp index 082f8e8854..f82a5201f9 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 1b1f10c8bb..1eb97575fb 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 d39cf16843..a09d0ceade 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 756a63fa1e..9fd5954b90 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 cc842d1953..0fd2948279 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; -- cgit v1.2.3