#include "highlight.h"
+#include <QtCore/QTimer>
#include <QtGui/QPainter>
+#include <QtGui/QStaticText>
+#include <QtQuick/QQuickWindow>
namespace QmlJSDebugger {
namespace QtQuick2 {
+Highlight::Highlight(QQuickItem *parent) : QQuickPaintedItem(parent)
+{
+ initRenderDetails();
+}
+
Highlight::Highlight(QQuickItem *item, QQuickItem *parent)
: QQuickPaintedItem(parent)
{
+ initRenderDetails();
setItem(item);
}
+void Highlight::initRenderDetails()
+{
+ setRenderTarget(QQuickPaintedItem::FramebufferObject);
+ setPerformanceHint(QQuickPaintedItem::FastFBOResizing, true);
+}
+
void Highlight::setItem(QQuickItem *item)
{
if (m_item)
- m_item.data()->disconnect(this);
+ m_item->disconnect(this);
if (item) {
connect(item, SIGNAL(xChanged()), SLOT(adjust()));
connect(item, SIGNAL(transformOriginChanged(TransformOrigin)),
SLOT(adjust()));
}
-
+ QQuickWindow *view = item->window();
+ 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;
+ setContentsSize(view->size());
adjust();
}
void Highlight::adjust()
{
- const QQuickItem *item = m_item.data();
- setSize(QSizeF(item->width(), item->height()));
- setPos(parentItem()->mapFromItem(item->parentItem(), item->pos()));
- setRotation(item->rotation());
- setTransformOrigin(item->transformOrigin());
+ if (!m_item)
+ return;
+
+ bool success = false;
+ m_transform = m_item->itemTransform(0, &success);
+ if (!success)
+ m_transform = QTransform();
+
+ setSize(QSizeF(m_item->width(), m_item->height()));
+ qreal scaleFactor = 1;
+ QPointF originOffset = QPointF(0,0);
+ QQuickWindow *view = m_item->window();
+ 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);
+ update();
}
-void SelectionHighlight::paint(QPainter *painter)
+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 HoverHighlight::paint(QPainter *painter)
+SelectionHighlight::SelectionHighlight(const QString &name, QQuickItem *item, QQuickItem *parent)
+ : Highlight(item, parent),
+ m_name(name),
+ m_nameDisplayActive(false)
+{
+}
+
+void SelectionHighlight::paint(QPainter *painter)
+{
+ if (!item())
+ return;
+ painter->save();
+ painter->fillRect(QRectF(0,0,contentsSize().width(), contentsSize().height()),
+ QColor(0,0,0,127));
+ painter->setTransform(transform());
+ // Setting the composition mode such that the transparency will
+ // be erased as per the selected item.
+ painter->setCompositionMode(QPainter::CompositionMode_Clear);
+ painter->fillRect(0, 0, item()->width(), item()->height(), Qt::black);
+ painter->restore();
+
+ // Use the painter with the original transform and not with the
+ // item's transform for display of name.
+ if (!m_nameDisplayActive)
+ return;
+
+ // Paint the text in gray background if display name is active..
+ QRect textRect = painter->boundingRect(QRect(10, contentsSize().height() - 10 ,
+ contentsSize().width() - 20, contentsSize().height()),
+ Qt::AlignCenter | Qt::ElideRight, m_name);
+
+ qreal xPosition = m_displayPoint.x();
+ if (xPosition + textRect.width() > contentsSize().width())
+ xPosition = contentsSize().width() - textRect.width();
+ if (xPosition < 0) {
+ xPosition = 0;
+ textRect.setWidth(contentsSize().width());
+ }
+ qreal yPosition = m_displayPoint.y() - textRect.height() - 20;
+ if (yPosition < 50 )
+ yPosition = 50;
+
+ painter->fillRect(QRectF(xPosition - 5, yPosition - 5,
+ textRect.width() + 10, textRect.height() + 10), Qt::gray);
+ painter->drawRect(QRectF(xPosition - 5, yPosition - 5,
+ textRect.width() + 10, textRect.height() + 10));
+
+ painter->drawStaticText(xPosition, yPosition, QStaticText(m_name));
+}
+
+void SelectionHighlight::showName(const QPointF &displayPoint)
+{
+ m_displayPoint = displayPoint;
+ m_nameDisplayActive = true;
+ QTimer::singleShot(1500, this, SLOT(disableNameDisplay()));
+ update();
+}
+
+void SelectionHighlight::disableNameDisplay()
{
- painter->setPen(QPen(QColor(0, 22, 159)));
- painter->drawRect(QRect(1, 1, width() - 3, height() - 3));
- painter->setPen(QColor(158, 199, 255));
- painter->drawRect(QRect(0, 0, width() - 1, height() - 1));
+ m_nameDisplayActive = false;
+ update();
}
} // namespace QtQuick2