diff options
-rw-r--r-- | src/declarative/debugger/qmldebug.cpp | 2 | ||||
-rw-r--r-- | tools/qmldebugger/engine.cpp | 106 | ||||
-rw-r--r-- | tools/qmldebugger/engine.h | 5 |
3 files changed, 95 insertions, 18 deletions
diff --git a/src/declarative/debugger/qmldebug.cpp b/src/declarative/debugger/qmldebug.cpp index 7483fe2..de97cda 100644 --- a/src/declarative/debugger/qmldebug.cpp +++ b/src/declarative/debugger/qmldebug.cpp @@ -270,6 +270,7 @@ QmlDebugPropertyWatch *QmlEngineDebug::addWatch(const QmlDebugPropertyReference int queryId = d->getId(); watch->m_queryId = queryId; watch->m_objectDebugId = property.objectDebugId(); + watch->m_name = property.name(); d->watched.insert(queryId, watch); QByteArray message; @@ -297,6 +298,7 @@ QmlDebugObjectExpressionWatch *QmlEngineDebug::addWatch(const QmlDebugObjectRefe int queryId = d->getId(); watch->m_queryId = queryId; watch->m_objectDebugId = object.debugId(); + watch->m_expr = expr; d->watched.insert(queryId, watch); QByteArray message; diff --git a/tools/qmldebugger/engine.cpp b/tools/qmldebugger/engine.cpp index 5a1a01b..f17b779 100644 --- a/tools/qmldebugger/engine.cpp +++ b/tools/qmldebugger/engine.cpp @@ -20,6 +20,7 @@ QT_BEGIN_NAMESPACE + class QmlObjectTree : public QTreeWidget { Q_OBJECT @@ -101,11 +102,12 @@ public: WatchTableModel(QObject *parent = 0); void addWatch(QmlDebugWatch *watch, const QString &title); - QmlDebugWatch *removeWatch(QmlDebugWatch *watch); + void removeWatch(QmlDebugWatch *watch); void updateWatch(QmlDebugWatch *watch, const QVariant &value); - QmlDebugWatch *watchFromIndex(const QModelIndex &index) const; + QmlDebugWatch *findWatch(int column) const; + QmlDebugWatch *findWatch(int objectDebugId, const QString &property) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; @@ -120,6 +122,7 @@ private: { QString title; bool hasFirstValue; + QString property; QPointer<QmlDebugWatch> watch; }; @@ -140,23 +143,28 @@ WatchTableModel::WatchTableModel(QObject *parent) void WatchTableModel::addWatch(QmlDebugWatch *watch, const QString &title) { + QString property; + if (qobject_cast<QmlDebugPropertyWatch *>(watch)) + property = qobject_cast<QmlDebugPropertyWatch *>(watch)->name(); + int col = columnCount(QModelIndex()); beginInsertColumns(QModelIndex(), col, col); WatchedEntity e; e.title = title; e.hasFirstValue = false; + e.property = property; e.watch = watch; m_columns.append(e); endInsertColumns(); } -QmlDebugWatch *WatchTableModel::removeWatch(QmlDebugWatch *watch) +void WatchTableModel::removeWatch(QmlDebugWatch *watch) { int column = columnForWatch(watch); if (column == -1) - return 0; + return; WatchedEntity entity = m_columns.takeAt(column); @@ -171,8 +179,6 @@ QmlDebugWatch *WatchTableModel::removeWatch(QmlDebugWatch *watch) } reset(); - - return entity.watch; } void WatchTableModel::updateWatch(QmlDebugWatch *watch, const QVariant &value) @@ -189,10 +195,21 @@ void WatchTableModel::updateWatch(QmlDebugWatch *watch, const QVariant &value) } } -QmlDebugWatch *WatchTableModel::watchFromIndex(const QModelIndex &index) const +QmlDebugWatch *WatchTableModel::findWatch(int column) const { - if (index.isValid() && index.column() < m_columns.count()) - return m_columns.at(index.column()).watch; + if (column < m_columns.count()) + return m_columns.at(column).watch; + return 0; +} + +QmlDebugWatch *WatchTableModel::findWatch(int objectDebugId, const QString &property) const +{ + for (int i=0; i<m_columns.count(); i++) { + if (m_columns[i].watch->objectDebugId() == objectDebugId + && m_columns[i].property == property) { + return m_columns[i].watch; + } + } return 0; } @@ -278,6 +295,40 @@ void WatchTableModel::addValue(int column, const QVariant &value) } +class WatchTableView : public QTableView +{ + Q_OBJECT +public: + WatchTableView(QWidget *parent); + +signals: + void stopWatching(int column); + +protected: + void mousePressEvent(QMouseEvent *me); +}; + +WatchTableView::WatchTableView(QWidget *parent) + : QTableView(parent) +{ +} + +void WatchTableView::mousePressEvent(QMouseEvent *me) +{ + QTableView::mousePressEvent(me); + if (me->button() == Qt::RightButton && me->type() == QEvent::MouseButtonPress) { + int col = columnAt(me->x()); + if (col >= 0) { + QAction action(tr("Stop watching"), 0); + QList<QAction *> actions; + actions << &action; + if (QMenu::exec(actions, me->globalPos())) + emit stopWatching(col); + } + } +} + + class DebuggerEngineItem : public QObject { Q_OBJECT @@ -346,10 +397,12 @@ EnginePane::EnginePane(QmlDebugConnection *client, QWidget *parent) m_propTable->setHorizontalHeaderLabels(QStringList() << "name" << "value"); m_watchTableModel = new WatchTableModel(this); - m_watchTable = new QTableView(this); + m_watchTable = new WatchTableView(this); m_watchTable->setModel(m_watchTableModel); QObject::connect(m_watchTable, SIGNAL(activated(QModelIndex)), this, SLOT(watchedItemActivated(QModelIndex))); + QObject::connect(m_watchTable, SIGNAL(stopWatching(int)), + this, SLOT(stopWatching(int))); m_tabs = new QTabWidget(this); m_tabs->addTab(m_propTable, tr("Properties")); @@ -464,16 +517,14 @@ void EnginePane::propertyDoubleClicked(QTableWidgetItem *item) bool EnginePane::togglePropertyWatch(const QmlDebugObjectReference &object, const QmlDebugPropertyReference &property) { - QPair<int, QString> objProperty(object.debugId(), property.name()); - - if (m_watchedProps.contains(objProperty)) { - QmlDebugWatch *watch = m_watchedProps.take(objProperty); + QmlDebugWatch *watch = m_watchTableModel->findWatch(object.debugId(), property.name()); + if (watch) { m_watchTableModel->removeWatch(watch); + m_client.removeWatch(watch); delete watch; return false; } else { QmlDebugWatch *watch = m_client.addWatch(property, this); - m_watchedProps.insert(objProperty, watch); QObject::connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), this, SLOT(valueChanged(QByteArray,QVariant))); QString desc = property.name() @@ -487,9 +538,32 @@ bool EnginePane::togglePropertyWatch(const QmlDebugObjectReference &object, cons } } +void EnginePane::stopWatching(int column) +{ + QmlDebugWatch *watch = m_watchTableModel->findWatch(column); + if (watch) { + if (m_object && m_object->object().debugId() == watch->objectDebugId() + && qobject_cast<QmlDebugPropertyWatch *>(watch)) { + QString property = qobject_cast<QmlDebugPropertyWatch *>(watch)->name(); + QTableWidgetItem *item; + for (int row=0; row<m_propTable->rowCount(); row++) { + item = m_propTable->item(row, 0); + if (item->text() == property) { + item->setForeground(QBrush()); + break; + } + } + } + + m_watchTableModel->removeWatch(watch); + m_client.removeWatch(watch); + delete watch; + } +} + void EnginePane::watchedItemActivated(const QModelIndex &index) { - QmlDebugWatch *watch = m_watchTableModel->watchFromIndex(index); + QmlDebugWatch *watch = m_watchTableModel->findWatch(index.column()); if (!watch) return; QTreeWidgetItem *item = m_objTree->findItemByObjectId(watch->objectDebugId()); diff --git a/tools/qmldebugger/engine.h b/tools/qmldebugger/engine.h index b2c8221..899a21d 100644 --- a/tools/qmldebugger/engine.h +++ b/tools/qmldebugger/engine.h @@ -16,6 +16,7 @@ class QmlDebugWatch; class QmlObjectTree; class EngineClientPlugin; class WatchTableModel; +class WatchTableView; class QLineEdit; class QModelIndex; class QTreeWidget; @@ -52,6 +53,7 @@ private slots: void propertyDoubleClicked(QTableWidgetItem *); void watchedItemActivated(const QModelIndex &index); + void stopWatching(int column); private: void dump(const QmlDebugContextReference &, int); @@ -68,14 +70,13 @@ private: QmlObjectTree *m_objTree; QTabWidget *m_tabs; QTableWidget *m_propTable; - QTableView *m_watchTable; + WatchTableView *m_watchTable; QmlView *m_engineView; QList<QObject *> m_engineItems; QmlDebugWatch *m_watchedObject; WatchTableModel *m_watchTableModel; - QHash< QPair<int, QString>, QPointer<QmlDebugWatch> > m_watchedProps; }; QT_END_NAMESPACE |