diff options
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 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 <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 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 <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; }; /** 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<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 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<QQuickItem *> m_unselectableItems; InspectTool *m_inspectTool; |