QQuickCanvas renames
[profile/ivi/qtdeclarative.git] / src / plugins / qmltooling / qmldbg_qtquick2 / highlight.cpp
index bb4048e..a8fcace 100644 (file)
 
 #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()));
@@ -66,34 +81,124 @@ void Highlight::setItem(QQuickItem *item)
         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