aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>2011-06-10 17:47:33 +0200
committerThorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>2011-06-23 16:26:11 +0200
commita1cdeba0e16c487fdc479fcb3b2d0bd5a5493f1a (patch)
treed63cb4dc7f2c09a81dbd29bb9a62f02bb09a0ace /src/plugins
parentf5e5eaf9effacc7b29e2c982452cfe8b765955d2 (diff)
QmlInspector: Implemented context menu for SceneGraph
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.cpp77
-rw-r--r--src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.h12
-rw-r--r--src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.cpp36
-rw-r--r--src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.h7
4 files changed, 116 insertions, 16 deletions
diff --git a/src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.cpp b/src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.cpp
index 2d911a88f7..7260933b5d 100644
--- a/src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.cpp
+++ b/src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.cpp
@@ -43,6 +43,7 @@
#include "sgviewinspector.h"
+#include <QtGui/QMenu>
#include <QtGui/QMouseEvent>
#include <QtDeclarative/QSGView>
#include <QtDeclarative/QSGItem>
@@ -58,6 +59,13 @@ public:
setZ(1); // hover highlight on top of selection indicator
}
+ void setItem(QSGItem *item)
+ {
+ setSize(QSizeF(item->width(), item->height()));
+ setPos(parentItem()->mapFromItem(item, QPointF()));
+ setVisible(true);
+ }
+
void paint(QPainter *painter)
{
painter->setPen(QPen(QColor(0, 22, 159)));
@@ -81,25 +89,70 @@ void SGSelectionTool::leaveEvent(QEvent *)
void SGSelectionTool::mousePressEvent(QMouseEvent *event)
{
- SGViewInspector *sgInspector = static_cast<SGViewInspector*>(inspector());
- QSGItem *item = sgInspector->topVisibleItemAt(event->pos());
- if (item)
- sgInspector->setSelectedItems(QList<QSGItem*>() << item);
+ if (event->button() == Qt::LeftButton) {
+ if (QSGItem *item = inspector()->topVisibleItemAt(event->pos()))
+ inspector()->setSelectedItems(QList<QSGItem*>() << item);
+ } else if (event->button() == Qt::RightButton) {
+ QList<QSGItem*> items = inspector()->itemsAt(event->pos());
+ createContextMenu(items, event->globalPos());
+ }
}
void SGSelectionTool::hoverMoveEvent(QMouseEvent *event)
{
- SGViewInspector *sgInspector = static_cast<SGViewInspector*>(inspector());
- QSGItem *item = sgInspector->topVisibleItemAt(event->pos());
- if (!item) {
+ QSGItem *item = inspector()->topVisibleItemAt(event->pos());
+ if (!item)
m_hoverHighlight->setVisible(false);
- return;
+ else
+ m_hoverHighlight->setItem(item);
+}
+
+void SGSelectionTool::createContextMenu(const QList<QSGItem *> &items, QPoint pos)
+{
+ QMenu contextMenu;
+ connect(&contextMenu, SIGNAL(hovered(QAction*)),
+ this, SLOT(contextMenuElementHovered(QAction*)));
+
+ const QList<QSGItem*> selectedItems = inspector()->selectedItems();
+ int shortcutKey = Qt::Key_1;
+
+ foreach (QSGItem *item, items) {
+ const QString title = inspector()->titleForItem(item);
+ QAction *elementAction = contextMenu.addAction(title);
+ elementAction->setData(QVariant::fromValue(item));
+
+ connect(elementAction, SIGNAL(triggered()), this, SLOT(contextMenuElementSelected()));
+
+ if (selectedItems.contains(item)) {
+ QFont font = elementAction->font();
+ font.setBold(true);
+ elementAction->setFont(font);
+ }
+
+ if (shortcutKey <= Qt::Key_9) {
+ elementAction->setShortcut(QKeySequence(shortcutKey));
+ shortcutKey++;
+ }
}
- QSGItem *root = sgInspector->view()->rootItem();
- m_hoverHighlight->setSize(QSizeF(item->width(), item->height()));
- m_hoverHighlight->setPos(root->mapFromItem(item->parentItem(), item->pos()));
- m_hoverHighlight->setVisible(true);
+ contextMenu.exec(pos);
+}
+
+void SGSelectionTool::contextMenuElementHovered(QAction *action)
+{
+ if (QSGItem *item = action->data().value<QSGItem*>())
+ m_hoverHighlight->setItem(item);
+}
+
+void SGSelectionTool::contextMenuElementSelected()
+{
+ if (QSGItem *item = static_cast<QAction*>(sender())->data().value<QSGItem*>())
+ inspector()->setSelectedItems(QList<QSGItem*>() << item);
+}
+
+SGViewInspector *SGSelectionTool::inspector() const
+{
+ return static_cast<SGViewInspector*>(AbstractTool::inspector());
}
} // namespace QmlJSDebugger
diff --git a/src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.h b/src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.h
index e76bd2062c..9f2171f572 100644
--- a/src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.h
+++ b/src/plugins/qmltooling/qmldbg_inspector/sgselectiontool.h
@@ -45,6 +45,10 @@
#include "abstracttool.h"
#include <QtCore/QList>
+#include <QtCore/QPoint>
+
+QT_FORWARD_DECLARE_CLASS(QAction)
+QT_FORWARD_DECLARE_CLASS(QSGItem)
namespace QmlJSDebugger {
@@ -70,7 +74,15 @@ public:
void keyPressEvent(QKeyEvent *) {}
void keyReleaseEvent(QKeyEvent *) {}
+private slots:
+ void contextMenuElementHovered(QAction *action);
+ void contextMenuElementSelected();
+
private:
+ void createContextMenu(const QList<QSGItem*> &items, QPoint pos);
+
+ SGViewInspector *inspector() const;
+
SGHoverHighlight *m_hoverHighlight;
};
diff --git a/src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.cpp b/src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.cpp
index fd9b29bcd5..b1d19182d7 100644
--- a/src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.cpp
+++ b/src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.cpp
@@ -58,6 +58,32 @@
namespace QmlJSDebugger {
/*
+ * Collects all the items at the given position, from top to bottom.
+ */
+static void collectItemsAt(QSGItem *item, const QPointF &pos, QSGItem *overlay,
+ QList<QSGItem *> &resultList)
+{
+ if (item == overlay)
+ return;
+
+ if (item->flags() & QSGItem::ItemClipsChildrenToShape) {
+ if (!QRectF(0, 0, item->width(), item->height()).contains(pos))
+ return;
+ }
+
+ QList<QSGItem *> children = QSGItemPrivate::get(item)->paintOrderChildItems();
+ for (int i = children.count() - 1; i >= 0; --i) {
+ QSGItem *child = children.at(i);
+ collectItemsAt(child, item->mapToItem(child, pos), overlay, resultList);
+ }
+
+ if (!QRectF(0, 0, item->width(), item->height()).contains(pos))
+ return;
+
+ resultList.append(item);
+}
+
+/*
* Returns the first visible item at the given position, or 0 when no such
* child exists.
*/
@@ -185,12 +211,20 @@ QWidget *SGViewInspector::viewWidget() const
return m_view;
}
-QSGItem *SGViewInspector::topVisibleItemAt(const QPointF &pos)
+QSGItem *SGViewInspector::topVisibleItemAt(const QPointF &pos) const
{
QSGItem *root = m_view->rootItem();
return itemAt(root, root->mapFromScene(pos), m_overlay);
}
+QList<QSGItem *> SGViewInspector::itemsAt(const QPointF &pos) const
+{
+ QSGItem *root = m_view->rootItem();
+ QList<QSGItem *> resultList;
+ collectItemsAt(root, root->mapFromScene(pos), m_overlay, resultList);
+ return resultList;
+}
+
QList<QSGItem*> SGViewInspector::selectedItems() const
{
QList<QSGItem *> selection;
diff --git a/src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.h b/src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.h
index 8cde72d793..d1f64994ea 100644
--- a/src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.h
+++ b/src/plugins/qmltooling/qmldbg_inspector/sgviewinspector.h
@@ -74,11 +74,14 @@ public:
QSGView *view() const { return m_view; }
QSGItem *overlay() const { return m_overlay; }
- QSGItem *topVisibleItemAt(const QPointF &pos);
+ QSGItem *topVisibleItemAt(const QPointF &pos) const;
+ QList<QSGItem *> itemsAt(const QPointF &pos) const;
QList<QSGItem *> selectedItems() const;
void setSelectedItems(const QList<QSGItem*> &items);
+ QString titleForItem(QSGItem *item) const;
+
protected:
bool eventFilter(QObject *obj, QEvent *event);
@@ -91,8 +94,6 @@ private slots:
private:
bool syncSelectedItems(const QList<QSGItem*> &items);
- QString titleForItem(QSGItem *item) const;
-
QSGView *m_view;
QSGItem *m_overlay;