diff --git a/src/libs/utils/crumblepath.cpp b/src/libs/utils/crumblepath.cpp index fc938c0c78a..de5801217f1 100644 --- a/src/libs/utils/crumblepath.cpp +++ b/src/libs/utils/crumblepath.cpp @@ -37,11 +37,14 @@ #include #include #include +#include #include #include #include #include +#include + namespace Utils { static const int ArrowBorderSize = 12; @@ -82,6 +85,7 @@ private: QImage m_segmentSelectedEnd; QImage m_segmentHover; QImage m_segmentHoverEnd; + QImage m_triangleIcon; QPoint m_textPos; QVariant m_data; @@ -105,6 +109,7 @@ CrumblePathButton::CrumblePathButton(const QString &title, QWidget *parent) m_segmentEnd = QImage(":/utils/images/crumblepath-segment-end.png"); m_segmentSelectedEnd = QImage(":/utils/images/crumblepath-segment-selected-end.png"); m_segmentHoverEnd = QImage(":/utils/images/crumblepath-segment-hover-end.png"); + m_triangleIcon = QImage(":/utils/images/triangle_vert.png"); tintImages(); } @@ -141,6 +146,10 @@ void CrumblePathButton::paintEvent(QPaintEvent *) QString textToDraw = fm.elidedText(text(), Qt::ElideRight, geom.width() - m_textPos.x()); p.drawText(QRectF(m_textPos.x(), 4, geom.width(), geom.height()), textToDraw); + + if (menu()) { + p.drawImage(geom.width() - m_triangleIcon.width() - 6, geom.center().y() - m_triangleIcon.height()/2, m_triangleIcon); + } } void CrumblePathButton::tintImages() @@ -204,6 +213,8 @@ QVariant CrumblePathButton::data() const return m_data; } +/////////////////////////////////////////////////////////////////////////////// + struct CrumblePathPrivate { explicit CrumblePathPrivate(CrumblePath *q); @@ -261,7 +272,6 @@ void CrumblePath::pushElement(const QString &title, const QVariant data) CrumblePathButton *newButton = new CrumblePathButton(title, this); newButton->hide(); connect(newButton, SIGNAL(clicked()), SLOT(mapClickToIndex())); - connect(newButton, SIGNAL(customContextMenuRequested(QPoint)), SLOT(mapContextMenuRequestToIndex())); int segType = CrumblePathButton::MiddleSegment; if (!d->m_buttons.isEmpty()) { @@ -278,6 +288,23 @@ void CrumblePath::pushElement(const QString &title, const QVariant data) resizeButtons(); } +void CrumblePath::addChild(const QString &title, const QVariant data) +{ + QTC_ASSERT(d->m_buttons.count()>0,return); + + QPushButton *lastButton = d->m_buttons.last(); + + QMenu *childList = lastButton->menu(); + if (childList == 0) + childList = new QMenu(lastButton); + + QAction *childAction = new QAction(title, lastButton); + childAction->setData(data); + connect(childAction, SIGNAL(triggered()), this, SLOT(mapClickToIndex())); + childList->addAction(childAction); + lastButton->setMenu(childList); +} + void CrumblePath::popElement() { QWidget *last = d->m_buttons.last(); @@ -358,23 +385,12 @@ void CrumblePath::resizeButtons() void CrumblePath::mapClickToIndex() { QObject *element = sender(); - for (int i = 0; i < d->m_buttons.length(); ++i) { - if (d->m_buttons[i] == element) { - emit elementClicked(i); - return; + if (QString("QAction") == element->metaObject()->className()) { + emit elementClicked(static_cast(element)->data().toInt()); + } else + if (QString("QPushButton") == element->metaObject()->className()) { + emit elementClicked(static_cast(element)->data().toInt()); } - } -} - -void CrumblePath::mapContextMenuRequestToIndex() -{ - QObject *element = sender(); - for (int i = 0; i < d->m_buttons.length(); ++i) { - if (d->m_buttons[i] == element) { - emit elementContextMenuRequested(i); - return; - } - } } void CrumblePath::paintEvent(QPaintEvent *event) diff --git a/src/libs/utils/crumblepath.h b/src/libs/utils/crumblepath.h index 46b9652e6c2..0b1011e438d 100644 --- a/src/libs/utils/crumblepath.h +++ b/src/libs/utils/crumblepath.h @@ -56,12 +56,12 @@ public: public slots: void pushElement(const QString &title, const QVariant data = QVariant()); + void addChild(const QString &title, const QVariant data = QVariant()); void popElement(); void clear(); signals: - void elementClicked(int index); - void elementContextMenuRequested(int index); + void elementClicked(int debugId); protected: void resizeEvent(QResizeEvent *); @@ -69,7 +69,6 @@ protected: private slots: void mapClickToIndex(); - void mapContextMenuRequestToIndex(); private: void resizeButtons(); diff --git a/src/libs/utils/images/triangle_vert.png b/src/libs/utils/images/triangle_vert.png new file mode 100644 index 00000000000..50b14458a49 Binary files /dev/null and b/src/libs/utils/images/triangle_vert.png differ diff --git a/src/libs/utils/utils.qrc b/src/libs/utils/utils.qrc index 43fbbd1096b..52ec41382bf 100644 --- a/src/libs/utils/utils.qrc +++ b/src/libs/utils/utils.qrc @@ -8,5 +8,6 @@ images/crumblepath-segment-hover.png images/crumblepath-segment-selected-end.png images/crumblepath-segment-selected.png + images/triangle_vert.png diff --git a/src/plugins/qmljsinspector/qmljscontextcrumblepath.cpp b/src/plugins/qmljsinspector/qmljscontextcrumblepath.cpp index 6ebefda8820..1089b598375 100644 --- a/src/plugins/qmljsinspector/qmljscontextcrumblepath.cpp +++ b/src/plugins/qmljsinspector/qmljscontextcrumblepath.cpp @@ -56,19 +56,22 @@ void ContextCrumblePath::updateContextPath(const QStringList &path, const QList< clear(); - for (int i=0; i &childrenDebugIds) { - CrumblePath::selectIndex(index); + Q_ASSERT(childrenNames.count() == childrenDebugIds.count()); + for (int i=0; i &debugIds); - void selectIndex(int index); + void addChildren(const QStringList &childrenNames, const QList &childrenDebugIds); + private: bool m_isEmpty; }; diff --git a/src/plugins/qmljsinspector/qmljsinspector.cpp b/src/plugins/qmljsinspector/qmljsinspector.cpp index 6ac4b923024..0a1f92ea9f2 100644 --- a/src/plugins/qmljsinspector/qmljsinspector.cpp +++ b/src/plugins/qmljsinspector/qmljsinspector.cpp @@ -576,7 +576,9 @@ void InspectorUi::populateCrumblePath(const QDeclarativeDebugObjectReference &ob crumbleStrings.push_front( displayName(ref) ); } - int itemIndex = crumbleData.length()-1; + m_crumblePath->updateContextPath(crumbleStrings, crumbleData); + crumbleStrings.clear(); + crumbleData.clear(); // now append the children foreach (const QDeclarativeDebugObjectReference &child, objRef.children()) { @@ -584,8 +586,7 @@ void InspectorUi::populateCrumblePath(const QDeclarativeDebugObjectReference &ob crumbleStrings.push_back( displayName(child) ); } - m_crumblePath->updateContextPath(crumbleStrings, crumbleData); - m_crumblePath->selectIndex(itemIndex); + m_crumblePath->addChildren(crumbleStrings, crumbleData); } void InspectorUi::selectItems(const QList &objectIds) @@ -710,8 +711,9 @@ void InspectorUi::setupDockWidgets() wlay->setSpacing(0); observerWidget->setLayout(wlay); wlay->addWidget(m_toolBar->widget()); - wlay->addWidget(m_propertyInspector); wlay->addWidget(m_crumblePath); + wlay->addWidget(m_propertyInspector); + Debugger::DebuggerMainWindow *mw = Debugger::DebuggerPlugin::mainWindow(); QDockWidget *dock = mw->createDockWidget(Debugger::QmlLanguage, observerWidget); @@ -719,10 +721,10 @@ void InspectorUi::setupDockWidgets() dock->setTitleBarWidget(new QWidget(dock)); } -void InspectorUi::crumblePathElementClicked(int pathIndex) +void InspectorUi::crumblePathElementClicked(int debugId) { QList l; - l << m_crumblePath->debugIdForIndex(pathIndex); + l << debugId; selectItems(l); }