diff options
author | Thorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com> | 2011-06-10 17:47:33 +0200 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com> | 2011-06-23 16:26:11 +0200 |
commit | a1cdeba0e16c487fdc479fcb3b2d0bd5a5493f1a (patch) | |
tree | d63cb4dc7f2c09a81dbd29bb9a62f02bb09a0ace /src/plugins | |
parent | f5e5eaf9effacc7b29e2c982452cfe8b765955d2 (diff) |
QmlInspector: Implemented context menu for SceneGraph
Change-Id: I467bdba42af0ff4b680c31a3545e059a56016a57
Diffstat (limited to 'src/plugins')
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; |